Точность валидации составила 0,50 при обучении сиамской сети CNN на примере Keras MNIST - PullRequest
0 голосов
/ 20 февраля 2019

При обучении сиамской сверточной нейронной сети на основе примера Keras MNIST она застревает с точностью 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 функция создает ResNet50 с дополнительнымидва слоя прямой связи 512 и 1024, все слои заморожены, за исключением нескольких незамерзших в конце.

Эта проблема неоднократно обсуждалась на разных платформах (Stackoverflow, Github и даже Reddit), но нет однозначного ответа /решение предоставлено.

1 Ответ

0 голосов
/ 20 февраля 2019

Я устранял это несколько часов назад.Хотя это не влияет на многих людей, так как этот сценарий использования довольно специфичен, те, кто затронут, могут попробовать следующее.Это сработало для меня.

Кажется, что проблема связана с неким низкоуровневым поведением 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 метода пакетной нормализации.слой.Подробнее об этом можно прочитать здесь .Установка этой версии Keras вручную исправляет это:

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

Ни в коем случае это не прямое решение проблемы, скорее обходной путь, который работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...