У вас больше проблем с вашим кодом, приведенным выше, но основная причина ошибки заключается в том, что тензор потока не поддерживает расширенную нарезку типа numpy.
На самом деле сообщение об ошибке связано с тем, что тензор потока пытается выровнять ваш входной массив по его strided-slices :
Пример для нарезанных ломтиков:
foo [5:,:,: 3] для тензора 7x8x9 эквивалентно foo [5: 7,0: 8,0: 3].
foo [:: - 1] меняет тензор с формой 8.
К сожалению, в настоящее время в Tensorflow доступна только базовая индексация типов. Расширенная индексация типов находится в стадии разработки.
Вторая проблема - неправильное изменение размера.
Tensorflow предполагает ввод 3D или 4D. Вы пытались передать 2D-изображение в `tf.image.resize_images (), которая не возвращает требуемые новые размеры изображения. Поэтому мы должны изменить исходные изображения следующим образом:
x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))
только тогда мы сможем передать их:
`x_train = tf.image.resize_images(x_train, [128, 128])
Тогда вернутся правильные размеры:
print(x_train.shape)
Из:
(60000, 128, 128, 1)
Итак, суммируя все решение, вы можете сделать это следующим образом:
import numpy as np
import tensorflow as tf
batch_size = 32
mnist = tf.keras.datasets.mnist
(x_train, _), (_, _) = mnist.load_data()
x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
x_train = tf.image.resize_images(x_train, [128, 128])
idx = np.random.randint(0, x_train.shape[0], batch_size)
imgs = [x_train[i,:,:,:] for i in idx]
Это довольно грязное "решение".
Другое, фактически реальное решение с перестройкой исходного кода, мы можем достичь того, к чему стремились в качестве обходного пути к проблеме индексации тензорного потока:
import numpy as np
import tensorflow as tf
batch_size = 32
mnist = tf.keras.datasets.mnist
(x_train, _), (_, _) = mnist.load_data()
x_train = (x_train.astype(np.float32) - 127.5) / 127.5
idx = np.random.randint(0, x_train.shape[0], batch_size)
x_train = x_train[idx]
x_train = x_train.reshape((-1, x_train.shape[1], x_train.shape[1], 1))
x_train = tf.image.resize_images(x_train, [128, 128])
print(x_train.shape)
Из:
(32, 128, 128, 1)
Вот и все!
В качестве альтернативы вместо tf.image.resize_images () вы можете использовать дополнительные графические инструменты, такие как skimage.transform.resize () из scikit-image , который возвращает данные типа массива .