为什么此Keras Conv2D层与输入不兼容?

时间:2018-10-01 16:48:26

标签: python tensorflow machine-learning keras tensor

我无法理解我的第一个卷积神经网络期望输入的形状。

我的训练集是500张50x50像素的灰度图像。

enter image description here

网络始于Conv2D层。参数input_shape的文档说:

Input shape:
    4D tensor with shape:
    `(samples, channels, rows, cols)` if data_format='channels_first'
    or 4D tensor with shape:
    `(samples, rows, cols, channels)` if data_format='channels_last'.

所以我希望我需要将图像(到目前为止存储在pandas.DataFrame列中)以形状为numpy.array的{​​{1}}形式提供,因为我只有图像中的一个“彩色”通道。我将其重塑如下:

(500, 1, 50, 50)

X = np.array([img for img in imgs["img_res"]]) X = X.reshape(-1, 1, img_size, img_size) 现在是:(500、1、50、50)。我将其提供给X.shape

Conv2D

这将产生以下错误。您能指出这里有什么问题吗?

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(filters=64, 
                           kernel_size=(3,3), 
                           input_shape=X.shape[1:], 
                           activation="relu"),
])

2 个答案:

答案 0 :(得分:2)

通过将data_format='channels_first'传递给Conv2D来指定您未使用默认数据格式。

model = tf.keras.models.Sequential([
     tf.keras.layers.Conv2D(filters=64, 
                       kernel_size=(3,3), 
                       input_shape=X.shape[1:], 
                       activation="relu", 
                       data_format='channels_first'),
     ])

答案 1 :(得分:2)

您正在使用TensorFlow,默认情况下使用“最后一个通道”输入格式,这意味着通道尺寸应在末尾:

model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(filters=64, 
                       kernel_size=(3,3), 
                       input_shape=(50, 50, 1), 
                       activation="relu"),
])

发生错误是因为输入形状中的1被解释为空间维度之一,在执行卷积后产生了负维度。