【问题标题】:Can't determine input shape and type of Convolutional Layer in Keras无法确定 Keras 中卷积层的输入形状和类型
【发布时间】:2017-09-27 10:58:01
【问题描述】:

我正在关注this github 存储库以实现简单的对象检测。在那个存储库中,没有使用卷积层,但我想在密集层之前添加两个卷积层。所以我修改了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 官方文档,但对 conv 维度之间的关系不太了解。层和输入数据形状。

如果我使用上述模型配置,则会出现以下错误:

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

那么我在这里缺少什么?通常如何决定是使用conv1D还是conv2D?感谢您的帮助,我是这个领域的新手。

【问题讨论】:

  • 您缺少张量的 channels 维度。可以这么说,如果你有一个灰度图像,可能是channels=1,RGB: 3 等等。你的卷积层需要一个 4D 张量输入,而你只提供前 3 个,batch_size, width, height。决定是使用conv1D 还是conv2D:你希望如何卷积你的网络?沿 1 维还是使用 2D 过滤器?
  • 但是如果我没有 RGB 通道怎么办?
  • 那么无论你有多少频道

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


【解决方案1】:

你必须正确地塑造你的图像。所有卷积层都期望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 卷积(除非您有一些花哨的非标准想法)。一维卷积适用于序列。很简单:

  • 一维卷积:时间序列、序列、音频信号等。数据只有“长度”。
  • 一个区域的二维各种数据。图像是经典案例。它们有高度和宽度。
  • 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 参数传递给每个卷积层。

【讨论】:

  • Conv2D in keras 还公开了参数data_format,如果您不想手动重新排列它们,则允许您指定输入形状尺寸的顺序。 (keras.io/layers/convolutional)
  • 是的,答案就在其中:)
  • 哦,糟糕,一定是跳过了最后一行!
  • 很棒的细节!让我试试这些东西,我会接受答案! +1 解释。
猜你喜欢
  • 1970-01-01
  • 2017-10-06
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
相关资源
最近更新 更多