Hi!
I resize the MNIST images to 16x16 and run a quantum circuit.
If I use AmplitudeEmbedding and set analytic=False
, I get a numpy error.
I assume this is a probability accuracy issue.
mnist_20200721_numpy_error.txt (31.6 KB) → Please change the file extension to “ipynb”.
Is there a workaround?
error message:
ValueError: probabilities do not sum to 1
Hey snuffkin!
You uncovered a very interesting bug there!
What seems to happen is that the conversion from tf tensors to numpy arrays creates an ndarray
of data type float32
. I suspect that with this lower precision, the automatic normalisation of the AmplitudeEmbedding
method creates a quantum state vector which does not pass the checks of numpy’s np.random.choice
(which is used for sampling measurement results in "default.qubit"
) for a probability distribution to be normalised.
As a fix, you’d need to convert your array to float64
:
n_qubits = 8
dev = qml.device("default.qubit", wires=n_qubits, shots=10, analytic=False)
# quantum circuit
@qml.qnode(dev)
def circuit(features=None):
qml.templates.AmplitudeEmbedding(features, range(n_qubits), normalize=True)
return qml.expval(qml.PauliZ(0))
circuit(features=x_train[0].flatten().astype('float64'))
Interestingly, at least for the latest PL version I tested this with, assigning the training data point to a new variable seems to do the conversion automatically.
n_qubits = 8
dev = qml.device("default.qubit", wires=n_qubits, shots=10, analytic=False)
x = x_train[0].flatten()
print(x.dtype) # 'float64'
# quantum circuit
@qml.qnode(dev)
def circuit(features=None):
qml.templates.AmplitudeEmbedding(features, range(n_qubits), normalize=True)
return qml.expval(qml.PauliZ(0))
circuit(features=x)
Hope this helps!
2 Likes
Hi @Maria_Schuld,
Thanks for your response!
With your support, my program works.
PennyLane is easy to use and fun to use.