Source code for tensorcircuit.templates.dataset

"""
Quantum machine learning related data preprocessing and embedding
"""

from typing import Any, Optional, Sequence, Tuple

import numpy as np

from ..cons import backend, dtypestr
from ..gates import array_to_tensor

Tensor = Any


[docs]def amplitude_encoding( fig: Tensor, nqubits: int, index: Optional[Sequence[int]] = None ) -> Tensor: # non-batch version # [WIP] fig = backend.reshape(fig, shape=[-1]) norm = backend.norm(fig) fig = fig / norm if backend.shape_tuple(fig)[0] < 2**nqubits: fig = backend.concat( [ fig, backend.zeros( [2**nqubits - backend.shape_tuple(fig)[0]], dtype=fig.dtype ), ], ) if index is not None: index = array_to_tensor(index, dtype="int32") fig = backend.gather1d(fig, index) fig = backend.cast(fig, dtypestr) return fig
# batched_amplitude_encoding = backend.vmap(amplitude_encoding, vectorized_argnums=0)
[docs]def mnist_pair_data( a: int, b: int, binarize: bool = False, threshold: float = 0.4, loader: Any = None, ) -> Tensor: def filter_pair(x: Tensor, y: Tensor, a: int, b: int) -> Tuple[Tensor, Tensor]: keep = (y == a) | (y == b) x, y = x[keep], y[keep] y = y == a return x, y if loader is None: import tensorflow as tf loader = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = loader.load_data() x_train, x_test = x_train[..., np.newaxis] / 255.0, x_test[..., np.newaxis] / 255.0 if binarize: x_train[x_train > threshold] = 1.0 x_train[x_train <= threshold] = 0.0 x_test[x_test > threshold] = 1.0 x_test[x_test <= threshold] = 0.0 x_train, y_train = filter_pair(x_train, y_train, a, b) x_test, y_test = filter_pair(x_test, y_test, a, b) return (x_train, y_train), (x_test, y_test)