在keras中添加密集层时出错

时间:2018-02-01 10:27:23

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

我试图实现一个简单的Keras cat vs dog分类器,但是在添加密集层时,它会返回一个值错误。 我使用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'))

这是模型的摘要 enter image description here

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

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
}

我无法找到问题。

提前致谢!

2 个答案:

答案 0 :(得分:2)

您正在对渠道维度进行卷积,请尝试在卷积中明确设置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)

简单来说,卷积应该大致如gif所示:

enter image description here

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

enter image description here

简而言之,请致电:

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

Keras默认认为您将64 x 3 64 x 3图像传递给它,并尝试相应地进行卷积。这显然是错误的并且导致负面维度(注意卷积如何缩小图像的大小)。通过指定'channels_last'格式,您可以告诉Keras图像是如何定向的(组件维度位于最后一个&#34;位置&#34;),以便能够在整个过程中正确卷积64 x 64图像。

答案 1 :(得分:0)

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

您应该提供更多信息,例如您使用的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"
}