首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >凯拉斯OOM。较小的体系结构运行OOM,而较大的不运行OOM

凯拉斯OOM。较小的体系结构运行OOM,而较大的不运行OOM
EN

Stack Overflow用户
提问于 2018-07-10 10:10:40
回答 1查看 81关注 0票数 1

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

代码语言:javascript
复制
==============================================================================
Total params: 53,517,361
Trainable params: 53,499,089
Non-trainable params: 18,272
______________________________________________________________________________

第二种架构model.summary()的结果是:

代码语言:javascript
复制
=================================================================
Total params: 39,994,689
Trainable params: 39,973,569
Non-trainable params: 21,120
_________________________________________________________________

它们都使用相同的数据、优化器和小批量大小。真正不同的是我是如何构建这个架构的。

在第一个例子中,我不调用任何手动构建的函数。所以就像:

代码语言:javascript
复制
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

但是在第二种架构中,我使用手工构建的函数来实现模块化。

代码语言:javascript
复制
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泰坦Xp 12 Xp来训练模型。当我训练第二种架构时,我会遇到OOM,而不是在第一种架构上。有什么建议可能是造成这个问题的原因?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 12:18:59

两个模型之间绝对没有区别,假设有相同的输入张量调用。看上去有点可疑并可能导致所观察到的行为的是,您使用down0a_pool调用第一个版本中的第一个层,而在第二个版本中使用inputs。分别有相同的张量和相同的层吗?

您是否比较过这两种模型的层,例如使用model.layers

除此之外,在您的情况下,参数/内存占用量的差异仅为20%。这不是很多,你可能会摆脱你的OOM,只是减少一些批大小,以防你找不到问题的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51262563

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档