尝试训练网络输出:max_pooling2d从1减去2导致的负尺寸大小

时间:2019-05-30 20:41:54

标签: python python-3.x tensorflow keras

尝试在形状为(256,256,3)的样本数据集上训练卷积神经网络会给我带来ValueError。

我已经检查了数据的形状(它已经在通道中了,就像tensorflow想要的那样)。我尝试过使用与其他人相同的代码,但是它不起作用。我检查了数据集,看数据格式是否正确,而且似乎没有发现任何错误。

我的CNN的代码如下:

X = pickle.load(open("X.pickle", "rb")) # Shape (256, 256, 3)
y = pickle.load(open("y.pickle", "rb")) # The labels

X = X / 255.0 # Normalizing the data

model = Sequential()
model.add(Conv2D(64, (3,3), input_shape=(256, 256, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))

model.add(Dense(1))
model.add(Activation("sigmoid"))

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

model.fit(X, y, batch_size=32, validation_split=0.1)

我希望网络运行平稳,但是会输出以下内容(由于时间太长,因此不会发布整个错误日志):

File "neuralnet.py", line 18, in <module>
    model.add(MaxPooling2D(pool_size=(2,2)))

ValueError: Negative dimension size caused by subtracting 2 from 1 for 'max_pooling2d_1/MaxPool' (op: 'MaxPool') with input shapes: [?,64,128,1].

修改 发布我的keras.json文件:

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

以前是在data_formatchannels_first和后端theano上。我已经改变了这一点,但是不得不说,我直接使用了Keras的tensorflow实现。

更改为channels_last和后端tensorflow已更改了控制台的输出,现在它在model.fit行中给出了此错误:

ValueError: You are passing a target array of shape (8118, 1) while using as loss `categorical_crossentropy`. `categorical_crossentropy` expects targets to be binary matrices (1s and 0s) of shape (samples, classes). If your targets are integer classes, you can convert them to the expected format via:
```
from keras.utils import to_categorical
y_binary = to_categorical(y_int)
```

Alternatively, you can use the loss function `sparse_categorical_crossentropy` instead, which does expect integer targets.

1 个答案:

答案 0 :(得分:0)

要解决最后一个问题,您可以使用此解决方案。

首先,将损失函数更改为"binary_crossentropy",而不是"categorical_crossentropy"。 (由于我假设有两个类,所以采用了S型激活),前提是您的数据是一键编码的。

如果您不想对数据进行一次热编码(这是将0和1转换为[1,0]和[0,1]),则可以使用“ sparse_categorical_crossentropy”,就像错误提示一样