用量子神经网络实现GAN

P粉084495128
发布: 2025-07-31 17:22:44
原创
1037人浏览过
本文介绍量子-经典混合卷积神经网络(QCCNN),其继承CNN架构,以量子特征提取函数替代filter,可增强性能,易基于近期量子计算机实现,还能处理量子数据。同时展示了基于量桨的量子生成对抗网络实现,包括模型组网与训练,最后输出目标态和生成态的相关参数及距离、保真度。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

用量子神经网络实现gan - php中文网

问题描述

卷积神经网络在计算机视觉等领域取得了巨大成功,而量子计算机的飞速发展让科研人员看到了利用量子计算机加强经典机器学习能力的可能性。 目前一种前沿的方法是量子-经典混合卷积神经网络(QCCNN)架构,适用任意量子-经典混合函数的自动微分框架。QCCNN继承了CNN的基本框架,但把CNN中的关键步骤──特征提取函数filter替换为“量子特征提取函数 quantum filter”。比如对于n×n 的特征窗口,量子特征提取函数首先通过比特编码将其编码成一个量子态,然后通过参数化量子线路演化量子态,最后通过期望值测量输出一个实数。通过引入带参数的量子线路,增强卷积神经网络的性能。

用量子神经网络实现GAN - php中文网        

QCCNN具有以下3个重要特点:

1)相比于其他受CNN启发的量子机器学习方案,QCCNN最大限度地继承了CNN的架构,如非线性、多层架构,相比于同样架构的CNN,QCCNN的特征提取函数可以在更大的空间提取特征,因而原则上QCCNN可以达到更高的学习精度,这一点在文中通过一个小型数据集得到了数值验证;

2)由于CNN中的特征窗口尺寸通 常不大,如3×3到9×9,量子特征提取函数可以比较容易地基于近期量子计算机实现;

商汤商量
商汤商量

商汤科技研发的AI对话工具,商量商量,都能解决。

商汤商量36
查看详情 商汤商量

3)QCCNN没有量子计算机的输入输出问题。另外,QCCNN架构也可以使用量子数据作为输入,在这种情况下,QCCNN可以在计算能力上实现相对于经典计算机的“量子优势”。

假设已有的目标量子态是一个纯态,且生成器接受的输入为|0> 制备已有的目标量子态的线路用量子神经网络实现GAN - php中文网        

制备已有的目标量子态的线路

生成器的线路为

用量子神经网络实现GAN - php中文网        

判别器的线路为

用量子神经网络实现GAN - php中文网        

通过对判别器输出的量子态进行测量,我们可以得到将目标态判断为目标态的概率 PT和将生成态判断为目标态的概率 PG(通过对判别器连接目标态和生成器这两个不同的输入得到

安装量桨

In [ ]
!pip install paddle_quantum
登录后复制
   

导入相关的包

In [ ]
import numpy as npimport paddlefrom paddle_quantum.circuit import UAnsatzfrom paddle_quantum.utils import partial_trace, dagger, state_fidelityfrom tqdm import tqdm
登录后复制
   

模型组网

In [ ]
class QGAN(paddle.nn.Layer):
    def __init__(self):
        super(QGAN, self).__init__()        
        # 用以制备目标量子态的角度
        target_omega_0 = 0.9 * np.pi
        target_omega_1 = 0.2 * np.pi
        self.target_omega = paddle.to_tensor(
            np.array([target_omega_0, target_omega_1], np.float64))        
        # 生成器和判别器电路的参数
        self.gen_theta = self.create_parameter([9], 
        dtype="float64", default_initializer=paddle.nn.initializer.Uniform(
                            low=0.0, high=np.pi))
        self.disc_phi = self.create_parameter([9], 
        dtype="float64", default_initializer=paddle.nn.initializer.Uniform(
                            low=0.0, high=np.pi))        
        # 制备目标量子态
        cir = UAnsatz(3)
        cir.ry(self.target_omega[0], 0)
        cir.rz(self.target_omega[1], 0)
        self.target_state = cir.run_state_vector()    def generator(self, theta):
        """
        生成器的量子线路
        """
        cir = UAnsatz(3)
        cir.u3(*theta[:3], 0)
        cir.u3(*theta[3:6], 1)
        cir.cnot([0, 1])
        cir.u3(*theta[6:], 0)        return cir    def discriminator(self, phi):
        """
        判别器的量子线路
        """
        cir = UAnsatz(3)
        cir.u3(*phi[:3], 0)
        cir.u3(*phi[3:6], 2)
        cir.cnot([0, 2])
        cir.u3(*phi[6:], 0)        return cir    def disc_target_as_target(self):
        """
        判别器将目标态判断为目标态的概率
        """
        # 判别器电路
        cir = self.discriminator(self.disc_phi)
        cir.run_state_vector(self.target_state)        
        # 判别器对目标态的判断结果
        target_disc_output = cir.expecval([[1.0, 'z2']])
        prob_as_target = (target_disc_output + 1) / 2

        return prob_as_target    def disc_gen_as_target(self):
        """
        判别器将生成态判断为目标态的概率
        """
        # 得到生成器生成的量子态
        gen_state = self.generator(
                    self.gen_theta).run_state_vector()        # 判别器电路
        cir = self.discriminator(self.disc_phi)
        cir.run_state_vector(gen_state)        # 判别器对生成态的判断结果
        gen_disc_output = cir.expecval([[1.0, 'z2']])
        prob_as_target = (gen_disc_output + 1) / 2
        
        return prob_as_target    def forward(self, model_name):
        if model_name == 'gen':            # 计算生成器的损失函数,loss值的区间为[-1, 0],
            # 0表示生成效果极差,为-1表示生成效果极好
            loss =  -1 * self.disc_gen_as_target()        else:            # 计算判别器的损失函数,loss值的区间为[-1, 1],
            # 为-1表示完美区分,为0表示无法区分,为1表示区分颠倒
            loss = self.disc_gen_as_target() - self.disc_target_as_target()        return loss    def get_target_state(self):
        """
        得到目标态的密度矩阵表示
        """
        state = self.target_state
        state = paddle.reshape(state, [1] + state.shape)
        density_matrix = paddle.matmul(dagger(state), state)
        state = partial_trace(density_matrix, 2, 4, 2)        return state.numpy()    def get_generated_state(self):
        """
        得到生成态的密度矩阵表示
        """
        state = self.generator(self.gen_theta).run_state_vector()
        state = paddle.reshape(state, [1] + state.shape)
        density_matrix = paddle.matmul(dagger(state), state)
        state = partial_trace(density_matrix, 2, 4, 2)        return state.numpy()
登录后复制
   

训练模型

In [ ]
# 学习率LR = 0.03# 总的迭代次数ITR = 30# 每次迭代时,判别器的迭代次数ITR1 = 20# 每次迭代时,生成器的迭代次数ITR2 = 50# 用来记录loss值的变化loss_history = list()
paddle.seed(18)
gan_demo = QGAN()
optimizer = paddle.optimizer.SGD(learning_rate=LR, parameters=gan_demo.parameters())
pbar = tqdm(desc="Training: ", total=ITR * (ITR1 + ITR2), ncols=100, ascii=True)for itr0 in range(ITR):    # 记录判别器loss值的变化
    loss_disc_history = list()    # 训练判别器
    for itr1 in range(ITR1):
        pbar.update(1)
        loss_disc = gan_demo('disc')
        loss_disc.backward()
        optimizer.minimize(loss_disc, parameters=[gan_demo.disc_phi],
                           no_grad_set=[gan_demo.gen_theta])
        gan_demo.clear_gradients()
        loss_disc_history.append(loss_disc.numpy()[0])    # 记录生成器loss值的变化
    loss_gen_history = list()    # 训练生成器
    for itr2 in range(ITR2):
        pbar.update(1)
        loss_gen = gan_demo('gen')
        loss_gen.backward()
        optimizer.minimize(loss_gen, parameters=[gan_demo.gen_theta],
                           no_grad_set=[gan_demo.disc_phi])
        optimizer.clear_grad()
        loss_gen_history.append(loss_gen.numpy()[0])

    loss_history.append((loss_disc_history, loss_gen_history))
pbar.close()# 得到目标量子态target_state = gan_demo.get_target_state()# 得到生成器最终生成的量子态gen_state = gan_demo.get_generated_state()print("the density matrix of the target state:")print(target_state, "\n")print("the density matrix of the generated state:")print(gen_state, "\n")# 计算两个量子态之间的距离,# 这里的距离定义为 tr[(target_state-gen_state)^2]distance = np.trace(np.matmul(target_state-gen_state, 
                              target_state-gen_state)).real# 计算两个量子态的保真度fidelity = state_fidelity(target_state, gen_state)print("the distance between these two quantum states is", distance, "\n")print("the fidelity between these two quantum states is", fidelity)
登录后复制
   

以上就是用量子神经网络实现GAN的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号