我试图实现一个简单的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'))
执行最后一行(添加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
}
我无法找到问题。
提前致谢!
答案 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所示:
您会看到灰色过滤器跨越图像的像素(蓝色),以便提取所谓的本地模式(在绿色中) )。理想情况下,此滤镜的应用应沿图像的宽度和高度进行,即数据中的两个64维 当按照惯例,我们在通道中分割图像时,这通常也是特别有用的,通常用于表示它们的RGB分量。在这种情况下,gif中所示的相同处理被并行地应用于三个通道,并且通常可以应用于N个任意通道。这张图片应该有助于澄清:
简而言之,请致电:
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"
}