【问题标题】:Set half of the filters of a layer as not trainable keras/tensorflow将一层的一半过滤器设置为不可训练的keras/tensorflow
【发布时间】:2019-02-24 09:20:28
【问题描述】:

我正在尝试训练this 研究论文建议的模型,其中我将卷积层的一半过滤器设置为 Gabor 过滤器,其余的是默认初始化的随机权重。通常,如果我必须将层设置为不可训练,我将trainable 属性设置为False。但是在这里我只需要冻结一个图层的一半过滤器,我不知道该怎么做。任何帮助将非常感激。我正在使用带有 Tensorflow 后端的 Keras。

【问题讨论】:

  • 您要冻结随机的 50% 还是特定层的特定层?
  • 我想冻结 gabor 过滤器并将默认的初始化权重设置为可训练。
  • 您可以在 Keras 中逐层冻结卷积过滤器。有关详细信息,请参阅以下 SO 查询:stackoverflow.com/questions/50178499/…

标签: python tensorflow neural-network keras conv-neural-network


【解决方案1】:

如何制作两个获得相同输入和(几乎)相同参数的卷积层?所以其中一个在初始化时是可训练的 wir 随机权重,而另一层是不可训练的 gabor 过滤器。

然后,您可以将两层的输出合并在一起,看起来就像是来自一个卷积网络的输出。

这里是一个演示示例(需要使用Keras functional API):

n_filters = 32

my_input = Input(shape=...)
conv_freezed = Conv2D(n_filters/2, (3,3), ...)
conv_trainable = Conv2D(n_filters/2, (3,3), ...)

conv_freezed_out = conv_freezed(my_input)
conv_trainable_out = conv_trainable(my_input)
conv_out = concatenate([conv_freezed_out, conv_trainable_out])

# set weights and freeze the layer
conv_freezed.set_weights(...)
conv_freezed.trainable = False

【讨论】:

  • 没错!我刚刚编辑了您的答案并添加了一个示例以帮助其他人更好地理解这一点。
  • 非常感谢@dennis-ec 和@today!像我这样的其他新手请注意:使用 keras 功能 api 来创建具有这种逻辑的层,因为它不可能按顺序进行。
  • 对于那些在 2021 年或之后发现的人,现在可以使用 Keras 类(而不仅仅是功能性 api);但是,它可能不是首选方法。由于顺序模型的固有性质,顺序模型是不可能的,而对于 Keras.layers,这需要连接两个单独的层,使其成为图形分支。如果以这种方式制作自定义层,这仍然可以包含在顺序模型中。
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多