模板¶
PennyLane 提供了一个不断增长的预编码模板库,包含常见变分电路架构,可以用来轻松构建、评估和训练更复杂的模型。在文献中,这些架构通常被称为 ansatz。模板可以用来 嵌入数据 到量子态中,定义可训练的 层 量子门,作为电路中的第一步操作 准备量子态,或简单地作为电路构建的一般 子程序。
以下是PennyLane提供的内置模板的画廊。
嵌入模板¶
嵌入将输入特征编码为电路的量子态。 因此,它们通常将数据样本(例如特征向量)作为参数。嵌入也可以依赖于可训练参数,并且可以由重复的层构成。
状态准备¶
状态准备模板将零状态 \(|0\dots 0 \rangle\) 转换为另一个初始状态。与可以在电路中任何地方使用的嵌入相比,状态准备通常作为第一个操作使用。
算术模板¶
量子算术模板允许进行就地和非就地的模运算,例如加法、乘法和指数运算。
量子化学模板¶
量子化学模板定义了在变分算法中使用的各种量子电路,例如 VQE,以执行量子化学模拟。
其他子程序¶
这里可以找到不属于前面类别的其他有用模板。
参数初始化¶
通常带有权重参数张量的模板提供返回该张量形状的方法。形状可以例如在训练开始时用于构造随机权重。
import pennylane as qml
from pennylane.templates import BasicEntanglerLayers
from pennylane import numpy as np
n_wires = 3
dev = qml.device('default.qubit', wires=n_wires)
@qml.qnode(dev)
def circuit(weights):
BasicEntanglerLayers(weights=weights, wires=range(n_wires))
return qml.expval(qml.PauliZ(0))
shape = BasicEntanglerLayers.shape(n_layers=2, n_wires=n_wires)
np.random.seed(42) # to make the result reproducible
weights = np.random.random(size=shape)
>>> circuit(weights)
tensor(0.72588592, requires_grad=True)
如果一个模板需要多个权重张量,shape 方法会返回一个形状元组的列表。
自定义模板¶
创建自定义模板可以简单到只需定义一个创建操作并且没有返回语句的函数:
from pennylane import numpy as np
def MyTemplate(a, b, wires):
c = np.sin(a) + b
qml.RX(c, wires=wires[0])
n_wires = 3
dev = qml.device('default.qubit', wires=n_wires)
@qml.qnode(dev)
def circuit(a, b):
MyTemplate(a, b, wires=range(n_wires))
return qml.expval(qml.PauliZ(0))
>>> circuit(2, 3)
-0.7195065654396784
注意
确保经典处理与您使用的自动微分库兼容。例如,如果 MyTemplate 要与 torch 框架一起使用,我们必须将 np.sin 更改为 torch.sin。PennyLane 的 math 库包含一些针对框架无关处理的高级功能。
根据驼峰命名的建议,PennyLane中的内置模板是类。类是一种比函数更复杂的数据结构,因为它们可以定义模板的属性和方法(例如梯度配方或矩阵表示)。请参阅贡献运算符页面,了解如何编写自己的模板类以及如何将其添加到PennyLane模板库中。
分层函数¶
layer 函数通过将一系列量子门重复应用于一组线缆来创建一个新的模板。您可以通过 qml.layer 和 qml.templates.layer 导入此函数。
|
重复应用一个单位操作指定的次数。 |