【问题标题】:Multi scale CNN Network Python Keras多尺度 CNN 网络 Python Keras
【发布时间】:2017-06-08 23:28:58
【问题描述】:

我在 Python Keras 中创建了一个多尺度 CNN。网络架构类似于该图。在这里,相同的图像被馈送到具有不同架构的 3 个 CNN。权重不共享。

我编写的代码可在下面找到。问题是,当我在train_dir 中使用 10 个图像运行此程序时,网络占用了大约 40GB 的 RAM,最终被操作系统杀死。这是“内存不足错误”。我在 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)

【问题讨论】:

  • 你能打印一个 final_model.summary() 来查看这个模型使用的参数数量吗?尽管它看起来不大,但它仍然会很有趣。
  • @ThomasPinetz 真的很棒!由于 CNN 很小,我从未怀疑参数会成为问题。但是 final_model.summary() 53,266,273 ≈ 5300 万个参数:o。这怎么可能?我的代码错了吗?
  • 将全局平均池化作为较低模型的最后一层,而不是展平。
  • 5300 万个参数没什么特别的(VGG16 仅在第一个全连接层就有超过 1 亿个参数)。尝试减小批量大小(默认为 32,尝试 16 或 8)。

标签: python neural-network deep-learning keras conv-neural-network


【解决方案1】:

lower_model1lower_model2扁平化后的节点数为 32 * 112 * 112 = 401 408。接下来是一个有 64 个节点的全连接层,这给出了 401 408 * 2 * 64 = 51 380 224 参数,这是一个相当大的数字。我建议重新考虑提供给“较低”模型的图像的大小。你真的需要224 x 224 尺寸吗?仔细看看你附上的图表。在那里你看到第二个和第三个模型的第一步是子采样:8:14:1。这是您在实施过程中遗漏的步骤。

你的main_model 很好,因为你有足够的最大池层来减少参数的数量。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多