0

我用tensorflow量子创建了一个量子神经网络,它的输入是一个由电路转换的张量。关于这个输入电路,我发现如果电路的参数也是用张量指定的,那么量子神经网络是无法训练的。

使用正常参数时的电路可以使网络正常训练

theta_g=1
blob_size = abs(1 - 4) / 5
spread_x = np.random.uniform(-blob_size, blob_size)
spread_y = np.random.uniform(-blob_size, blob_size)
angle = theta_g + spread_y
cir=cirq.Circuit(cirq.ry(-angle)(qubit), cirq.rx(-spread_x)(qubit))
discriminator_network(tfq.convert_to_tensor([cir]))

但是当我使用以下代码时,无法训练量子神经网络

theta_g=tf.constant([1])
blob_size = abs(1 - 4) / 5
spread_x = np.random.uniform(-blob_size, blob_size)
spread_y = np.random.uniform(-blob_size, blob_size)
spred_x = tf.constant(spread_x)
spred_y = tf.constant(spread_y)
angle = theta_g + spread_y
cir=cirq.Circuit(cirq.ry(-angle)(qubit), cirq.rx(-spread_x)(qubit))
discriminator_network(tfq.convert_to_tensor([cir]))

** disciminator_network **

def discriminator():
    theta = sympy.Symbol('theta')
    q_model = cirq.Circuit(cirq.ry(theta)(qubit))
    q_data_input = tf.keras.Input(
        shape=(), dtype=tf.dtypes.string)
    expectation = tfq.layers.PQC(q_model, cirq.Z(qubit))
    expectation_output = expectation(q_data_input)

    classifier = tf.keras.layers.Dense(1, activation=tf.keras.activations.sigmoid)
    classifier_output = classifier(expectation_output)
    model = tf.keras.Model(inputs=q_data_input, outputs=classifier_output)
    return model
4

1 回答 1

0

如果无法看到您遇到的错误的痕迹,我会说我认为您在第二个片段中遇到的问题是您已将tf.constant对象放入cirq.Circuit. 您的第一个示例有效的原因是 cirq.Circuits 知道如何解释来自 np.float32 数据类型的值。Cirq 不知道如何解释来自 tf.float32 (或任何 tf.dtypes.* )的值。

TensorFlow Quantum 将 tensorflow 数据类型与 cirq.Circuit 对象接口的入口点是通过解析sympy.Symboltfq 本机操作中电路内部的值(您在创建 .Circuit 时已完成tfq.layers.PQC)。

这有助于澄清事情吗?

-迈克尔

于 2020-09-25T20:26:01.513 回答