8

Я создаю многомасштабный CNN в Python Keras. Сетевая архитектура похожа на диаграмму. Здесь же изображение подается на 3 CNN с разными архитектурами. Весы НЕ используются.Многопользовательская сеть CNN Python Keras

enter image description here

Код я написал доступен ниже. Проблема в том, что когда я запускаю это даже с 10 изображениями в train_dir, сеть занимает около 40 ГБ ОЗУ и, наконец, убивается ОС. Это «ОЗУ ERROR». Я запускаю это на CPU. Любая идея, почему это происходит в Keras?

Я использую Theano-0.9.0.dev5 | Keras-1.2.1 | Python 2.7.12 | OSX Sierra 10.12.3 (16D32)

## Multi scale CNN in Keras Python 
## https://i.stack.imgur.com/2H4xD.png 

#main CNN model - CNN1 
main_model = Sequential() 
main_model.add(Convolution2D(32, 3, 3, input_shape=(3, 224, 224))) 
main_model.add(Activation('relu')) 
main_model.add(MaxPooling2D(pool_size=(2, 2))) 

main_model.add(Convolution2D(32, 3, 3)) 
main_model.add(Activation('relu')) 
main_model.add(MaxPooling2D(pool_size=(2, 2))) 

main_model.add(Convolution2D(64, 3, 3)) 
main_model.add(Activation('relu')) 
main_model.add(MaxPooling2D(pool_size=(2, 2))) # the main_model so far outputs 3D feature maps (height, width, features) 

main_model.add(Flatten()) 

#lower features model - CNN2 
lower_model1 = Sequential() 
lower_model1.add(Convolution2D(32, 3, 3, input_shape=(3, 224, 224))) 
lower_model1.add(Activation('relu')) 
lower_model1.add(MaxPooling2D(pool_size=(2, 2))) 
lower_model1.add(Flatten()) 

#lower features model - CNN3 
lower_model2 = Sequential() 
lower_model2.add(Convolution2D(32, 3, 3, input_shape=(3, 224, 224))) 
lower_model2.add(Activation('relu')) 
lower_model2.add(MaxPooling2D(pool_size=(2, 2))) 
lower_model2.add(Flatten()) 

#merged model 
merged_model = Merge([main_model, lower_model1, lower_model2], mode='concat') 

final_model = Sequential()      
final_model.add(merged_model)     
final_model.add(Dense(64)) 
final_model.add(Activation('relu')) 
final_model.add(Dropout(0.5))  
final_model.add(Dense(1)) 
final_model.add(Activation('sigmoid')) 
final_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy']) 

print 'About to start training merged CNN' 
train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) 
train_generator = train_datagen.flow_from_directory(train_data_dir, target_size=(224, 224), batch_size=32, class_mode='binary') 

test_datagen = ImageDataGenerator(rescale=1./255) 
test_generator = test_datagen.flow_from_directory(args.test_images, target_size=(224, 224), batch_size=32, class_mode='binary') 

final_train_generator = zip(train_generator, train_generator, train_generator) 
final_test_generator = zip(test_generator, test_generator, test_generator) 
final_model.fit_generator(final_train_generator, samples_per_epoch=nb_train_samples, nb_epoch=nb_epoch, validation_data=final_test_generator, nb_val_samples=nb_validation_samples) 

enter image description here

+2

Можете ли вы сделать окончательный_модель.summary() для просмотра количества параметров, используемых для этой модели? Несмотря на то, что он не выглядит слишком большим, все равно было бы интересно посмотреть. –

+0

@ThomasPinetz действительно хорошо поймать! Я никогда не подозревал, что параметры являются проблемой, поскольку CNN небольшой. Но final_model.summary() 53,266,273 ≈ 53 миллиона параметров: o. Как это возможно? мой код неправильный? –

+1

Глобальный общий пул в качестве конечного слоя на ваших нижних моделях вместо сглаживания. –

ответ

6

Количество узлов в lower_model1 и lower_model2 после сплющивания является 32 * 112 * 112 = 401 408. Вслед за полностью подключенным слоем с 64 узлами это дает параметры 401 408 * 2 * 64 = 51 380 224, что довольно большое число. Я бы предложил пересмотреть размер изображений, загруженных в ваши «нижние» модели. Вам действительно нужен размер 224 x 224? Присмотритесь к диаграмме, которую вы приложили. Там вы видите, что первый шаг во второй и третьей моделях является подвыборкой: 8:1 и 4:1. Это тот шаг, который вы пропустили в своей реализации.

Ваш main_model хорош, потому что у вас достаточно максимальных слоев объединения, которые уменьшают количество параметров.

 Смежные вопросы

  • Нет связанных вопросов^_^