CNN чередуется между хорошей работой и шансом - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть проблема двоичной классификации, которую я пытаюсь решить с помощью CNN, написанного на языке Keras.Входными данными являются очень редкие 200X125X2 тензоры (могут быть как два изображения, сгруппированные вместе), и его ненулевые элементы являются только единицами (представляющими нейроны с шипами).Входные данные генерируются с помощью созданного мной генератора данных, поэтому модель обучается с использованием функции fit_generator.

Я пробовал разные архитектуры, и некоторые показывают приличную производительность (~ 88%), но дело в том, что иногда, когда я тренирую новые модели, они, кажется, не работают вообще, даваяшанс (50%) результат каждую эпоху .Странно то, что иногда случается с теми же архитектурами, которые хорошо работали до .Я использую код в Google Colab (GPU) с TensorFlow 2.0.Я несколько раз проверял, что я ничего не изменил в коде.Я знаю, что случайная инициализация весов и смещений может вызвать небольшие изменения в производительности, но это выглядит как-то иначе.

Любые идеи будут очень полезны.Спасибо!

Вот соответствующий код для одной из моделей, у которых была эта проблема (я использую необычные ядра, я знаю):

# General settings

x_max = 10 
x_size, t_size, N_features = parameters(x_max)
batch_size = 64
N_epochs = 10
N_final = 10*N_features                                    
N_final = int(N_final - N_final%(batch_size))
N_val = 100*batch_size
N_test = N_final/5

# Setting up the architecture of the network and compiling

model = Sequential()
model.add(SeparableConv2D(50, (50,30), data_format='channels_first', input_shape=(2,x_size, t_size)))
model.add(MaxPooling2D(pool_size=2, data_format='channels_first'))
model.add(SeparableConv2D(100, (10,6), data_format='channels_first', input_shape=(2,x_size, t_size)))
model.add(MaxPooling2D(pool_size=2, data_format='channels_first'))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fitiing the model on generated data

filepath="......hdf5"
checkpoint = ModelCheckpoint(filepath, monitor='val_accuracy', verbose=1, save_best_only=True, mode='max')

start = time.time()
fit_history = model_delta.fit_generator(generator = data_generator(batch_size,x_max,'delta','_',100),
                    steps_per_epoch = N_final//batch_size,
                    validation_data = data_generator(batch_size,x_max,'delta','_',100),
                    validation_steps = N_val//batch_size,
                    callbacks = [checkpoint],
                    epochs = N_epochs)
end = time.time()

1 Ответ

0 голосов
/ 27 сентября 2019

Самая подозрительная вещь, которую я вижу, это 'relu' в конце модели.В зависимости от инициализации и скорости обучения ReLU могут быть невезучими и попадать в случай с нулем.Когда это происходит, они полностью останавливают градиенты и больше не тренируются.

Судя по вашей проблеме (иногда она работает, иногда нет), кажется весьма вероятным, что это результат.

Итак, первое предложение (это всегда решает его)добавление нормализации партии перед активацией:

model.add(Dense(100))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dense(1, activation='sigmoid')

Подсказка, если вы собираетесь использовать ее с 4-мерными тензорами до сглаживания, не забудьте использовать размер каналов: BatchNormalization(1).

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