Keras OOM。较小的体系结构运行OOM,而较大的体系结构则不运行

时间:2018-07-10 10:10:40

标签: keras

目前,我正在进行语义分割项目,并使用Keras创建CNN架构。我有2种架构,第一个model.summary()结果:

==============================================================================
Total params: 53,517,361
Trainable params: 53,499,089
Non-trainable params: 18,272
______________________________________________________________________________

第二个体系结构model.summary()得到以下结果:

=================================================================
Total params: 39,994,689
Trainable params: 39,973,569
Non-trainable params: 21,120
_________________________________________________________________

他们两个都使用相同的数据,优化器和小批量进料。 真正不同的是我如何构建体系结构。

在第一个中,我不调用任何手动构建的函数。就像这样:

down0 = Conv2D(32, (3, 3), padding='same')(down0a_pool)
down0 = BatchNormalization()(down0)
down0 = Activation('relu')(down0)
down0 = Conv2D(32, (3, 3), padding='same')(down0)
down0 = BatchNormalization()(down0)
down0 = Activation('relu')(down0)
down0_pool = MaxPooling2D((2, 2), strides=(2, 2))(down0)
# 128

down1 = Conv2D(64, (3, 3), padding='same')(down0_pool)
down1 = BatchNormalization()(down1)
down1 = Activation('relu')(down1)
down1 = Conv2D(64, (3, 3), padding='same')(down1)
down1 = BatchNormalization()(down1)
down1 = Activation('relu')(down1)
down1_pool = MaxPooling2D((2, 2), strides=(2, 2))(down1)
# 64

但是在第二种架构上,我使用的是手动构建的模块功能。

def conv_batch_layer(x, layer_out, filter_size=3, padding='same'):
    x = Conv2D(layer_out, filter_size, padding=padding)(x)
    x = BatchNormalization()(x)
    x = Activation('relu')(x)
    return x

start_layer_out = 32
conv_0 = conv_batch_layer(inputs, start_layer_out* 2**0) # 512 x 512 x 32
conv_0 = conv_batch_layer(conv_0, start_layer_out* 2**0)
conv_0_pool = MaxPooling2D(2)(conv_0) # 256 x 256 x 32

conv_1 = conv_batch_layer(conv_0_pool, start_layer_out* 2**1) # 256 x 256 x 64
conv_1 = conv_batch_layer(conv_1, start_layer_out* 2**1)
conv_1_pool = MaxPooling2D(2)(conv_1) # 128 x 128 x 64

根据摘要,第一个体系结构要大于第二个体系结构。我使用单个GPU GTX Titan Xp 12GB训练模型。我在训练第二种架构时遇到了OOM,但在第一种架构上却没有。有什么建议可能是问题的原因吗?

1 个答案:

答案 0 :(得分:0)

两个模型之间绝对没有区别,假设已经使用相同的输入张量调用了。看起来有点可疑并可能导致观察到的行为的事实是,您正在使用down0a_pool调用第一个版本的第一层,而在第二个版本中使用inputs。是否有相同的张量和相同的层?

您是否比较了两个模型的层,例如使用model.layers

除此之外,在您的情况下,参数/内存占用空间的差异仅为20%。那不是很多,如果您不应该找出问题的原因,可以通过稍微减小批大小来摆脱OOM。

相关问题