У меня есть вход:
[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))
input_label = np.ones((24, 51, 10))
output_data = np.ones((24, 10))
inp_layer = tf.keras.layers.Input(shape=(51, 28, 28))
input_batch_label = tf.keras.layers.Input(shape=(51, 10))
res1 = tf.keras.layers.Reshape((1, 28, 28), name="reshape1")(inp_layer)
perm1 = tf.keras.layers.Permute((2, 3, 1))(res1)
cnn1 = tf.keras.layers.Conv2D(64, 3, padding="same", activation='relu')(perm1)
max1 = tf.keras.layers.MaxPooling2D(16, 16, padding="valid")(cnn1)
res2 = tf.keras.layers.Reshape((51, 64))(max1)
combined_input = tf.keras.layers.concatenate([res2, input_batch_label], axis=-1, )
flat = tf.keras.layers.Flatten()(combined_input)
fc1 = tf.keras.layers.Dense(10)(flat)
model = tf.keras.Model(inputs=[inp_layer, input_batch_label], outputs=fc1)
model.compile(optimizer=tf.train.AdamOptimizer(0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
model.fit([input_data, input_label], 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 не является выводом правильного слоя.
Заранее спасибо