Path: blob/master/site/zh-cn/quantum/tutorials/mnist.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
MNIST 分类
本教程会构建一个量子神经网络 (QNN) 来分类 MNIST 的简单版本,这与在 Farhi 等人的论文中使用的方式类似。我们会比较量子神经网络与经典神经网络解决一个经典数据问题的性能。
设置
安装 TensorFlow Quantum:
现在,导入 TensorFlow 和模块依赖项:
1. 加载数据
在本教程中,根据 Farhi 等人的论文,您将构建一个二元分类器来区分 3 位数和 6 位数。本部分介绍了以下操作的数据处理:
从 Keras 加载原始数据。
筛选数据集中的 3 位数和 6 位数。
缩小图像,使其适合量子计算机。
移除所有矛盾样本。
将二值图像转换为 Cirq 电路。
将 Cirq 电路转换为 TensorFlow Quantum 电路。
1.1 加载原始数据
加载通过 Keras 分布的 MNIST 数据集。
筛选数据集,仅保留 3 位数和 6 位数,移除其他类。同时,将标签 y
转换为布尔值:3
为 True
,6 为 False
。
显示第一个样本:
1.2 缩小图像
对目前的量子计算机来说,28x28 的图像太大。将图像大小调整至 4x4:
调整大小后,重新显示上面的第一个训练样本:
1.3 移除矛盾样本
根据 Farhi 等人论文的 3.3 学习区分数据部分,筛选数据集以移除同时标记为两个类的图像。
这不是标准机器学习步骤,但是为了便于继续学习该论文,我们包括了这一部分。
结果计数与报告值不完全相符,但并未指定具体步骤。
这里还要注意的一点是,此时应用矛盾样本筛选并不能完全阻止模型收到矛盾的训练样本:下一步会对数据进行二值化,因而会产生更多冲突样本。
1.4 将数据编码为量子电路
为了使用量子计算机处理图像,Farhi 等人提出使用量子位表示每个像素,这样,量子位的状态就取决于像素值。第一步是转换为二进制编码。
如果您这时移除矛盾图像,可能只剩 193 个图像,很可能无法进行有效的训练。
对于值超过阈值的像素索引处的量子位,将通过 门进行旋转。
下面是为第一个样本创建的电路(电路图没有显示带零个门的量子位):
将此电路与图像值超过阈值的索引进行比较:
将这些 Cirq
电路转换为 tfq
的张量:
2.1 构建模型电路
下面的示例介绍了这种分层方式。每个层使用同一个门的 n 个实例,其中每个数据量子位根据量子位读数进行响应。
首先,我们来看一个将这些门的层添加到电路的简单类:
构建一个示例电路层,了解其结构:
现在,构建一个匹配数据电路大小的两层模型,并包括准备和读数操作。
2.2 在 tfq-keras 模型中封装模型电路
使用量子组件构建 Keras 模型。从 x_train_circ
(对经典数据进行编码)向此模型馈送“量子数据”。它使用参数化量子电路层 tfq.layers.PQC
,在量子数据上训练模型电路。
为了对这些图像进行分类,Farhi 等人提出获取参数化电路中的量子位读数期望。该期望会返回一个 1 到 -1 之间的值。
下面,我们介绍使用 compile
方法训练模型的步骤。
由于预期读数在 [-1,1]
的范围内,因此,优化铰链损失是很自然的选择。
注:另一种有效方式可能是将输出范围转换为 [0,1]
,并将其视为模型分配给类 3
的几率。这可以与标准的 tf.losses.BinaryCrossentropy
损失一起使用。
要在此处使用铰链损失,您需要对两处稍作调整。其一是转换标签 y_train_nocon
,将其从布尔值转换为 [-1,1]
的范围,使其符合铰链损失的预期。
其二,使用可将 [-1, 1]
作为 y_true
标签参数正确处理的自定义 hinge_accuracy
指标。tf.losses.BinaryAccuracy(threshold=0.0)
预期的 y_true
是一个布尔值,因此,不能与铰链损失一起使用。
训练量子模型
现在,开始训练模型,这个过程大约需要 45 分钟。如果您不想等待太长时间,请使用一小部分数据(按如下设置 NUM_EXAMPLES=500
)。这不会对模型在训练期间的进展造成实际影响(它仅包含 32 个参数,不需要太多数据来约束)。使用较少的样本只会让训练更快结束(5 分钟),但是运行时间已经足以在验证日志中表明取得进展。
将此模型训练至收敛,可以在测试集上达到 85% 以上的准确率。
注:训练准确率可报告整个周期的平均值。验证准确率在每个周期结束时进行评估。
3. 经典神经网络
虽然量子神经网络可以解决这种简单的 MNIST 问题,但是,对于这种任务,基本的经典神经网络的效果明显更优。经过一个训练周期后,经典神经网络在保留集上可以达到 98% 以上的准确率。
在以下示例中,经典神经网络使用 28x28 的全尺寸图像(而不是对图像进行下采样)解决 3-6 分类问题。这在测试集上可以轻松收敛至接近 100% 的准确率。
上面的模型包含接近 120 万个参数。为了进行更公平的比较,请尝试使用一个包含 37 个参数的模型,在下采样的图像上进行训练:
4. 比较
输入的分辨率越高,模型越强大,CNN 解决此问题越轻松。但是,能力相近(约 32 个参数)的经典模型只需少量时间就可以达到同等准确率。不管怎样,经典神经网络都明显优于量子神经网络。对于经典数据,很难找到比经典神经网络更好的方案。