Внезапное падение точности на 50% во время тренировки сверточного NN - PullRequest
5 голосов
/ 16 марта 2019

Обучение сверточной нейронной сети с нуля на моем собственном наборе данных с Keras и Tensorflow.

learning rate = 0.0001, 5 классов для сортировки, не используется Dropout, набор данных проверен дважды, неправильные метки не найдены

Модель:

model = models.Sequential()
model.add(layers.Conv2D(16,(2,2),activation='relu',input_shape=(75,75,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(16,(2,2),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(32,(2,2),activation='relu'))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(128,activation='relu'))
model.add(layers.Dense(5,activation='sigmoid'))

model.compile(optimizer=optimizers.adam(lr=0.0001),
             loss='categorical_crossentropy',
             metrics=['acc'])

history = model.fit_generator(train_generator,
                              steps_per_epoch=100,
                              epochs=50,
                              validation_data=val_generator,
                              validation_steps=25)

Каждый раз, когда модель достигает 25-35 эпох (точность 80-90%), это происходит:

Epoch 31/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3524 - acc: 0.8558 - val_loss: 0.4151 - val_acc: 0.7992
Epoch 32/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3393 - acc: 0.8700 - val_loss: 0.4384 - val_acc: 0.7951
Epoch 33/50
100/100 [==============================] - 3s 34ms/step - loss: 0.3321 - acc: 0.8702 - val_loss: 0.4993 - val_acc: 0.7620
Epoch 34/50
100/100 [==============================] - 3s 33ms/step - loss: 1.5444 - acc: 0.3302 - val_loss: 1.6062 - val_acc: 0.1704
Epoch 35/50
100/100 [==============================] - 3s 34ms/step - loss: 1.6094 - acc: 0.2935 - val_loss: 1.6062 - val_acc: 0.1724

Есть некоторые похожие проблемы с ответами, но в основном онирекомендуем снизить скорость обучения, но это совсем не помогает.

Accuracy Drop

UPD: почти все веса и смещения в сети стали nan.Сеть как-то умерла внутри

1 Ответ

0 голосов
/ 17 марта 2019

Решение в этом случае:

Я изменил sigmoid функцию в последнем слое на softmax функцию и капли пропали

Почему это сработало?

sigmoid функция активации используется для бинарных (двухклассовых) классификаций.В задачах мультиклассификации мы должны использовать функцию softmax - специальное расширение функции sigmoid для задач мультиклассификации.

Дополнительная информация: Sigmoid vs Softmax

Особая благодарность @пустыненав и @Shubham Panchal для индикации ошибок

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