gpt4 book ai didi

python - 为什么 Keras 层定义使用嵌套函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:46:08 25 4
gpt4 key购买 nike

我正在尝试实现 ResNet 模型。我想使用一个函数来生成“基础”层(将 conv-relu-conv-relu 添加到未修改的输入中),这样我就可以通过编程快速增加层数。但是,当我将层作为函数参数传递给函数时,它说它不是 keras 张量。第一部分是我的函数定义,第二部分是调用,其中 x_in 是层对象,y 是残差 block 的输出。我使用“x”作为上一层和下一层的名称。

def ResBlock(x_in, n_filt, l_filt, pool):
...
return y

x = ResBlock(x, 32, 16, 0)

在谷歌搜索后我发现这是正确的语法:

def ResBlock(n_filt, l_filt, pool):
def unit(x_in):
x = Conv1D(n_filt, l_filt, padding='same')(x_in)
x = BatchNormalization()(x)
x = relu(x)
x = Dropout(0.1)(x)
x = Conv1D(n_filt, l_filt, padding='same')(x)
if pool:
x = MaxPooling1D()(x)
x_in = MaxPooling1D()(x_in)
y = keras.layers.add([x, x_in])
return y
return unit

x = ResBlock(32, 16, 0)(x)

谁能解释为什么这是正确的方法?具体来说,我想知道为什么我们需要层对象的嵌套定义?

最佳答案

Keras 的标准“风格”是:先定义一个层,然后应用它。所以您提供的代码不是正确的风格,这就是您感到困惑的原因。

正确的风格应该是:

def ResBlock(n_filt, l_filt, pool):
conv_1 = Conv1D(n_filt, l_filt, padding='same')
bn = BatchNormalization()
dropout = Dropout(0.1)
conv_2 = Conv1D(n_filt, l_filt, padding='same')
maxpool_1 = MaxPooling1D()
maxpool_2 = MaxPooling1D()

def unit(x_in):
x = conv_1(x_in)
x = bn(x)
x = relu(x)
x = dropout(x)
x = conv_2(x)
if pool:
x = maxpool_1(x)
x_in = maxpool_2(x_in)
y = keras.layers.add([x, x_in])
return y

return unit

x = ResBlock(32, 16, 0)(x)

我们这样写代码的原因是为了允许重复使用图层。也就是说,如果我们这样调用它

resblock = ResBlock(32, 16, 0)

x = resblock(x)
x = resblock(x)

resblock 将在两个调用之间共享所有参数。使用您示例中的语法,这是不可能的。

关于python - 为什么 Keras 层定义使用嵌套函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45102054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com