Tensorflow - keras - Сформировать ошибки с помощью 'strided_slice' (используется измененный набор данных MNIST) - PullRequest
0 голосов
/ 12 ноября 2018

Я собираюсь создать тестер GAN-Model, используя tf.keras с набором цифр, написанных от руки MNIST. Поскольку моя модель будет использоваться в изображениях 128x128, я изменил размер набора данных MNIST до 128x128x1. но программа делает некоторые ошибки, которых я никогда не видел.

(x_train, _), (_, _) = mnist.load_data()
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)  # picks some data, count is batch_size=32.
imgs = x_train[idx]  # This line made errors

Последняя строка сделала две ошибки:

tenorflow.python.framework.errors_impl.InvalidArgumentError: Shape должен быть рангом 1, но рангом 2 для 'strided_slice_1' (op: 'StridedSlice') с входными фигурами: [60000,128,128,1], [1,32] , [1,32], [1].

и

ValueError: Shape должен иметь ранг 1, но является рангом 2 для 'strided_slice_1' (op: 'StridedSlice') с входными формами: [60000,128,128,1], [1,32], [1,32], [ 1].

Я думаю, что число «32» означает batch_size (= 32).

Я пытался найти об этой ошибке, но я не мог найти, как эта ошибка.

У меня нет идей для решения этой проблемы (потому что я начал использовать керас неделю назад, до того, как использовал pytorch).

1 Ответ

0 голосов
/ 13 ноября 2018

У вас больше проблем с вашим кодом, приведенным выше, но основная причина ошибки заключается в том, что тензор потока не поддерживает расширенную нарезку типа 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 , который возвращает данные типа массива .

...