1
$\begingroup$

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.

$\endgroup$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.