8

Python Keras'ta çok ölçekli bir CNN oluşturuyorum. Ağ mimarisi şemaya benzer. Burada, aynı görüntü farklı mimarilerle 3 CNN'ye besleniyor. Ağırlıklar paylaşılmaz.Çok amaçlı CNN Ağ Python Keras

enter image description here

Yazdığım kod aşağıda mevcuttur. Sorun şu ki, train_dir içinde 10 görüntü ile bile bunu çalıştırdığımda ağ yaklaşık 40 GB RAM alır ve son olarak işletim sistemi tarafından öldürülür. Bu "Yetersiz bellek hatası". Bunu CPU üzerinde çalıştırıyorum. Bunun Keras'ta niçin gerçekleştiğine dair bir fikrin var mı?

Ben Theano-0.9.0.dev5 kullanıyorum | Keras-1.2.1 | Python 2.7.12 | OS X 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

Bu model için kullanılan parametre miktarını görmek için final_model.summary() print yapabilir misiniz? Çok büyük görünmese de, görmek yine de ilginç olacaktır. –

+0

@ThomasPinetz gerçekten iyi yakaladı! CNN küçük olduğu için parametrelerden hiç şüphelenmedim. Fakat final_model.summary() 53,266,273 ≈ 53 milyon parametre: o. Bu nasıl mümkün olabilir? kodum yanlış mı? –

+1

Genel modellerinizi, alt modelleriniz üzerinde düzleştirmek yerine son katman olarak yapın. –

cevap

6

düzleştirme sonra lower_model1 ve lower_model2 düğüm sayısı 32 * 112 * 112 = 401 408 olup. 64 düğümlü tam bağlantılı bir katman tarafından takip edilen bu, çok büyük bir sayı olan 401 408 * 2 * 64 = 51 380 224 parametrelerini verir. "Düşük" modellerinize beslenen görüntülerin boyutunu yeniden gözden geçirmenizi öneririm. Orada gerçekten 224 x 224 boyutuna ihtiyacınız var mı? Eklediğiniz şemaya daha yakından bakın. Orada ikinci ve üçüncü modeldeki ilk adımın alt örnekleme olduğunu görüyorsunuz: 8:1 ve 4:1. Uygulamanızda kaçırdığınız adım budur.

main_model, ince sayıda havuz katmanının olduğundan, bu sayede parametre sayısını azaltabilirsiniz.