I am trying to explore using different methods of optimisation with variational classifiers. I have built mine in the style shown here, where you have an optimisation step similar too:
for batch_index in tqdm(X_batches): X_batch = X_train[batch_index] # grab out batches y_batch = y_train[batch_index] batch_cost = lambda v: cost(v, X_batch, y_batch) theta = pennylane_opt.step(batch_cost, theta)
This, until now, has worked great! However, I have tried switching out the optimiser for QNGOptimizer and now get the error:
ValueError: The objective function must either be encoded as a single QNode or a VQECost object for the natural gradient to be automatically computed. Otherwise, metric_tensor_fn must be explicitly provided to the optimizer.
Though the message is very precise, I’m not sure how to fix my code to solve the problem. This isn’t a VQE problem, so it would seem I cant create a VQECost object and have a
Therefore, do I need to restructure my classifier to use only 1 QNode? The example here uses 3 though (if number of QNodes = number of wires), while my code only has 2. Due to this, I’m not sure how to proceed this way either.
Or, have I misunderstood and I cannot use QNGOptimizer for classification problems?
If anyone has any advice on how to use QNGOptimizer with a variational classifier that would be appreciated, thanks!
Added some code for clarity:
# quantum circuit @qml.qnode(dev) def circuit(weights, x=None): AngleEmbedding(x, wires = range(n_qubits)) StronglyEntanglingLayers(weights, wires = range(n_qubits)) return qml.expval(qml.PauliZ(0)) # variational quantum classifier def variational_classifier(theta, x=None): weights = theta bias = theta return circuit(weights, x=x) + bias def cost(theta, X, expectations): e_predicted = np.array([variational_classifier(theta, x=x) for x in X]) loss = np.mean((e_predicted - expectations)**2) return loss