使用Tensorflow训练Qiskit电路
为了探索是否有可能用tensorflow训练Qiskit量子电路,我建立了一个小玩具模型。 该玩具模型的目的是通过tensorflow找到正确的角度,以获得独立于输入的“零”输出使用Tensorflow训练Qiskit电路,tensorflow,keras,quantum-computing,qiskit,Tensorflow,Keras,Quantum Computing,Qiskit,为了探索是否有可能用tensorflow训练Qiskit量子电路,我建立了一个小玩具模型。 该玩具模型的目的是通过tensorflow找到正确的角度,以获得独立于输入的“零”输出 import numpy as np import qiskit from qiskit.circuit import QuantumCircuit, QuantumRegister import tensorflow as tf from tensorflow.keras.layers import Input, D
import numpy as np
import qiskit
from qiskit.circuit import QuantumCircuit, QuantumRegister
import tensorflow as tf
from tensorflow.keras.layers import Input, Dense, Layer
def QuantumCircuit(thetas, n_qubits=1):
simulator = qiskit.Aer.get_backend('qasm_simulator')
shots=1024
circuit= qiskit.QuantumCircuit(n_qubits)
circuit.h(0)
circuit.ry(float(thetas),0)
circuit.measure_all()
job = qiskit.execute(circuit,backend=simulator,shots=shots)
result = job.result().get_counts(circuit)
counts = np.array(list(result.values()))
states = np.array(list(result.keys())).astype(float)
# Compute probabilities for each state
probabilities = counts / shots
# Get state expectation
expectation = np.sum(states * probabilities)
return np.array(expectation)
class Linear(Layer):
def __init__(self,units=1,input_dim=1):
super(Linear,self).__init__()
self.w = self.add_weight(shape=(input_dim,units),initializer='random_uniform', trainable=True)
def call(self, inputs, input_dim=1):
if (tf.executing_eagerly()):
return QuantumCircuit(self.w)
return inputs
x_train = np.arange(10)
y_train = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
inputs=Input(shape=(1,))
outputs=Linear()(inputs)
model=tf.keras.models.Model(inputs=inputs,outputs=outputs)
model.summary()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.MeanSquaredError())
model.fit(x_train, y_train, epochs=100, batch_size=1, verbose=1)
不幸的是,玩具模型不工作,我得到以下错误:
优化器_v2.py:1219_过滤器_梯度
([v.name代表u,v在grads和vars中],)
ValueError:没有为任何变量提供渐变:['variable:0']
所以我试着“自己”计算梯度:
作为量子电路被调用之前的中间步骤。但这两者都不起作用:-(
是否有人有其他想法将Qiskit电路插入tensorflow,并处理tensorflow的自动微分框架在这种情况下不起作用的事实?
非常感谢
@tf.custom_gradient
def custom_activation(w):
result = QuantumCircuit(w)
def grad(dy):
eps=0.0001
result1=QuantumCircuit(w)
result2=QuantumCircuit(w+eps)
grad=(result2-result1)/eps
return dy * [grad]
return result, grad