【发布时间】:2017-10-08 03:32:23
【问题描述】:
我尝试训练 CNN 对高度 = 2 和宽度 = 1000 像素(可能不常见)形状的图像进行二进制分类。我的第一种方法是一个小而简单的 CNN,编码如下:
def cnn_model_01():
model = Sequential()
# Assembly of layers
model.add(Conv2D(16, (2, 2), input_shape=(1, 2, 1000), activation='relu'))
model.add(MaxPooling2D(pool_size=(1, 1)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
# Compilation of model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
model = cnn_model_01()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=200, verbose=2)
NN 的准确性和预测会产生一个简单地反映样本中值分布的值。典型的训练输出是
13s - loss: 0.7772 - acc: 0.5680 - val_loss: 0.6657 - val_acc: 0.6048
Epoch 2/5
15s - loss: 0.6654 - acc: 0.5952 - val_loss: 0.6552 - val_acc: 0.6048
Epoch 3/5
15s - loss: 0.6514 - acc: 0.5952 - val_loss: 0.6396 - val_acc: 0.6048
Epoch 4/5
15s - loss: 0.6294 - acc: 0.5952 - val_loss: 0.6100 - val_acc: 0.6048
Epoch 5/5
13s - loss: 0.5933 - acc: 0.6116 - val_loss: 0.5660 - val_acc: 0.6052
这样做的原因是 NN 将所有输入样本分配给一个类。因此,在样本以这种方式分布的情况下,大约有三分之二是偶然正确的。
为了解决问题并让 NN 产生更好的结果,我检查了输出并发现这些值的区间或域相对较小,例如在 [0.55;0.62] 之间。我试图映射resp。将此间隔调整为 [0;1]。结果,a 的准确率非常好,约为 99%。我已经“手动”完成了这个映射:从每个值中减去数组的最小值,然后除以最大值和最小值的差。
我可以在 Keras 中实现这个映射吗?有这个功能的层吗?
或者我对层做了什么完全错误/不可取的事情,导致输出的间隔很窄?
【问题讨论】:
-
标准化输入和输出是您必须做的事情,没有它,训练 NN 要困难得多。
-
是的,我很清楚。然而,我的印象是 Keras 或多或少是神经网络的综合接口。我已经实现了神经网络,例如Java 和 MatLab。在这些语言中,很明显要注意这种预处理和后处理。所以,我对 Keras 的感觉有点不同。不过,这绝对没问题,现在我知道该怎么做了。
标签: python keras conv-neural-network keras-layer