我在 python keras 中创建了一个多尺度 CNN。网络架构类似于该图。在这里,相同的图像被馈送到具有不同架构的 3 个 CNN。权重不共享。
我在 keras 中编写了以下多尺度 CNN,它与图中的架构大致相似。但即使 train_dir 有 2 张图像,我也会不断收到“内存不足错误” 。将不胜感激帮助...
#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)
更新 1:提供更多系统信息
我正在使用 Theano-0.9.0.dev5 | Keras-1.2.1 | Python 2.7.12 | OSX Sierra 10.12.3 (16D32) | Macbook Pro 16GB 内存 | 中央处理器模式
~/.keras/keras.json内容
{
"image_dim_ordering": "th",
"epsilon": 1e-07,
"floatx": "float64",
"backend": "theano"
}
没有.theanorc文件
请注意,个别 CNN 模型训练良好。只有上面的合并代码会导致问题。
更新 2: 2017 年 1 月 27 日。尝试了以下 -
减少了编号。CNN 的参数从 5300 万到 100K。但还是没有用。由于内存问题,网络最终无法训练。
将图像训练的批量大小减少到 8。网络训练失败的原因相同。
在编写此更新时没有可行的解决方案...
