根据Keras MNIST示例训练CNN暹罗网络时,验证准确性停留在0.50

时间:2019-02-20 15:03:31

标签: python keras conv-neural-network

在基于Keras MNIST example的暹罗卷积神经网络上进行训练时,其验证精度停留在0.50。而且,训练和验证损失减少,而训练准确性也徘徊在0.50左右。

创建暹罗网络的代码与此类似:

input_shape = x_train.shape[2:]
print('input_shape:',input_shape)
# network definition
base_network = create_base_network(input_shape)

input_a = Input(shape=input_shape)
input_b = Input(shape=input_shape)

# because we re-use the same instance `base_network`,
# the weights of the network
# will be shared across the two branches
processed_a = base_network(input_a)
processed_b = base_network(input_b)

distance = Lambda(euclidean_distance,
                  output_shape=eucl_dist_output_shape)([processed_a, processed_b])

model = Model([input_a, input_b], distance)

create_base_network函数创建带有两个前馈层512和1024的ResNet50的地方,所有层都是冻结的,最后只有几个未冻结的层。

已在多个平台(Stackoverflow,Github甚至Reddit)上多次讨论了此问题,但未提供明确的答案/解决方案。

1 个答案:

答案 0 :(得分:0)

我已经排除了几个小时的故障。尽管此用例非常具体,但这并不会影响很多人,但受影响的人可以尝试遵循。它对我有用。

问题似乎与Python 3.5的某些低级行为有关,超出了我的理解范围。切换到Python 2.7可以解决问题,并且网络从一开始就可以达到70%以上的准确性。在此之前,即使经过10个时间段,准确性仍然停留在50%。

Train on 36000 samples, validate on 4000 samples
Epoch 1/10
36000/36000 [==============================] - 866s 24ms/step - loss: 0.2026 - accuracy: 0.7133 - val_loss: 0.2054 - val_accuracy: 0.7173

Epoch 00001: val_loss improved from inf to 0.20544, saving model to model_checkpoint/siamese_40k_headache_20thFeb-1.hdf5
Epoch 2/10
36000/36000 [==============================] - 770s 21ms/step - loss: 0.1949 - accuracy: 0.7271 - val_loss: 0.2020 - val_accuracy: 0.7235

Epoch 00002: val_loss improved from 0.20544 to 0.20204, saving model to model_checkpoint/siamese_40k_headache_20thFeb-1.hdf5
Epoch 3/10
 7040/36000 [====>.........................] - ETA: 9:12 - loss: 0.1879 - accuracy: 0.7320

此外,当使用转移学习训练暹罗网络时,验证准确性停留在0.50可能还与Keras的批标准化层的实现有关。有关here的更多信息,请阅读。手动安装此版本的Keras可以解决此问题:

!pip install -U --force-reinstall --no-dependencies git+https://github.com/datumbox/keras@fork/keras2.2.4

这绝不是解决问题的直接方法,而是一种可行的解决方法。