【问题标题】:Keras: Vanishing parameters in Conv2D layer within Lambda functionKeras:在 Lambda 函数中的 Conv2D 层中消失的参数
【发布时间】:2017-07-06 17:10:47
【问题描述】:

我正在定义一个Lambda 层,其函数使用Conv2D 层。

def lambda_func(x,k):
    y = Conv2D(k, (3,3), padding='same')(x)
    return y

并使用它调用它

k = 64
x = Conv2D(k, (3,3), data_format='channels_last', padding='same', name='block1_conv1')(inputs)
y = Lambda(lambda_func, arguments={'k':k}, name = 'block1_conv1_loc')(x)

但是在model.summary() 中,lambda 层没有显示任何参数!

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 224, 224, 3)       0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv1_loc (Lambda)    (None, 224, 224, 64)      0         
_________________________________________________________________
activation_1 (Activation)    (None, 224, 224, 64)      0         
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
flatten (Flatten)            (None, 802816)            0         
_________________________________________________________________

(它下面有一个Dense 层,下面有一个Softmax 2 类分类器)。如何确保Lambda 层的Conv2D 参数出现并且也可以训练?我也尝试在Lambda 函数中使用trainable=True

def lambda_func(x,k):
    y = Conv2D(k, (3,3), padding='same', trainable=True)(x)
    return y

但这并没有什么不同。

【问题讨论】:

  • 您究竟是在什么型号上致电summary()...?
  • 我正在使用标准程序。 model = my_model(weights_path='weights.h5') 我用Model API 定义了my_model。然后我调用model.compile(optimizer='RMSprop', loss='binary_crossentropy', metrics=['accuracy'])编译模型,然后model.summary()查看它的结构

标签: python-2.7 lambda keras conv-neural-network


【解决方案1】:

Lambda 层没有参数。

参数,总而言之,是可以“学习”的变量。 Lambda 层永远不会学习,它们是您创建的函数。

如果您确实打算使用“卷积层”,请在 lambda 层之外使用它。
现在,如果你想使用“卷积操作”,那么在 lambda 层中使用它,但是没有可学习的参数,你自己定义过滤器。

如果您想创建一个以不同方式学习的特殊层,请创建一个自定义层。

【讨论】:

  • 我实际上希望只将前一层的一部分输入到一个新的卷积层like this question I posted。我尝试使用 Lambda 层来完成这项工作。如何定义一个只接收前一层输出的一部分的自定义层,比如说只有 1 个内核的输出,而不是全部?
  • 正如@Daniel 所建议的,确实可以通过在Lambda 层之外使用Conv2D 层来实现解决方案,例如this answer
猜你喜欢
  • 1970-01-01
  • 2018-11-12
  • 2017-12-09
  • 2020-09-08
  • 1970-01-01
  • 2018-06-22
  • 2017-08-10
  • 2019-09-10
  • 1970-01-01
相关资源
最近更新 更多