IBM Qiskit量子机器学习速成(六)

量子卷积神经网络

卷积和池化:卷积神经网络的必备成分

卷积神经网络被广泛应用于图像和音频的识别当中,关键在于“卷积”操作赋予神经网络统筹学习数据的能力。

执行卷积操作需要输入数据与卷积核,卷积核首先与输入数据左上角对齐,随后逐个计算对应位置处两个数字之积。当对卷积核中所有的元素均执行该乘积操作后,将结果全部加起来作为新的输出。在下图中,我们可以看到卷积核最多只能输出9个数据(就像游戏2048一样)。

在这里插入图片描述

下面的动态图能更直观的展现这一过程

在这里插入图片描述

每一次池化操作都需要输入数据和池化核,池化核会根据某一要求挑选出符合条件的元素作为代表。

在这里插入图片描述

如果我们执行最大池化,那么池化核会首先与输入数据左上角对齐,挑选出范围内最大的元素作为输出。如果我们执行平均池化,那么池化核会首先与输入数据左上角对齐,挑选出范围内所有元素的平均值作为输出。

一般而言,一个卷积神经网络会间隔包含卷积层和池化层,多次重复后,再加上一个全连接层(Fully Connected),就能得到最终数据了。我们一般使用经过卷积神经网络处理后的图片或音频进行机器学习,这样学习的参数更少,速度更快,同时保留了原先数据的特点。

在这里插入图片描述

量子卷积与量子池化

在量子电路中,我们不能随心所欲的创建和使用数据。在经典卷积神经网络中,输出和输入或许是分离存储的,但是在量子电路中,我们只能一直使用若干条量子电路,不能在执行过程中将其切开。

在这里插入图片描述

根据相关论文结果,量子中的卷积操作如下

在这里插入图片描述

最一般的量子卷积包含了15个参数,但是过多的参数会严重延长训练时间,出于教学目的,我们使用这一简化的卷积操作。

根据相关论文结果,量子中的池化操作如下

在这里插入图片描述

我们像经典池化操作一样抛弃一些数据,这里我们抛弃位于上方的量子比特,保留下方的量子比特。

使用Qiskit将卷积和池化写成代码形式

def conv_circuit(params):target = QuantumCircuit(2)target.rz(-np.pi / 2, 1)target.cx(1, 0)target.rz(params[0], 0)target.ry(params[1], 1)target.cx(0, 1)target.ry(params[2], 1)target.cx(1, 0)target.rz(np.pi / 2, 0)return target
def pool_circuit(params):target = QuantumCircuit(2)target.rz(-np.pi / 2, 1)target.cx(1, 0)target.rz(params[0], 0)target.ry(params[1], 1)target.cx(0, 1)target.ry(params[2], 1)return target

而在一个大型量子电路中,我们不能只在某两个量子比特上使用卷积和池化,所以我们需要编写一套适用于大型量子电路的卷积和池化函数

def conv_layer(num_qubits, param_prefix):qc = QuantumCircuit(num_qubits, name="Convolutional Layer")qubits = list(range(num_qubits))param_index = 0params = ParameterVector(param_prefix, length=num_qubits * 3)for q1, q2 in zip(qubits[0::2], qubits[1::2]):qc = qc.compose(conv_circuit(params[param_index : (param_index + 3)]), [q1, q2])qc.barrier()param_index += 3for q1, q2 in zip(qubits[1::2], qubits[2::2] + [0]):qc = qc.compose(conv_circuit(params[param_index : (param_index + 3)]), [q1, q2])qc.barrier()param_index += 3qc_inst = qc.to_instruction()qc = QuantumCircuit(num_qubits)qc.append(qc_inst, qubits)return qc

对于四个量子比特的电路,结果 如下

在这里插入图片描述

容易看出该函数的意义即对电路中任意两个不同量子比特施加卷积操作。

同样地,我们也可以定义适用于大型量子电路的池化函数

def pool_layer(sources, sinks, param_prefix):num_qubits = len(sources) + len(sinks)qc = QuantumCircuit(num_qubits, name="Pooling Layer")param_index = 0params = ParameterVector(param_prefix, length=num_qubits // 2 * 3)for source, sink in zip(sources, sinks):qc = qc.compose(pool_circuit(params[param_index : (param_index + 3)]), [source, sink])qc.barrier()param_index += 3qc_inst = qc.to_instruction()qc = QuantumCircuit(num_qubits)qc.append(qc_inst, range(num_qubits))return qc

在这里插入图片描述

可以看出,池化操作先把整个电路分成若干个量子比特对,对与对之间相互不干扰,每个对内再执行池化操作。

实战演练:水平线与竖直线的分类

首先我们导入本次用到的所有库

import json
import matplotlib.pyplot as plt
import numpy as np
from IPython.display import clear_output
from qiskit import QuantumCircuit
from qiskit.circuit import ParameterVector
from qiskit.circuit.library import ZFeatureMap
from qiskit.quantum_info import SparsePauliOp
from qiskit_algorithms.optimizers import COBYLA
from qiskit_algorithms.utils import algorithm_globals
from qiskit_machine_learning.algorithms.classifiers import NeuralNetworkClassifier
from qiskit_machine_learning.neural_networks import EstimatorQNN
from sklearn.model_selection import train_test_splitalgorithm_globals.random_seed = 12345

进一步,手动生成数据。我们会编写函数生成大量包含水平线或竖直线的图片。

def generate_dataset(num_images):images = []labels = []hor_array = np.zeros((6, 8))ver_array = np.zeros((4, 8))j = 0for i in range(0, 7):if i != 3:hor_array[j][i] = np.pi / 2hor_array[j][i + 1] = np.pi / 2j += 1j = 0for i in range(0, 4):ver_array[j][i] = np.pi / 2ver_array[j][i + 4] = np.pi / 2j += 1for n in range(num_images):rng = algorithm_globals.random.integers(0, 2)if rng == 0:labels.append(-1)random_image = algorithm_globals.random.integers(0, 6)images.append(np.array(hor_array[random_image]))elif rng == 1:labels.append(1)random_image = algorithm_globals.random.integers(0, 4)images.append(np.array(ver_array[random_image]))# Create noisefor i in range(8):if images[-1][i] == 0:images[-1][i] = algorithm_globals.random.uniform(0, np.pi / 4)return images, labels

进行训练集和测试集分割

images, labels = generate_dataset(50)train_images, test_images, train_labels, test_labels = train_test_split(images, labels, test_size=0.3
)

为了将经典数据编码到量子电路中,我们还是需要一个特征映射。这里我们使用ZFeatureMao而不是ZZFeatureMap。

feature_map = ZFeatureMap(8)
feature_map.decompose().draw("mpl")

组合卷积层和池化层,创建量子卷积神经网络

feature_map = ZFeatureMap(8)ansatz = QuantumCircuit(8, name="Ansatz")# First Convolutional Layer
ansatz.compose(conv_layer(8, "с1"), list(range(8)), inplace=True)# First Pooling Layer
ansatz.compose(pool_layer([0, 1, 2, 3], [4, 5, 6, 7], "p1"), list(range(8)), inplace=True)# Second Convolutional Layer
ansatz.compose(conv_layer(4, "c2"), list(range(4, 8)), inplace=True)# Second Pooling Layer
ansatz.compose(pool_layer([0, 1], [2, 3], "p2"), list(range(4, 8)), inplace=True)# Third Convolutional Layer
ansatz.compose(conv_layer(2, "c3"), list(range(6, 8)), inplace=True)# Third Pooling Layer
ansatz.compose(pool_layer([0], [1], "p3"), list(range(6, 8)), inplace=True)# Combining the feature map and ansatz
circuit = QuantumCircuit(8)
circuit.compose(feature_map, range(8), inplace=True)
circuit.compose(ansatz, range(8), inplace=True)observable = SparsePauliOp.from_list([("Z" + "I" * 7, 1)])# we decompose the circuit for the QNN to avoid additional data copying
qnn = EstimatorQNN(circuit=circuit.decompose(),observables=observable,input_params=feature_map.parameters,weight_params=ansatz.parameters,
)

根据量子卷积神经网络创建分类器

classifier = NeuralNetworkClassifier(qnn,optimizer=COBYLA(maxiter=200),  # Set max iterations here
)

拟合数据,测试结果

x = np.asarray(train_images)
y = np.asarray(train_labels)
classifier.fit(x, y)y_predict = classifier.predict(test_images)
x = np.asarray(test_images)
y = np.asarray(test_labels)
print(f"Accuracy from the test data : {np.round(100 * classifier.score(x, y), 2)}%")

如果将结果可视化的话(详见Qiskit量子卷积神经网络),应如下图

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/211537.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库】简单连接嵌套查询

目录 🎇简单查询 🎇连接查询 🎇嵌套查询 分析&思考 🎇简单查询 --练习简单查询 --select * from classes --select * from student --select * from scores --1.按Schedule表的结构要求用SQL语言创建Schedule表 --字段名…

深度学习之全面了解预训练模型

在本专栏中,我们将讨论预训练模型。有很多模型可供选择,因此也有很多考虑事项。 这次的专栏与以往稍有不同。我要回答的问题全部源于 MathWorks 社区论坛(ww2.mathworks.cn/matlabcentral/)的问题。我会首先总结 MATLAB Answers …

关于Linux Kernel Panic导致重启的简单分析步骤

Linux系统Kernel Panic的检索 如何判断是否发生Kernel Panic,以下以 CentOS 7.9系统为例 #查看 /var/crash 路径下是否有生成文件夹,Kernel Panic后会生成文件夹在此路径表示产生了Kernel Panic ls /var/crash #/var/crash/127.0.0.1-2023-12-04-08\:5…

HarmonyOS应用开发者基础认证考试(稳过)

判断题 ​​​​​​​ 1. Web组件对于所有的网页都可以使用zoom(factor: number)方法进行缩放。错误(False) 2. 每一个自定义组件都有自己的生命周期正确(True) 3. 每调用一次router.pushUrl()方法,默认情况下,页面栈数量会加1,页面栈支持的…

linux redis-cluster ipv6方式

配置文件,具体字段的含义,可以参考其他文档。 1.单个文件的配置信息 redis_36380.conf requirepass Paas_2024port 36380tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile /data/paas/apps/aicache-redis/redis_36380.p…

【STM32】TIM定时器编码器

1 编码器接口简介 Encoder Interface 编码器接口 编码器接口可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度 接收正交信号&#…

黑豹程序员-EasyExcel实现导出

需求 将业务数据导出到excel中,老牌的可以选择POI,也有个新的选择EasyExcel。 有个小坑,客户要求样式比较美观,数字列要求千位符,保留2位小数。 可以用代码实现但非常繁琐,用模板就特别方便,模…

C++优秀串口库

serial::Serial Class Reference #include <serial.h> Data Structures class ScopedReadLockclass ScopedWriteLock Public Member Functions公有成员方法&#xff08;编程用的都在这里了&#xff0c;那些私有的如果不开源一般跟我们没有关系了&#xff09; Serial …

用chatGPT开发项目:我想的无人的智慧树网站 流量之神 利用人工智能的算法将人吸引住 GPT4是不是越来越难用了,问一下就要证明一下自己是不是人类

广度发散&#xff1a;让AI给出时代或今日或你关注的热点事件 比如采集新闻头条&#xff0c;根据内容或标题&#xff0c;以不同的角度&#xff0c;或各种人群的角色&#xff0c;生成50篇简短的文章。一下就能占传统的搜索引擎。这是AI最擅长的【千人千面&#xff0c;海量生成】…

【中国海洋大学】操作系统随堂测试6整理

1. IO系统的层次机构包括&#xff1a;IO硬件、中断处理程序、&#xff08;&#xff09;程序、设备独立性软件、用户层软件。 答&#xff1a;设备驱动 2. IO设备和控制器之间的接口包括三种类型的信号&#xff1a;数据信号线、控制信号线和&#xff08;&#xff09;&#xff1…

qt反射基础

最近研究了一下QT的反射机制&#xff0c; Qt的元对象系统除了提供信号/槽机制的特性之外&#xff0c;它还提供了以下特性: QObject::metaObject() 返回关联的元对象 QMetaObject::className() 在运行时状态下返回类名 QObject::inherits() 判断类的继承关系 QObject::tr()&…

鸿蒙开发之封装优化

面向对象开发离不开封装&#xff0c;将重复的可以复用的代码封装起来&#xff0c;提高开发效率。 基于之前的List&#xff0c;对代码进行封装。 1、抽取component 将List的头部抽离出来作为一个新的component。可以创建一个新的ArkTS文件&#xff0c;写我们的头部代码 为了…

代理模式:解析对象间的间接访问与控制

目录 引言 理解代理模式 不同类型的代理模式 代理模式的应用场景 代理模式的优缺点 优点 缺点 实际案例&#xff1a;Java中的代理模式应用 结语 引言 代理模式是软件设计模式中的一种结构型模式&#xff0c;旨在为其他对象提供一种代理以控制对这个对象的访问。它允许你…

消息队列使用指南

介绍 消息队列是一种常用的应用程序间通信方法&#xff0c;可以用来在不同应用程序或组件之间传递数据或消息。消息队列就像一个缓冲区&#xff0c;接收来自发送方的消息&#xff0c;并存储在队列中&#xff0c;等待接收方从队列中取出并处理。 在分布式系统中&#xff0c;消…

死锁问题,4个必要条件+避免死锁

目录 引入 死锁 概念 示例 多把锁 单锁 4个必要条件 用途 引入 我们用加锁的方式保证了多个线程访问临界资源时,不会出现数据紊乱的问题 但是,锁的引入,会导致出现其他的问题 死锁 概念 在多线程或多进程的并发环境中&#xff0c;两个或多个进程或线程被永久阻塞&…

esxi全称“VMware ESXi

esxi全称“VMware ESXi”&#xff0c;是可直接安装在物理服务器上的强大的裸机管理系统&#xff0c;是一款虚拟软件&#xff1b;ESXi本身可以看做一个操作系统&#xff0c;采用Linux内核&#xff0c;安装方式为裸金属方式&#xff0c;可直接安装在物理服务器上&#xff0c;不需…

数据结构算法-希尔排序算法

引言 在一个普通的下午&#xff0c;小明和小森决定一起玩“谁是老板”的扑克牌游戏。这次他们玩的可不仅仅是娱乐&#xff0c;更是要用扑克牌来决定谁是真正的“大老板”。 然而&#xff0c;小明的牌就像刚从乱麻中取出来的那样&#xff0c;毫无头绪。小森的牌也像是被小丑掷…

Agent学习笔记

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世界…

十年婚姻·总结八

十年婚姻总结八 女人一生的合伙人不能只是帅哥哥 女人一生的合伙人不能只是帅哥哥 浪漫的本质还是你的筹码。 比如你送男人5万的手表&#xff0c;但你没什么其他筹码&#xff08;皮肤粗糙蜡黄、没人脉金钱资源、长的胖&#xff09;。 那个男人会觉得你胡闹&#xff0c;你送的…

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测

分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测 目录 分类预测 | SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.SSA-HKELM-Adaboost麻雀算法优化混合核极限学习机的数据分类…