Подача нескольких изображений в пакетном элементе на слой Conv2d, проблема с изменением формы - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть вход:

[batch_size, number_of_images, img_size_x, img_size_y]

например. [24, 51, 28,28]

Теперь я хочу обработать каждое изображение элемента пакета через слой Conv2d и собрать выходные данные.

Я хотел бы изменить ввод, используя слой

tf.keras.layer.Reshape(1,28,28)

чтобы получить что-то вроде [1224, 1, 28, 28]

который я могу обработать.

Это минимальный пример для воспроизведения ошибки

import numpy as np
import tensorflow as tf
tf.enable_eager_execution()

input_data = np.ones((24, 51, 28, 28))
output_data = np.ones((24, 10))

inp_layer = tf.keras.layers.Input(shape=(51, 28, 28))
res1 = tf.keras.layers.Reshape((1, 28, 28))(inp_layer)
perm1 = tf.keras.layers.Permute((2, 3, 1))(res1)
cnn1 = tf.keras.layers.Conv2D(64, 3, padding="same", activation='relu')(perm1)
flat = tf.keras.layers.Flatten()(cnn1)
fc1 = tf.keras.layers.Dense(10)(flat)

model = tf.keras.Model(inputs=inp_layer, outputs=fc1)
model.compile(optimizer=tf.train.AdamOptimizer(0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(input_data, output_data, batch_size=24, verbose=1)

Я предполагаю из следующей ошибки, что этот слой изменения формы запрашивает ввод в виде [24, 1, 28, 28], но мне нужно передать [24, 51, 1, 28, 28]

tensorflow.python.framework.errors_impl.InvalidArgumentError: 
Input to reshape is a tensor with 959616 values, but the requested shape has 18816
[[{{node Reshape}}]] [Op:StatefulPartitionedCall]

У вас есть какие-либо рекомендации или вы видите другую возможность структурировать мою модель?

Если я использую tf.reshape, это работает нормально, но у меня возникают проблемы с использованием функционального API Keras, поскольку вывод tf.reshape не является выводом надлежащего слоя.

Заранее спасибо

1 Ответ

0 голосов
/ 12 апреля 2019

Это больше о работе с размерами.Предположим, у вас есть входные данные и массивы меток.Первое измерение в 10 раз больше размера партии только для примера.

input_data = np.ones((240, 51, 28, 28))
output_data = np.ones((240, 10))

Сначала необходимо изменить порядок измерений.Это описано вторым аргументом.

reshaped_input = tf.transpose(input_data, [0, 2, 3, 1]) #This outputs (240, 28, 28, 51)

Если у вас есть 51 отдельный массив форм (28,28,1), вы можете объединить их.Если вам нужно объединить метки, используйте ту же самую операцию.

tf.concat([input_data for i in range(51)], axis=-1)
batch_size = 24
inp_layer = tf.keras.layers.Input(shape=(28, 28, 51))
cnn1 = tf.keras.layers.Conv2D(64, 3, padding="same", activation='relu')(inp_layer)
flat = tf.keras.layers.Flatten()(cnn1)
fc1 = tf.keras.layers.Dense(10)(flat)

model = tf.keras.Model(inputs=inp_layer, outputs=fc1)
model.compile(optimizer=tf.optimizers.Adam(0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(reshaped_input, output_data, batch_size=batch_size, verbose=1)

Помните, что если вы можете канкатить метки, вам нужно настроить узлы выходного слоя.

...