-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathboston_housing.py
86 lines (73 loc) · 3.28 KB
/
boston_housing.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import tensorflow_quantum as tfq
import tensorflow as tf
import cirq
import sympy
import numpy as np
from sklearn import datasets as ds
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
x, y = ds.load_boston(return_X_y=True)
x = MinMaxScaler().fit_transform(x)
y = (y - np.min(y)) / (np.max(y) - np.min(y))
# Classical NN
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=.2, random_state=43)
blob_nn = tf.keras.models.Sequential([
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(1)
])
blob_nn.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=3e-3))
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
c_history = blob_nn.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test), callbacks=[callback])
# Quantum NN
def convert_data(data, qubits, test=False):
cs = []
for i in data:
cir = cirq.Circuit()
for j in range(len(qubits)):
cir += cirq.rx(i[j] * np.pi).on(qubits[j])
cir += cirq.ry(i[j] * np.pi).on(qubits[j])
cs.append(cir)
if test:
return tfq.convert_to_tensor([cs])
return tfq.convert_to_tensor(cs)
def encode(data, labels, qubits):
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=.2, random_state=43)
return convert_data(X_train, qubits), convert_data(X_test, qubits), y_train, y_test
def layer(circuit, qubits, params):
for i in range(len(qubits)):
if i + 1 < len(qubits):
circuit += cirq.CNOT(qubits[i], qubits[i + 1])
circuit += cirq.ry(params[i * 2]).on(qubits[i])
circuit += cirq.rz(params[i * 2 + 1]).on(qubits[i])
circuit += cirq.CNOT(qubits[-1], qubits[0])
return circuit
def model_circuit(qubits, depth):
cir = cirq.Circuit()
num_params = depth * 2 * len(qubits)
params = sympy.symbols("q0:%d"%num_params)
for i in range(depth):
cir = layer(cir, qubits, params[i * 2 * len(qubits):i * 2 * len(qubits) + 2 * len(qubits)])
return cir
qs = [cirq.GridQubit(0, i) for i in range(13)]
d = 3
X_train, X_test, y_train, y_test = encode(x, y, qs)
c = model_circuit(qs, d)
print(c)
readout_operators = [cirq.Z(qs[0])]
inputs = tf.keras.Input(shape=(), dtype=tf.dtypes.string)
#layer1 = tfq.layers.PQC(c, readout_operators, repetitions=32, differentiator=tfq.differentiators.ParameterShift())(inputs)
layer1 = tfq.layers.PQC(c, readout_operators, differentiator=tfq.differentiators.Adjoint())(inputs)
vqc = tf.keras.models.Model(inputs=inputs, outputs=layer1)
vqc.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=3e-3))
callback = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)
v_history = vqc.fit(X_train, y_train, epochs=100, batch_size=32, validation_data=(X_test, y_test), callbacks=[callback])
plt.plot(v_history.history['loss'], label='Quantum Training Loss')
plt.plot(v_history.history['val_loss'], label='Quantum Validation Loss')
plt.plot(c_history.history['loss'], label='Classical Training Loss')
plt.plot(c_history.history['val_loss'], label='Classical Validation Loss')
plt.legend()
plt.show()
plt.savefig("boston_housing")