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

Torch连接器和混合量子神经网络

本章内容介绍如何将QNN作为一般的Torch神经层嵌入Torch框架的经典神经网络。首先我们会学习如何嵌入EstimatorQNN,最后我们会使用这一技术实现手写数字的识别。

一般步骤

首先创建特征映射电路(feature map)和假设(ansatz)分别作为输入层和权重层

# Set up a circuit
feature_map = ZZFeatureMap(num_inputs)
ansatz = RealAmplitudes(num_inputs)
qc = QuantumCircuit(num_inputs)
qc.compose(feature_map, inplace=True)
qc.compose(ansatz, inplace=True)

事实上这一过程完全可以被qiskit_machine_learning.circuit.library里的QNNCircuit简化

feature_map = ZZFeatureMap(num_inputs)
ansatz = RealAmplitudes(num_inputs)
qc =  QNNCircuit(feature_map, ansatz)

下一步,创建量子神经网络,此处以EstimatorQNN为例.

# Setup QNN
qnn = EstimatorQNN(circuit=qc, input_params=feature_map.parameters, weight_params=ansatz.parameters
)

接下来,使用qiskit_machine_learning.connector中的TorchConnector完成连接工作

# Set up PyTorch module
# Note: If we don't explicitly declare the initial weights
# they are chosen uniformly at random from [-1, 1].
initial_weights = 0.1 * (2 * algorithm_globals.random.random(qnn.num_weights) - 1)model = TorchConnector(qnn, initial_weights=initial_weights)

注意如果我们不设置初始权重,TorchConnector会自动加入默认权重。

此时我们已经可以向模型内部传入数据了,而传入的数据必须是PyTorch的Tensor

model(dataTensor[0, :])

为了优化我们的模型,我们需要引入优化器与损失函数。

# Define optimizer and loss
optimizer = LBFGS(model.parameters())
f_loss = MSELoss(reduction="sum")# Start training
model.train()  # set model to training mode# Note from (https://pytorch.org/docs/stable/optim.html):
# Some optimization algorithms such as LBFGS need to
# reevaluate the function multiple times, so you have to
# pass in a closure that allows them to recompute your model.
# The closure should clear the gradients, compute the loss,
# and return it.
def closure():optimizer.zero_grad()  # Initialize/clear gradientsloss = f_loss(model(X_), y_)  # Evaluate loss functionloss.backward()  # Backward passprint(loss.item())  # Print lossreturn loss# Run optimizer step4
optimizer.step(closure)

手写数字识别实战

本节内容将使用EstimatorQNN实现MNIST数据集的分类与识别。

首先导入本节需要的所有库

import numpy as np
import matplotlib.pyplot as pltfrom torch import Tensor
from torch.nn import Linear, CrossEntropyLoss, MSELoss
from torch.optim import LBFGSfrom qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.circuit.library import RealAmplitudes, ZZFeatureMap
from qiskit_machine_learning.neural_networks import SamplerQNN, EstimatorQNN
from qiskit_machine_learning.connectors import TorchConnector
# Additional torch-related imports
import torch
from torch import cat, no_grad, manual_seed
from torch.utils.data import DataLoader
from torchvision import datasets, transforms
import torch.optim as optim
from torch.nn import (Module,Conv2d,Linear,Dropout2d,NLLLoss,MaxPool2d,Flatten,Sequential,ReLU,
)
import torch.nn.functional as F

下一步,导入MNIST数据集(这种导入方式是PyTorch中司空见惯且极为方便的)。其中,我们先创建了训练集,随后创建了测试数据集。

# 训练数据集
# -------------# Set train shuffle seed (for reproducibility)
manual_seed(42)batch_size = 1
n_samples = 100  # We will concentrate on the first 100 samples# Use pre-defined torchvision function to load MNIST train data
X_train = datasets.MNIST(root="./data", train=True, download=True, transform=transforms.Compose([transforms.ToTensor()])
)# Filter out labels (originally 0-9), leaving only labels 0 and 1
idx = np.append(np.where(X_train.targets == 0)[0][:n_samples], np.where(X_train.targets == 1)[0][:n_samples]
)
X_train.data = X_train.data[idx]
X_train.targets = X_train.targets[idx]# Define torch dataloader with filtered data
train_loader = DataLoader(X_train, batch_size=batch_size, shuffle=True)
# 测试数据集
# -------------# Set test shuffle seed (for reproducibility)
# manual_seed(5)n_samples = 50# Use pre-defined torchvision function to load MNIST test data
X_test = datasets.MNIST(root="./data", train=False, download=True, transform=transforms.Compose([transforms.ToTensor()])
)# Filter out labels (originally 0-9), leaving only labels 0 and 1
idx = np.append(np.where(X_test.targets == 0)[0][:n_samples], np.where(X_test.targets == 1)[0][:n_samples]
)
X_test.data = X_test.data[idx]
X_test.targets = X_test.targets[idx]# Define torch dataloader with filtered data
test_loader = DataLoader(X_test, batch_size=batch_size, shuffle=True)

万事俱备后,我们可以开始创建量子神经网络了

# Define and create QNN
def create_qnn():feature_map = ZZFeatureMap(2)ansatz = RealAmplitudes(2, reps=1)qc = QuantumCircuit(2)qc.compose(feature_map, inplace=True)qc.compose(ansatz, inplace=True)# REMEMBER TO SET input_gradients=True FOR ENABLING HYBRID GRADIENT BACKPROPqnn = EstimatorQNN(circuit=qc,input_params=feature_map.parameters,weight_params=ansatz.parameters,input_gradients=True,)return qnnqnn = create_qnn()

以上只是量子神经网络,为了嵌入到经典神经网络中,我们需要PyTorch框架的帮助。

# Define torch NN moduleclass Net(Module):def __init__(self, qnn):super().__init__()self.conv1 = Conv2d(1, 2, kernel_size=5)self.conv2 = Conv2d(2, 16, kernel_size=5)self.dropout = Dropout2d()self.fc1 = Linear(256, 64)self.fc2 = Linear(64, 2)  # 2-dimensional input to QNNself.qnn = TorchConnector(qnn)  # Apply torch connector, weights chosen# uniformly at random from interval [-1,1].self.fc3 = Linear(1, 1)  # 1-dimensional output from QNNdef forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool2d(x, 2)x = F.relu(self.conv2(x))x = F.max_pool2d(x, 2)x = self.dropout(x)x = x.view(x.shape[0], -1)x = F.relu(self.fc1(x))x = self.fc2(x)x = self.qnn(x)  # apply QNNx = self.fc3(x)return cat((x, 1 - x), -1)model = Net(qnn)

尤其留意QNN是如何作为神经网络的一层被嵌入到经典神经网络的!

万事俱备后,我们只需要训练模型即可。

# Define model, optimizer, and loss function
optimizer = optim.Adam(model4.parameters(), lr=0.001)
loss_func = NLLLoss()# Start training
epochs = 10  # Set number of epochs
loss_list = []  # Store loss history
model.train()  # Set model to training modefor epoch in range(epochs):total_loss = []for batch_idx, (data, target) in enumerate(train_loader):optimizer.zero_grad(set_to_none=True)  # Initialize gradientoutput = model(data)  # Forward passloss = loss_func(output, target)  # Calculate lossloss.backward()  # Backward passoptimizer.step()  # Optimize weightstotal_loss.append(loss.item())  # Store lossloss_list.append(sum(total_loss) / len(total_loss))print("Training [{:.0f}%]\tLoss: {:.4f}".format(100.0 * (epoch + 1) / epochs, loss_list[-1]))

如果我们想保存当前的模型,可以使用PyTorch中常见的方法。

torch.save(model.state_dict(), "model.pt")

当我们想根据数据文件恢复模型时,可以使用

qnn2 = create_qnn()
model2 = Net(qnn2)
model2.load_state_dict(torch.load("model.pt"))

接下来可以检验一下恢复出的模型的效果

model5.eval()  # set model to evaluation mode
with no_grad():correct = 0for batch_idx, (data, target) in enumerate(test_loader):output = model5(data)if len(output.shape) == 1:output = output.reshape(1, *output.shape)pred = output.argmax(dim=1, keepdim=True)correct += pred.eq(target.view_as(pred)).sum().item()loss = loss_func(output, target)total_loss.append(loss.item())print("Performance on test data:\n\tLoss: {:.4f}\n\tAccuracy: {:.1f}%".format(sum(total_loss) / len(total_loss), correct / len(test_loader) / batch_size * 100))

最后,打印模型的预测结果

# Plot predicted labelsn_samples_show = 6
count = 0
fig, axes = plt.subplots(nrows=1, ncols=n_samples_show, figsize=(10, 3))model5.eval()
with no_grad():for batch_idx, (data, target) in enumerate(test_loader):if count == n_samples_show:breakoutput = model5(data[0:1])if len(output.shape) == 1:output = output.reshape(1, *output.shape)pred = output.argmax(dim=1, keepdim=True)axes[count].imshow(data[0].numpy().squeeze(), cmap="gray")axes[count].set_xticks([])axes[count].set_yticks([])axes[count].set_title("Predicted {}".format(pred.item()))count += 1

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

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

相关文章

tomcat结构目录有哪些

Tomcat服务器结构目录包括以下内容: conf目录:存放Tomcat的配置信息,包括server.xml、context.xml、web.xml等核心配置文件。bin目录:存放Tomcat启动和关闭脚本,如catalina.sh、setenv.sh(可选&#xff09…

深信服行为管理AC设置用户定时注销

PS:设置用户无流量注销及每天定时注销 AC版本:AC13.0.62.001 Build20221107 官方通告: 截止标准版本AC12.0.80和AC13.0.80,暂不支持指定周期时间内注销一次所有用户,仅支持每天的固定时间注销所有用户,每…

基于web的ssm网络在线考试系统源码和论文

摘要 随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理网络在线考试系统的最新形式。本论文是以构建网络在线考试系统为目标,使用 java技术制…

软件测试方法之等价类测试

01 等价类划分法 1、应用场合 有数据输入的地方,可以使用等价类划分法。 从大量数据中挑选少量代表数据进行测试。 2、测试思想 穷举测试:把所有可能的数据全部测试一遍叫穷举测试。穷举测试是最全面的测试,但是在实际工作中不能采用&am…

vue3安装markdown-it

记录一个坑 vue ts使用markdown-it需要使用以下命令安装才行 npm install --save markdown-it vue/compiler-sfc来源https://juejin.cn/s/vue3%20markdown-it

Android View.inflate 和 LayoutInflater.from(this).inflate的区别

前言 两个都是布局加载器,而View.inflate是对 LayoutInflater.from(context).inflate的封装,功能相同,案例使用了dataBinding。 View.inflate(context, layoutResId, root) LayoutInflater.from(context).inflate(layoutResId, root, fals…

C++包管理利器CPM

C包管理利器CPM 一、介绍 CPM.cmake is a cross-platform CMake script that adds dependency management capabilities to CMake. It’s built as a thin wrapper around CMake’s FetchContent module that adds version control, caching, a simple API and more. CPM.cma…

CENTOS 7 添加黑名单禁止IP访问服务器

一、通过 firewall 添加单个黑名单 只需要把ip添加到 /etc/hosts.deny 文件即可,格式 sshd:$IP:deny vim /etc/hosts.deny# 禁止访问sshd:*.*.*.*:deny# 允许的访问sshd:.*.*.*:allowsshd:.*.*.*:allow 二、多次失败登录即封掉IP,防止暴力破解的脚本…

IBM 刚刚发布了首个 1000 量子比特的量子芯片

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Python继承技法揭示,代码更具扩展性

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python继承技法揭示,代码更具扩展性,全文4000字,阅读大约11分钟。 继承是面向对象编程中的核心概念之一,它允许创建一个新的类…

spring 框架的 AOP

AOP依赖导入 <!-- AOP依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>

Matlab 镜像变换(2D)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 镜像变换是一个非常有趣的过程,它有着一个通用的套路(以2D为例):一个点围绕一个给定对称轴的镜像可以通过平移对称轴上一点,然后旋转它,使对称轴与x轴对齐,之后我们将旋转后的点的y坐标置为负,最后再将对称…

如何购买华为云服务器

华为云是华为推出的云计算服务平台&#xff0c;旨在为企业和个人提供全面的云端解决方案。它提供了包括计算、存储、数据库、人工智能、大数据、安全等多种云服务&#xff0c;覆盖了基础设施、平台和软件级别的需求。华为云致力于构建安全可信赖的云计算基础设施&#xff0c;以…

智慧校园:TSINGSEE青犀智能视频监控系统,AI助力优化校园管理

随着科技的飞速发展和信息化社会的到来&#xff0c;智慧校园已经成为教育领域的一种新型发展模式。智慧校园的需求和发展趋势日益显现&#xff0c;其建设已成为当今教育信息化发展的重要方向。 TSINGSEE青犀结合高可靠、高性能的云计算、人工智能、大数据、物联网等技术&#…

云原生周刊:K8s 的 YAML 技巧 | 2023.12.4

开源项目推荐 Helmfile Helmfile 是用于部署 Helm Chart 的声明性规范。其功能有&#xff1a; 保留图表值文件的目录并维护版本控制中的更改。将 CI/CD 应用于配置更改。定期同步以避免环境偏差。 Docketeer 一款 Docker 和 Kubernetes 开发人员工具&#xff0c;用于管理容…

【QT】Qt常用数值输入和显示控件

目录 1.QAbstractslider 1.1主要属性 2.QSlider 2.1专有属性 2.2 常用函数 3.QScrollBar 4.QProgressBar 5.QDial 6.QLCDNumber 7.上述控件应用示例 1.QAbstractslider 1.1主要属性 QSlider、QScrollBar和Qdial3个组件都从QAbstractSlider继承而来&#xff0c;有一些共有的属性…

三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)

说明&#xff1a;当前调试仅仅用来测试和熟悉部分摄像头寄存器模式 一、图片成像方向控制&#xff0c;基本每个摄像头都会有上下左右翻转寄存器 正向图片 反向图片 二、设置成像数据成各种颜色&#xff0c;&#xff08;黑白/原彩/黄色等等&#xff09; 在寄存器书册描述中…

【面试经典150 | 二叉树】相同的树

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;递归方法二&#xff1a;迭代 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题…

UVa512追踪电子表格中的单元格题解

题目 有一个r行c列(1≤r,c≤50)的电子表格,行从上到下编号为1~r,列从左到右编号为 1~c。如图(a)所示,如果先删除第1、5行,然后删除第3,6,7,9列,结果如图(b)所示。 接下来在第2、3、5行前各插入一个空行,然后在第3列前插入一个空列, 会得到如图(e)的结果。 你的任务是模拟这样…

10.机器人系统仿真(urdf集成gazebo、rviz)

目录 1 机器人系统仿真的必要性与本篇学习目的 1.1 机器人系统仿真的必要性 1.2 一些概念 URDF是 Unified Robot Description Format 的首字母缩写&#xff0c;直译为统一(标准化)机器人描述格式&#xff0c;可以以一种 XML 的方式描述机器人的部分结构&#xff0c;比如底盘…