文档反馈

问题文档片段

问题文档片段包含公式时,显示为空格。

提交类型
issue

有点复杂...

找人问问吧。

PR

小问题,全程线上修改...

一键搞定!

请选择提交类型

问题类型
规范和低错类

- 规范和低错类:

- 错别字或拼写错误,标点符号使用错误、公式错误或显示异常。

- 链接错误、空单元格、格式错误。

- 英文中包含中文字符。

- 界面和描述不一致,但不影响操作。

- 表述不通顺,但不影响理解。

- 版本号不匹配:如软件包名称、界面版本号。

易用性

- 易用性:

- 关键步骤错误或缺失,无法指导用户完成任务。

- 缺少主要功能描述、关键词解释、必要前提条件、注意事项等。

- 描述内容存在歧义指代不明、上下文矛盾。

- 逻辑不清晰,该分类、分项、分步骤的没有给出。

正确性

- 正确性:

- 技术原理、功能、支持平台、参数类型、异常报错等描述和软件实现不一致。

- 原理图、架构图等存在错误。

- 命令、命令参数等错误。

- 代码片段错误。

- 命令无法完成对应功能。

- 界面错误,无法指导操作。

- 代码样例运行报错、运行结果不符。

风险提示

- 风险提示:

- 对重要数据或系统存在风险的操作,缺少安全提示。

内容合规

- 内容合规:

- 违反法律法规,涉及政治、领土主权等敏感词。

- 内容侵权。

请选择问题类型

问题描述

点击输入详细问题描述,以帮助我们快速定位问题。

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]