无法确定Keras中卷积层的输入形状和类型

时间:2017-09-27 10:58:01

标签: python machine-learning keras conv-neural-network

我跟随this github存储库来实现简单的对象检测。在该存储库中,没有使用卷积层,但我想在Dense层之前添加两个卷积层。所以我已将model的代码更改为:

def baseline_model():
    # create model
    model = Sequential()
    model.add(Conv2D(32, (2,2), input_shape=(1, 16, 16), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Conv2D(32, (2,2), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.2))
    model.add(Flatten())
    model.add(Dense(128, activation='relu'))
    model.add(Dense(2, activation='softmax'))
    # Compile model
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    return model

此外,我还将图片的尺寸从8*8更改为16*16

所以这里我的输入数据集的维度将是(40000 * 16 * 16),其中40000是图像的数量。

现在我无法决定是使用conv1D还是conv2D。我已经阅读了this keras官方文档,但不能理解转换维度之间的关系。图层和输入数据形状。

如果我使用上面的模型配置,那么我会收到以下错误:

Error when checking input: expected conv2d_21_input to have 4 dimensions, but got array with shape (40000, 16, 16)

那么我在这里失踪了什么?一般来说,如何决定是使用conv1D还是conv2D?感谢您的帮助,我在这个领域完成了新手。

1 个答案:

答案 0 :(得分:7)

您必须正确塑造图像。所有卷积层都需要channels的额外维度。

RGB图像有3个通道。但是如果你没有频道,那么你实际上有1个频道。您必须将其显示在数据中才能生效:

#if using channels_last - the default configuration in keras
x_train = x_train.reshape(40000,16,16,1)

#if using channels_first
x_train = x_train.reshape(40000,1, 16,16)

请注意,input_shape参数必须与数据的形状完全匹配,不包括批量大小(40000)。

详细信息

对于图像,你肯定会使用2D卷积(除非你有一些非常标准的想法)。 1D卷积适用于序列。这很简单:

  • 1D卷积:时间序列,序列,音频信号等。数据仅具有“长度”。
  • 2D区域中的各种数据。图像是经典案例。它们有高度和宽度。
  • 3D各种体积数据。例如,3D图像。高度,宽度和深度。

但是,所有这些都会有channels,为输入添加额外的维度。

2D卷积层需要两种可能性,具体取决于您的keras配置:

  • 频道上次(默认):(BatchSize, pixelsX, pixelsY, channels)
  • 频道优先:(BatchSize, channels, pixelsX, pixelsY)

您没有将批量大小传递给input_shape,因此您可以使用以下方法之一:

#channels last (if you have 1 channel only, but if you have RGB, use 3 instead of 1   
model.add(Conv2D(32, (2,2), input_shape=(16, 16, 1), activation='relu'))

#channels first (if you have 1 channel only, but if you have RGB, use 3 instead of 1   
model.add(Conv2D(32, (2,2), input_shape=(1,16, 16), activation='relu'))

您可以在<yourUserFolder>/.keras/keras.json中的文件中找到您的keras默认配置。

如果需要,您还可以将单个data_format参数传递给每个卷积图层。