概要
tensorflow_quantumでxorやってみた。
写真
環境
tf 2.1.0
tfq 0.2.0
cirq 0.7.0
サンプルコード
import tensorflow as tf
import tensorflow_quantum as tfq
import cirq
import sympy
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
from cirq.contrib.svg import SVGCircuit
x_train_bin = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
x_test_bin = np.array([[0, 0], [0, 1.0], [1.0, 0], [1.0, 1.0]])
y_train = np.array([[1.0], [0], [0], [1.0]])
y_test = np.array([[1.0], [0], [0], [1.0]])
def convert_to_circuit(xor):
values = np.ndarray.flatten(xor)
qubits = cirq.GridQubit.rect(2, 1)
circuit = cirq.Circuit()
for i, value in enumerate(values):
if value:
circuit.append(cirq.X(qubits[i]))
return circuit
x_train_circ = [convert_to_circuit(x) for x in x_train_bin]
x_test_circ = [convert_to_circuit(x) for x in x_test_bin]
x_train_tfcirc = tfq.convert_to_tensor(x_train_circ)
x_test_tfcirc = tfq.convert_to_tensor(x_test_circ)
class CircuitLayerBuilder():
def __init__(self, data_qubits, readout):
self.data_qubits = data_qubits
self.readout = readout
def add_layer(self, circuit, gate, prefix):
for i, qubit in enumerate(self.data_qubits):
symbol = sympy.Symbol(prefix + '-' + str(i))
circuit.append(gate(qubit, self.readout) ** symbol)
def create_quantum_model():
data_qubits = cirq.GridQubit.rect(2, 1)
readout = cirq.GridQubit(-1, -1)
circuit = cirq.Circuit()
circuit.append(cirq.X(readout))
circuit.append(cirq.H(readout))
builder = CircuitLayerBuilder(data_qubits = data_qubits, readout = readout)
builder.add_layer(circuit, cirq.XX, "xx1")
builder.add_layer(circuit, cirq.ZZ, "zz1")
circuit.append(cirq.H(readout))
return circuit, cirq.Z(readout)
model_circuit, model_readout = create_quantum_model()
model = tf.keras.Sequential([tf.keras.layers.Input(shape = (), dtype = tf.string), tfq.layers.PQC(model_circuit, model_readout), ])
model.compile(loss = tf.keras.losses.mse, optimizer = tf.keras.optimizers.Adam(), metrics = ['mae'])
y_test_tf = tf.convert_to_tensor(y_test, np.float32)
qnn_history = model.fit(x_train_tfcirc, y_test_tf, batch_size = 4, epochs = 200, verbose = 1, validation_data = (x_test_tfcirc, y_test_tf))
plt.plot(qnn_history.history['loss'])
plt.title("Learning to Control a Qubit")
plt.xlabel("Iterations")
plt.ylabel("Error in Control")
plt.show()
qnn_results = model.evaluate(x_test_tfcirc, y_test)
qnn_accuracy = qnn_results[1]
print(qnn_accuracy)
pred = model.predict(x_test_tfcirc)
print(pred)
以上。