将批处理项目中的多个图像馈送到Conv2d图层,从而改变形状

时间:2019-04-12 15:35:56

标签: python numpy tensorflow keras deep-learning

我输入的是:

[batch_size, number_of_images, img_size_x, img_size_y]

例如[24, 51, 28,28]

现在,我想通过Conv2d-Layer处理该批次项目的每个图像并收集输出。

我想使用一层来改变输入的形状

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可以正常工作,但是使用Keras功能API会遇到麻烦,因为tf.reshape的输出没有适当Layer的输出。

预先感谢

1 个答案:

答案 0 :(得分:0)

更多有关使用尺寸。假设您有一个输入和标签数组。仅出于示例目的,第一维是批处理大小的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)

请记住,如果您可以对标签进行分类,则需要调整输出层的节点。