在基于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)上多次讨论了此问题,但未提供明确的答案/解决方案。
答案 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
这绝不是解决问题的直接方法,而是一种可行的解决方法。