2
import sympy
import cirq
from cirq.contrib.svg import SVGCircuit
import tensorflow_quantum as tfq
import tensorflow as tf
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import layers
import os

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)



demo_builder=CircuitLayerBuilder(data_qubits=cirq.GridQubit.rect(32,32),readout=cirq.GridQubit(-1,1))
circuit=cirq.Circuit()
demo_builder.add_layer(circuit,gate=cirq.XX,prefix='xx')
SVGCircuit(circuit)


def create_quantum_model():
    data_qubits=cirq.GridQubit.rect(32,32)
    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)



def convert_to_circuit(filename):
    values=np.ndarray.flatten(filename)
    qubits=cirq.GridQubit.rect(32,32)
    circuit=cirq.Circuit()
    for i,value in enumerate(values):
        if value:
            circuit.append(cirq.X(qubits[i]))

    return circuit


file =np.load('CWRU_48k_load_1_CNN_data.npz')
data = file['data']
labels = file['labels']
category_labels = np.unique(labels)
labels = pd.Categorical(labels, categories = category_labels).codes
train_data, test_data, train_labels, test_labels = train_test_split(data, labels, test_size = 1000, random_state = 829, 
  stratify = labels)

# reshape data
train_data = train_data.reshape(len(train_data),32,32,1)
test_data = test_data.reshape(len(test_data),32,32,1)

#train_labels = to_categorical(train_labels)
#test_labels = to_categorical(test_labels)

x_train_circ=[convert_to_circuit(x) for x in train_data]
x_test_circ=[convert_to_circuit(x) for x in test_data]
x_train_tfcirc=tfq.convert_to_tensor(x_train_circ)
x_test_tfcirc=tfq.convert_to_tensor(x_test_circ)

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),
                           ])

index = np.random.permutation(len(train_labels))
trian_data, trian_labels = train_data[index], train_labels[index]



SVGCircuit(x_train_circ[0])

y_train_hinge=2.0*test_data-1.0
y_test_hinge=2.0*test_labels-1.0

def hinge_accuracy(y_true, y_pred):
    y_true = tf.squeeze(y_true) > 0.0
    y_pred = tf.squeeze(y_pred) > 0.0
    result = tf.cast(y_true == y_pred, tf.float32)

    return tf.reduce_mean(result)

model.compile(loss=tf.keras.losses.Hinge(),
              optimizer=tf.keras.optimizers.Adam(),
              metrics=[hinge_accuracy])

epochs=25
batch_size=16
num_examples=len(x_train_tfcirc)
x_train_tfcirc_sub=x_train_tfcirc[:num_examples]
y_train_hinge_sub=y_train_hinge[:num_examples]
history = model.fit(x=x_train_tfcirc_sub,
                         y=y_train_hinge_sub,
                         batch_size=16,
                         epochs=25,
                         verbose=1,validation_data=(x_test_tfcirc,y_test_hinge))
print(model.summary())                   
qnn_results=model.evaluate(x_test_tfcirc,test_labels)
print(qnn_results)
glS
  • 27,510
  • 7
  • 37
  • 125

0 Answers0