qml.data¶
数据子包提供了访问、存储和操作量子数据集的功能。
注意
要开始使用数据集,请首先查看 量子数据集快速入门指南。
概述¶
数据集通常使用 Dataset 类进行存储和访问。预计算的数据集可以下载,并可以使用 load() 或 load_interactive() 函数进行访问。此外,用户可以使用 Dataset 类中的函数轻松创建、自定义数据集、写入磁盘和读取数据集。
|
创建一个数据集属性,该属性包含值和相关元数据。 |
|
用于在声明式数据集上定义字段。 |
|
数据集的基类。 |
尝试在其基础文件不可写的 数据集 上设置属性时引发的异常。 |
|
|
如果数据在目录中尚不存在,则下载该数据并将其作为 |
使用交互式加载提示下载数据集。 |
|
|
列出特定 |
获取数据类ID的列表。 |
|
返回可用数据集的字典。 |
此外,提供了各种数据集类型
|
包含可以分配给数据集属性的元数据。 |
|
DatasetAttribute 类提供了一个接口,用于将 Python 对象转换为 HDF5 数组或组,以及从 HDF5 数组或组转换回 Python 对象。 |
|
实现数组协议的对象的属性类型,包括numpy数组和pennylane.math.tensor。 |
|
数字的属性类型。 |
|
字符串的属性类型。 |
|
为数据集属性提供类列表的集合类型。 |
|
提供了一个类似字典的集合,用于数据集属性类型。 |
|
|
|
'None' 值的数据集类型。 |
|
属性类型为 |
|
Scipy稀疏数组的属性类型。 |
|
用于JSON可序列化数据的数据集类型。 |
|
元组的类型。 |
数据集¶
Dataset 类提供了一种可移植的存储格式,用于描述物理系统及其演变的信息。例如,任意量子系统的数据集可以包含哈密顿量、其基态和该状态的有效态制备电路。数据集可以包含多种对象类型,包括:
有关使用数据集的更多详细信息,请参阅 量子数据集快速入门指南。
创建数据集¶
要在内存中创建一个新的数据集,初始化一个具有所需属性的新 Dataset:
>>> hamiltonian = qml.Hamiltonian([1., 1.], [qml.Z(0), qml.Z(1)])
>>> eigvals, eigvecs = np.linalg.eigh(qml.matrix(hamiltonian))
>>> dataset = qml.data.Dataset(
... hamiltonian = hamiltonian,
... eigen = {"eigvals": eigvals, "eigvecs": eigvecs}
... )
>>> dataset.hamiltonian
1.0 * Z(0) + 1.0 * Z(1)
>>> dataset.eigen
{'eigvals': array([-2., 0., 0., 2.]),
'eigvecs': array([[0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
[0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j],
[0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]])}
实例创建后也可以分配属性:
>>> dataset.ground_state = np.transpose(eigvecs)[np.argmin(eigvals)]
>>> dataset.ground_state
array([0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j])
读取和写入数据集¶
数据集可以保存到磁盘以供后用。数据集使用HDF5格式进行序列化,使用“.h5”文件扩展名。
要保存一个数据集,请使用 Dataset.write() 方法:
>>> my_dataset = Dataset(...)
>>> my_dataset.write("~/datasets/my_dataset.h5")
要从文件中打开数据集,请使用 Dataset.open() 类方法:
>>> my_dataset = Dataset.open("~/datasets/my_dataset.h5", mode="r")
参数 mode 遵循标准库约定 — r 用于读取,w- 和 w 用于创建和覆盖,以及 'a' 用于编辑。open() 可用于直接在磁盘上创建新的数据集:
>>> new_dataset = Dataset.open("~/datasets/new_datasets.h5", mode="w")
默认情况下,对已打开数据集所做的任何更改将直接提交到文件中,如果文件以只读方式打开,则会失败。"copy"模式可以用来将数据集加载到内存中并将其从文件中分离:
>>> my_dataset = Dataset.open("~/dataset/my_dataset/h5", mode="copy")
>>> my_dataset.new_attribute = "abc"
重要
由于打开的数据集是从磁盘流式传输数据的,因此无法同时从分别运行的脚本或多个Jupyter笔记本访问相同的数据集。为了解决这个问题,要么在磁盘上复制数据集,要么使用 Dataset.open() 以 mode="copy" 的方式访问数据集。
属性元数据¶
数据集属性还可以包含附加的元数据,例如文档字符串。 attribute()
函数可以在赋值或初始化时附加元数据。
>>> hamiltonian = qml.Hamiltonian([1., 1.], [qml.Z(0), qml.Z(1)])
>>> eigvals, eigvecs = np.linalg.eigh(qml.matrix(hamiltonian))
>>> dataset = qml.data.Dataset(hamiltonian = qml.data.attribute(
... hamiltonian,
... doc="The hamiltonian of the system"))
>>> dataset.eigen = qml.data.attribute(
... {"eigvals": eigvals, "eigvecs": eigvecs},
... doc="Eigenvalues and eigenvectors of the hamiltonian")
然后可以使用 Dataset.attr_info() 映射访问这些元数据:
>>> dataset.attr_info["eigen"]["doc"]
'Eigenvalues and eigenvectors of the hamiltonian'
声明式API¶
在创建数据集以建模物理系统时,通常会在不同的条件或假设下收集相同的数据。例如,一组描述量子振荡器的数据集,其中包含不同质量和力常数的前1000个能量级。
数据集声明式API允许我们创建Dataset的子类,定义所需的属性或“字段”,以及它们相关的类型和文档:
class QuantumOscillator(qml.data.Dataset, data_name="quantum_oscillator", identifiers=["mass", "force_constant"]):
"""Dataset describing a quantum oscillator."""
mass: float = qml.data.field(doc = "The mass of the particle")
force_constant: float = qml.data.field(doc = "The force constant of the oscillator")
hamiltonian: qml.Hamiltonian = qml.data.field(doc = "The hamiltonian of the particle")
energy_levels: np.ndarray = qml.data.field(doc = "The first 1000 energy levels of the system")
data_name 关键字指定数据集类型的类别或描述名称,而 identifiers 关键字用于指定作为参数的字段,即它们决定系统的行为。
当创建一个 QuantumOscillator 数据集时,其属性将具有来自字段定义的文档:
>>> dataset = QuantumOscillator(
... mass=1,
... force_constant=0.5,
... hamiltonian=qml.X(0),
... energy_levels=np.array([0.1, 0.2])
... )
>>> dataset.attr_info["mass"]["doc"]
'The mass of the particle'