【问题标题】:Why does Keras layer definitions use nested functions?为什么 Keras 层定义使用嵌套函数?
【发布时间】:2017-07-14 11:38:10
【问题描述】:

我正在尝试实现 ResNet 模型。我想使用一个函数来生成“基础”层(将 conv-relu-conv-relu 添加到未修改的输入中),以便我可以以编程方式快速增加层。但是,当我将图层作为函数参数传递给函数时,它说它不是 keras 张量。第一部分是我的函数定义,第二部分是调用,其中 x_in 是层对象,y 是残差块的输出。我使用“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)

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

【问题讨论】:

  • 没有您的原始代码可以比较,这个问题无法回答。你需要更具体。
  • 我试图让函数调用清晰。我的问题是为什么我们需要 layer 对象的嵌套 def?
  • 显示你的版本代码。
  • 感谢@circuitdesigner5172 的澄清,我给了你答案。

标签: python machine-learning keras


【解决方案1】:

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 将在两个调用之间共享所有参数。使用您示例中的语法,这是不可能的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-22
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    相关资源
    最近更新 更多