mindquantum.framework.QRamVecLayer
- class mindquantum.framework.QRamVecLayer(ham, circ, sim, n_thread=None, weight='normal')[源代码]
- 包含qram和ansatz线路的量子神经网络,qram将经典数据直接编码成量子态,ansatz线路的参数是可训练的参数。 - 说明 - 对于低于2.0.0版本的MindSpore,不支持将复数张量作为神经网络cell输入,因此我们应该将量子态拆分为实部和虚部,并将其用作输入张量。当MindSpore升级时,这种情况可能会改变。 
- 目前,我们无法计算测量结果相对于每个量子振幅的梯度。 
 - 参数:
- ham (Union[ - Hamiltonian, List[- Hamiltonian]]) - 要想求期望值的哈密顿量或者一组哈密顿量。
- circ ( - Circuit) - 变分量子线路。
- sim ( - Simulator) - 做模拟所使用到的模拟器。
- n_thread (int) - 运行一个batch的初始态时的并行数。如果是 - None,用单线程来运行。默认值:- None。
- weight (Union[Tensor, str, Initializer, numbers.Number]) - 卷积核的初始化器。它可以是Tensor、字符串、Initializer或数字。指定字符串时,可以使用 - 'TruncatedNormal'、- 'Normal'、- 'Uniform'、- 'HeUniform'和- 'XavierUniform'分布以及常量'One'和'Zero'分布中的值。别名- 'xavier_uniform'、- 'he_uniform'、- 'ones'和- 'zeros'是可以接受的。大写和小写都可以接受。有关更多详细信息,请参阅Initializer的值。默认值:- 'normal'。
 
- 输入:
- qs_r (Tensor) - 量子态实部的Tensor,其shape为 \((N, M)\) ,其中 \(N\) 表示batch大小, \(M\) 表示全振幅量子态的长度。 
- qs_i (Tensor) - 量子态虚部的Tensor,其shape为 \((N, M)\) ,其中 \(N\) 表示batch大小, \(M\) 表示全振幅量子态的长度。 
 
- 输出:
- 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 QRamVecLayer >>> from mindquantum.simulator import Simulator >>> ms.set_seed(42) >>> ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU") >>> ans = Circuit().ry('a', 0).rx('b', 0).as_ansatz() >>> ham = Hamiltonian(QubitOperator('Z0')) >>> sim = Simulator('mqvector', 1) >>> grad_ops = sim.get_expectation_with_grad(ham, ans) >>> qs = np.array([[1.0, 2.0]])/np.sqrt(5) >>> qs_r, qs_i = ms.Tensor(qs.real), ms.Tensor(qs.imag) >>> net = QRamVecLayer(ham, ans, sim) >>> 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(qs_r, qs_i) >>> net.weight.asnumpy() array([ 9.2439342e-01, -3.3963533e-04], dtype=float32) >>> net(qs_r, qs_i) Tensor(shape=[1, 1], dtype=Float32, value= [[-9.99995708e-01]]) >>> sim.set_qs(qs[0]) >>> sim.apply_circuit(ans, pr=net.weight.asnumpy()) >>> print(sim.get_qs()) [0.0014509 +1.69817484e-04j 0.99999893+2.46388577e-07j]