我在TFQ上运行了一些示例和测试,我正在努力执行多类分类。我将使用MNIST分类示例作为基础(https://www.tensorflow.org/quantum/tutorials/mnist),因为这也是我开始的地方。
对于二进制分类,我使用了类和不同门组合的不同示例,并且分类结果是通过测量单个读出量子比特(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) ->类2),这是可行的。
然而,这种方法大大增加了电路的大小。所以我想要做的是只传递给TFQ两个读出的量子比特,并使用4类分类的组合测量(|00> = 0,|10> = 1,|01> = 2,|11> = 3)。理想情况下,这将允许2^n多类分类,其中n是量子比特的数量。在Cirq中,我可以通过对两个读出的量子比特执行cirq.measure(qR0, qR1, key='measure')来实现此输出。然而,我很难将这样的命令传递给TFQ,因为据我所知,它只测量以单个量子比特泡利门结尾的量子比特。
那么,我是不是在TFQ的功能中遗漏了什么,允许在训练过程中进行这种测量?
发布于 2020-08-24 16:18:24
从下面的代码片段开始:
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个不同的电路,我对每个电路取了两个期望值。output的[1, 0]值为:


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


output的值的形状和内容在一定程度上是由ops的形状和内容决定的。如果我想让输出的形状成为[3, 3],我只需要将另一个有效的cirq.PauliSum对象添加到ops列表中。在你的例子中,如果你想要在两个特定的cirq.GridQubit的q0和q1上得到00,01,10,11的概率,你可以这样做:
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]的任何层的输出形状。这有助于把事情弄清楚吗?
https://stackoverflow.com/questions/63549444
复制相似问题