Я тренирую полный CNN на трехмерных данных, и я получаю NaN в потере обучения - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь обучить полный CNN на трехмерных данных (я использую conv3D). Во-первых, некоторый контекст, чтобы понять. вход представляет собой трехмерную матрицу, которая представляет карту плотности белка, а выход представляет собой трехмерную матрицу, где местоположения C-альфа обозначены как 1, а остальные обозначены как 0. Как и ожидалось, это приводит к огромному дисбалансу данных. Поэтому я реализовал пользовательскую функцию кросс-энтропийной стоимости, которая фокусирует модель на class = 1, как показано ниже: функция пользовательских затрат Эти карты имеют тенденцию быть большими, поэтому время обучения имеет тенденцию экспоненциально увеличиваться с небольшим увеличением размера карты или, если я делаю свою сеть немного глубже. В дополнение к этому, большая часть карты является пустым пространством, но я должен сохранить ее, чтобы поддерживать реальное расстояние между различными местоположениями C-alpha. Чтобы обойти эту проблему, я разбил каждую карту на более мелкие блоки измерения (5,5,5). Преимущество этого подхода заключается в том, что я могу игнорировать пустое пространство, что значительно уменьшает объем памяти и вычислений, необходимых для обучения. Проблема, с которой я столкнулся сейчас, заключается в том, что я теряю NaN при потере обучения, и обучение прекращается, как показано ниже: Сетевое обучающее поведение

это сеть, которую я использую:

model = Sequential()
model.add(Conv3D(15, kernel_size=(3,3,3), activation='relu', input_shape=(5,5,5,1), padding='same'))
model.add(Conv3D(30, kernel_size=(3,3,3), activation='relu', padding='same'))
model.add(Conv3D(60, kernel_size=(3,3,3), activation='relu', padding='same'))
model.add(Conv3D(30, kernel_size=(3,3,3), activation='relu', padding='same'))
model.add(Conv3D(15, kernel_size=(3,3,3), activation='relu', padding='same'))
model.add(Conv3D(1, kernel_size=(3,3,3), activation='sigmoid', padding='same'))
model.compile(loss=weighted_cross_entropp_loss, optimizer='nadam',metrics=['accuracy'])

############# model training ######################################
model.fit(x_train, y_train, batch_size=32, epochs=epochs, verbose=1,validation_split=0.2,shuffle=True,callbacks=[stop_immediately,save_best_model,stop_here_please])
model.save('my_map_model_weighted_custom_box_5.h5')  

Может кто-нибудь, пожалуйста, помогите мне, я работал над этой проблемой в течение многих многих недель

С уважением

1 Ответ

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

Итак, я задал этот вопрос некоторое время назад, и с тех пор я пытался найти решение для него. Я думаю, что мне удалось найти это, поэтому я решил поделиться этим. Но прежде чем сделать это, я хочу сказать то, что прочитал, и я думаю, что это указывает на суть моей проблемы. Поговорка звучит так: «Если гиперпараметр работает для кого-то другого, он не обязательно работает для вас. Если вы пытаетесь решить новую проблему с помощью новой архитектуры, то вам нужны новые гиперпараметры» или что-то в этом роде. К сожалению, в Keras (который, кстати, является хорошим инструментом, если он используется в ожидаемой области), утверждается, что параметры оптимизатора должны быть сохранены в том виде, в каком они есть, что неправильно, теперь это решение.

краткий ответ:

скорость обучения была слишком высокой.

длинный ответ:

Здесь я подробно расскажу, как это выяснить. Если вы получаете NaN в течение первых 100 итераций, это является прямым свидетельством того, что проблема заключается в высокой скорости обучения. Однако, если вы получите его после первых 100 итераций, проблема может заключаться в одной из двух вещей:

  1. если вы используете RCNN, то вам нужно использовать градиент.clip
  2. если у вас есть пользовательский слой (у меня была пользовательская функция стоимости), то это, вероятно, причина. Теперь важно помнить, что между правильной и стабильной реализацией есть разница. Вы можете правильно реализовать свой пользовательский слой. Однако, чтобы сделать его стабильным, нужно добавить несколько хитростей, чего не было в моем пользовательском слое.
...