1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

tensorflow_quantumでxor

Last updated at Posted at 2020-04-26

概要

tensorflow_quantumでxorやってみた。

写真

image.png

環境

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)

以上。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?