mindquantum.framework.MQLayer

class mindquantum.framework.MQLayer(expectation_with_grad, weight='normal')[源代码]

包含encoder线路和ansatz线路的量子神经网络,encoder线路将经典数据编码成量子态,ansatz线路的参数是可训练的参数。

参数:
  • expectation_with_grad (GradOpsWrapper) - 梯度算子,接收encoder数据和ansatz数据,并返回期望值和参数相对于期望的梯度值。

  • weight (Union[Tensor, str, Initializer, numbers.Number]) - 卷积核的初始化器。它可以是Tensor、字符串、Initializer或数字。指定字符串时,可以使用’TruncatedNormal’, ‘Normal’, ‘Uniform’, ‘HeUniform’ 和 ‘XavierUniform’分布以及常量’One’和’Zero’分布中的值。别名’xavier_uniform’,’he_uniform’,’ones’和’zeros’是可以接受的。大写和小写都可以接受。有关更多详细信息,请参阅Initializer的值。默认值:’normal’。

输入:
  • enc_data (Tensor) - encoder数据,即要编码为量子态的Tensor。

输出:

Tensor,hamiltonian的期望值。

异常:
  • ValueError - 如果 weight 的shape长度不等于1,并且 weight 的shape[0]不等于 weight_size

支持平台:

GPU, CPU

样例:

>>> import numpy as np
>>> import mindspore as ms
>>> from mindquantum.core.circuit import Circuit
>>> from mindquantum.core.operators import Hamiltonian, QubitOperator
>>> from mindquantum.framework import MQLayer
>>> from mindquantum.simulator import Simulator
>>> ms.set_seed(42)
>>> ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU")
>>> enc = Circuit().ry('a', 0).as_encoder()
>>> ans = Circuit().h(0).rx('b', 0).as_ansatz()
>>> ham = Hamiltonian(QubitOperator('Z0'))
>>> sim = Simulator('mqvector', 1)
>>> grad_ops = sim.get_expectation_with_grad(ham, enc + ans)
>>> enc_data = ms.Tensor(np.array([[0.1]]))
>>> net =  MQLayer(grad_ops)
>>> opti = ms.nn.Adam(net.trainable_params(), learning_rate=0.1)
>>> train_net = ms.nn.TrainOneStepCell(net, opti)
>>> for i in range(100):
...     train_net(enc_data)
>>> net.weight.asnumpy()
array([3.1423748], dtype=float32)
>>> net(enc_data)
Tensor(shape=[1, 1], dtype=Float32, value=
[[-9.98333842e-02]])