首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于TensorFlow量子的多类分类

基于TensorFlow量子的多类分类
EN

Stack Overflow用户
提问于 2020-08-24 00:33:46
回答 1查看 259关注 0票数 1

我在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的功能中遗漏了什么,允许在训练过程中进行这种测量?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-24 16:18:24

从下面的代码片段开始:

代码语言:javascript
复制
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.GridQubitq0q1上得到00,01,10,11的概率,你可以这样做:

代码语言:javascript
复制
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]的任何层的输出形状。这有助于把事情弄清楚吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63549444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档