I am trying to QCNN for MNIST classification equivalent to that built in. 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, 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.