Hello,
I am trying to QCNN for MNIST classification equivalent to that built in Torch Connector and Hybrid QNNs - Qiskit Machine Learning 0.7.2
I’m having problems trying to pass my quantum circuit built with cirq as a keras layer. Here’s what I have:
# Parameters that the classical NN will feed values into.
control_params = sympy.symbols('theta_1 theta_2 theta_3 theta_4')
# Create the parameterized circuit.
qubits = cirq.GridQubit.rect(2,1)
model_circuit = cirq.Circuit(
cirq.rx(control_params[0])(qubits[0]),
cirq.rx(control_params[1])(qubits[1]),
cirq.rx(control_params[2])(qubits[0]),
cirq.rx(control_params[3])(qubits[1]),
cirq.CNOT(qubits[0],qubits[1]))
qlayer = tfq.convert_to_tensor([model_circuit])
SVGCircuit(model_circuit)
width = np.shape(x_train)[1]
height = np.shape(x_train)[2]
model = tf.keras.Sequential([
tf.keras.layers.Input(shape=(width, height, 1)), # Specify the input shape correctly
tf.keras.layers.Conv2D(filters=2, kernel_size=5),
tf.keras.layers.Conv2D(filters=16, kernel_size=5),
tf.keras.layers.SpatialDropout2D(rate=0.2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(2, activation='relu'),
tfq.layers.PQC(model_circuit, [cirq.Z(qubits[1])]) # Use qubits[1] for measurement
])
Which returns the error:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[72], line 26
2 height = np.shape(x_train)[2]
7 # model = tf.keras.Sequential([
8
9 # # tf.keras.layers.Input(shape=(()), dtype=tf.string), #, dtype=tf.string (28,28,1)
(...)
23
24 # ])
---> 26 model = tf.keras.Sequential([
27 tf.keras.layers.Input(shape=(width, height, 1)), # Specify the input shape correctly
28 tf.keras.layers.Conv2D(filters=2, kernel_size=5),
29 tf.keras.layers.Conv2D(filters=16, kernel_size=5),
30 tf.keras.layers.SpatialDropout2D(rate=0.2),
31 tf.keras.layers.Flatten(),
32 tf.keras.layers.Dense(64, activation='relu'),
33 tf.keras.layers.Dense(2, activation='relu'),
34 tfq.layers.PQC(model_circuit, [cirq.Z(qubits[1])]) # Use qubits[1] for measurement
35 ])
File ~/.local/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py:530, in no_automatic_dependency_tracking.<locals>._method_wrapper(self, *args, **kwargs)
528 self._self_setattr_tracking = False # pylint: disable=protected-access
529 try:
--> 530 result = method(self, *args, **kwargs)
531 finally:
532 self._self_setattr_tracking = previous_value # pylint: disable=protected-access
File ~/.local/lib/python3.8/site-packages/keras/utils/traceback_utils.py:67, in filter_traceback.<locals>.error_handler(*args, **kwargs)
65 except Exception as e: # pylint: disable=broad-except
66 filtered_tb = _process_traceback_frames(e.__traceback__)
---> 67 raise e.with_traceback(filtered_tb) from None
68 finally:
69 del filtered_tb
File ~/.local/lib/python3.8/site-packages/tensorflow/python/autograph/impl/api.py:699, in convert.<locals>.decorator.<locals>.wrapper(*args, **kwargs)
697 except Exception as e: # pylint:disable=broad-except
698 if hasattr(e, 'ag_error_metadata'):
--> 699 raise e.ag_error_metadata.to_exception(e)
700 else:
701 raise
TypeError: Exception encountered when calling layer "pqc_38" (type PQC).
in user code:
File "/home/zhk26714/.local/lib/python3.8/site-packages/tensorflow_quantum/python/layers/high_level/pqc.py", line 299, in call *
model_appended = self._append_layer(inputs, append=tiled_up_model)
File "/home/zhk26714/.local/lib/python3.8/site-packages/keras/utils/traceback_utils.py", line 67, in error_handler **
raise e.with_traceback(filtered_tb) from None
TypeError: Exception encountered when calling layer "add_circuit_40" (type AddCircuit).
in user code:
File "/home/zhk26714/.local/lib/python3.8/site-packages/tensorflow_quantum/python/layers/circuit_construction/elementary.py", line 128, in call *
return tfq_utility_ops.append_circuit(inputs, append)
File "/home/zhk26714/.local/lib/python3.8/site-packages/tensorflow_quantum/core/ops/tfq_utility_ops.py", line 65, in append_circuit *
return UTILITY_OP_MODULE.tfq_append_circuit(programs, programs_to_append)
File "<string>", line 73, in tfq_append_circuit **
TypeError: Input 'programs' of 'TfqAppendCircuit' Op has type float32 that does not match expected type of string.
Call arguments received:
• inputs=tf.Tensor(shape=(None, 2), dtype=float32)
• append=tf.Tensor(shape=(None,), dtype=string)
• prepend=None
Call arguments received:
• inputs=tf.Tensor(shape=(None, 2), dtype=float32)
The documentation on QCNNs using tensorflow is pretty limited (Quantum Convolutional Neural Network | TensorFlow Quantum) and instead here they are actually using the quantum layer to reduce dimensionality which I’m not trying to do.
Any help would be greatly appreciated.