Tensorflow - keras - Ошибки формы с 'strided_slice' (используется набор данных MNIST с измененным размером)

Я собираюсь создать тестер модели GAN, используя 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: фигура должна иметь ранг 1, но ранг 2 для 'strided_slice_1' (op: 'StridedSlice') с входными формами: [60000,128,128,1], [1,32], [1 , 32], [1].

а также,

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

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

Я пытался найти информацию об этой ошибке, но мне не удалось найти такую ​​ошибку.

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


person Xsolute Im    schedule 12.11.2018    source источник
comment
что такое (1,32), 32 - это не размер партии? Пожалуйста, распечатайте (idx).   -  person Geeocode    schedule 12.11.2018
comment
idx - это список размера batch_size со случайными целочисленными значениями. он используется при получении 32 случайных данных MNIST. пример: [35904 26046 21148 28562 56414 31930 44948 53721 2118 30226 6292 57618 39161 46354 9053 46421 44620 36931 8266 48759 42023 40365 33027 13278 57609 3804 57904 4377 3517 30322 16445 47825]   -  person Xsolute Im    schedule 12.11.2018
comment
Я думаю, что ваш idx, если вы его напечатаете, будет иметь форму (1,32) из ​​сообщения об ошибке, поэтому я попросил вас распечатать его.   -  person Geeocode    schedule 12.11.2018
comment
Результат print (idx) - это пример выше, поэтому я напечатал idx.shape: (32,).   -  person Xsolute Im    schedule 13.11.2018
comment
вы написали: imgs = x_train [idx] # В этой строке были ошибки, а не в print (idx)   -  person Geeocode    schedule 13.11.2018
comment
Я попробовал отладить, остановился на последней строке, вызывающей ошибку. Я приблизился к тому, чтобы значение x_train было Tensor (ResizeBilinear: 0, shape = (60000, 128, 128, 1), dtype = float32). Это вызывает проблемы (что x_train не является ndarray, тензором) для нарезки некоторых случайных данных?   -  person Xsolute Im    schedule 13.11.2018
comment
подожди немного добавлю решение   -  person Geeocode    schedule 13.11.2018


Ответы (1)


У вас больше проблем с приведенным выше кодом, но основная причина ошибки заключается в том, что тензорный поток не поддерживает расширенную срезку типа numpy. На самом деле сообщение об ошибке связано с тем, что тензорный поток пытается выровнять ваш входной массив в своих полосатых срезах :

Пример полосатых срезов:

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, который возвращает данные типа массива numpy. .

person Geeocode    schedule 13.11.2018
comment
Я не знал о развитии тензорного потока. У меня возникла идея исправить эти проблемы! Большое спасибо! - person Xsolute Im; 13.11.2018
comment
Ваш код успешно сработал. Теперь мне нужно только исправить структуру моих исходных кодов. Спасибо за помощь. - person Xsolute Im; 13.11.2018