【问题标题】:Getting an error while adding a dense layer in keras在 keras 中添加密集层时出错
【发布时间】:2018-02-01 10:27:22
【问题描述】:

我试图实现一个简单的 Keras 猫狗分类器,但是在添加密集层时,它返回了一个值错误。 我使用 theano 作为后端。 代码如下:

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense

classifier = Sequential()
classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))
classifier.add(Conv2D(32, (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dense(units = 128, activation = 'relu'))

这是模型的摘要

在执行最后一行(添加密集层)时,我收到以下错误:

ValueError: ('The specified size contains a dimension with value <= 0', (-448, 128))

这是我的 keras.json 文件内容

{
    "backend": "theano",
    "image_data_format": "channels_first",
    "floatx": "float32",
    "epsilon": 1e-07
}

我找不到问题。

提前致谢!

【问题讨论】:

  • 您使用的是哪个后端?
  • @MatiasValdenegro 我将后端用作 theano

标签: python-3.x deep-learning keras conv-neural-network


【解决方案1】:

您正在跨通道维度进行卷积,尝试在卷积和池化中显式设置data_format 参数,如下所示:

classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu', data_format='channels_last'))
classifier.add(Conv2D(32, (3, 3), activation = 'relu', data_format='channels_last'))
classifier.add(MaxPooling2D(pool_size = (2, 2), data_format='channels_last'))

或重塑您的数据以具有形状(3, 64, 64)

简单来说,卷积的工作原理大致如下图所示:

您会看到灰色 过滤器 跨过图像的像素(蓝色),以提取所谓的 局部模式(绿色)。理想情况下,此过滤器的应用应沿图像的宽度和高度进行,即数据中的两个 64 维。
当我们按照惯例在通道中分割图像时,这也特别有用,通常是为了表示它们的 RGB 分量。在这种情况下,将 gif 中所示的相同过程并行应用于三个通道,并且通常可以应用于 N 个任意通道。这张图片应该有助于澄清:

长话短说,当你打电话时:

 classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))

默认情况下,Keras 认为您传递给它的是具有 64 个通道的 64 x 3 图像,并尝试进行相应的卷积。这显然是错误的并且会导致负维度(注意卷积如何缩小图像的大小)。通过指定'channels_last' 格式,您可以告诉 Keras 图像的方向(组件尺寸位于最后一个“位置”),以便它能够正确地在 64 x 64 图像中进行卷积。

【讨论】:

  • 非常感谢@Daniele Grattarola,你太棒了!添加data_format='channels_last' 有效。但是你能用蹩脚的话解释问题是什么吗?
  • 我用更长的解释更新了答案,我很高兴它起作用了。 (您也可以接受答案吗?我正在努力提高我的 SO 声誉)
【解决方案2】:

我在上面运行了你的代码,我得到的摘要与你的不同。

您应该提供更多信息,例如您使用的 keras 版本和后端...

我怀疑你的 keras.json 文件有问题

official keras page 开始,检查您的 keras.json 文件(位于您的主目录 .keras/keras.json 中)

应该是这样的

{
    "image_data_format": "channels_last",
    "image_dim_ordering": "tf",
    "epsilon": 1e-07,
    "floatx": "float32",
    "backend": "tensorflow"
}

{
    "image_data_format": "channels_last",
    "image_dim_ordering": "th",
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "theano"
}

【讨论】:

  • @loannis 我尝试将代码更改为“image_dim_ordering”:“th”,但没有奏效。默认为{ "backend": "theano", "image_data_format": "channels_last", "floatx": "float32", "epsilon": 1e-07 }
猜你喜欢
  • 2017-07-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 2020-08-17
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多