问题描述
本人在做kaggle项目DogsVSCats时,在使用keras定义模型时,发生了以下错误:
ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_28/MaxPool' (op: 'MaxPool') with input shapes: [?,1,32,64].
问题原因
keras提供了两种后端,一种是Theano,另一种是Tensorflow
在卷积核使用不同的内核时,由于input_shape
的格式不同会导致报错
Theano:
input_shape=(3,ROWS, COLS)
Tensorflow:
input_shape=(ROWS, COLS,3)
解决方法
将input_shape=(3,ROWS,COLS)
改为tensorflow格式:```input_shape=(ROWS,COLS,3)``
问题解决。
11.22更新:续
经过探索,前面的方法其实并不好用,是一个坑,因为后面在进行model.fit()时会报错,大致意思是由于input_shape(ROWS,COLS,3),可期望输入是(3,ROWS,COLS)。
解决办法
1. 明白是keras版本是1还是2,model.add格式要对
keras1:
model.add(Convolution2D(128, 3, 3, border_mode='same', activation='relu'))
keras2:
model.add(Convolution2D(64,(3,3), activation='relu',padding='same'))
2. 将Theano内核更改为tensorflow
Theano:
model.add(MaxPooling2D(pool_size=(2, 2)))
Tensorflow:
model.add(MaxPooling2D(pool_size=(2, 2),data_format="channels_first"))
或者:
model.add(MaxPooling2D(pool_size=(2, 2),dim_ordering="th"))
持续更新,如果您使用这个方法解决不了,欢迎您积极贡献相关问题:)