Я пытаюсь обучить полный 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')
Может кто-нибудь, пожалуйста, помогите мне, я работал над этой проблемой в течение многих многих недель
С уважением