1

我正在 TensorFlow Quantum (TFQ) 上运行一些示例和测试,并且正在努力执行多类分类。我将使用 MNIST 分类示例作为基础 ( https://www.tensorflow.org/quantum/tutorials/mnist ),因为这也是我的起点。

对于二元分类,我使用了不同的类示例和不同的门组合,分类结果是通过测量单个读出的 qubit (qR) 结果获得的,因此如果 qR=0,我们将分类为 0 类,如果 qR=1,那么我们有 1 课。

我将它扩展到多类问题,所以我们有 4 个类(0,1,2,3)。为此,我使用 更改类的标签tf.keras.utils.to_categorical(y_train),以便将标签从单个值转换为向量 (0 -> (1,0,0,0); 1-> (0,1,0,0);等),tf.keras.losses.CategoricalHinge()用作模型的损失并创建 4 个读数量子位,每个类别一个(M(qR0, qR1, qR2, qR3) = (0,0,1,0) -> class 2),并且这个作品。

然而,这种方法大大增加了电路的尺寸。所以我想要做的是只将 2 个读出量子位传递给 TFQ,并将组合测量用于 4 类分类(|00> = 0,|10> = 1,|01> = 2,|11> = 3) . 理想情况下,这将允许 2^n 多类分类,其中 n 是量子比特的数量。cirq.measure(qR0, qR1, key='measure')在 Cirq 中,我可以通过对两个读出量子位执行 a 来实现此输出。但是,我在将此类命令传递给 TFQ 时遇到了困难,因为据我了解,它仅测量以单个量子比特 Pauli 门结尾的量子比特。

那么,我在 TFQ 的功能中是否缺少一些允许在训练过程中进行此类测量的功能?

4

1 回答 1

1

从这个片段开始:

bit = cirq.GridQubit(0, 0)
symbols = sympy.symbols('x, y, z')

# !This is important!
ops = [-1.0 * cirq.Z(bit), cirq.X(bit) + 2.0 * cirq.Z(bit)]
# !This is important!

circuit_list = [
    _gen_single_bit_rotation_problem(bit, symbols),
    cirq.Circuit(
        cirq.Z(bit) ** symbols[0],
        cirq.X(bit) ** symbols[1],
        cirq.Z(bit) ** symbols[2]
    ),
    cirq.Circuit(
        cirq.X(bit) ** symbols[0],
        cirq.Z(bit) ** symbols[1],
        cirq.X(bit) ** symbols[2]
    )
]
expectation_layer = tfq.layers.Expectation()
output = expectation_layer(
    circuit_list, symbol_names=symbols, operators = ops)
# Here output[i][j] corresponds to the expectation of all the ops
# in ops w.r.t circuits[i] where keras managed variables are
# placed in the symbols 'x', 'y', 'z'.
tf.shape(output)

我从这里获取的:https ://www.tensorflow.org/quantum/api_docs/python/tfq/layers/Expectation 。

output张量的形状是[3, 2]我有 3 个不同的电路,我在每个电路上取了两个期望值。的值[1, 0]output是:

U 值 0

在此处输入图像描述

那么 of 的值[2, 1]output是:

U值

在此处输入图像描述

的值的形状和内容output部分取决于 的形状和内容ops。如果我想制作输出形状[3, 3],我可以将另一个有效cirq.PauliSum对象添加到ops列表中。cirq.GridQubit在您的情况下,如果您希望在两个特定的 s上获得 00、01、10、11 的概率,q0q1可以执行以下操作:

def zero_proj(qubit):
  return (1 + cirq.Z(qubit)) / 2

def one_proj(qubit):
  return (1 - cirq.Z(qubit)) / 2

# ! This is important
ops = [
  zero_proj(q0) * zero_proj(q1),
  zero_proj(q0) * one_proj(q1),
  one_proj(q0) * zero_proj(q1),
  one_proj(q0)* one_proj(q1)
]
# ! This is important

制作任何摄取的层的输出形状 ops[whatever_your_batch_size_is, 4]。这有助于澄清事情吗?

于 2020-08-24T08:18:24.430 回答