在Keras有可能有不可训练的层吗?

时间:2017-07-15 22:27:19

标签: python machine-learning keras conv-neural-network deep-residual-networks

我想计算像模糊或重新采样一样的恒定卷积,并希望它在训练期间永远不会改变。

我可以将卷积内核初始化为常量并将其从Keras中的训练中排除吗?

更具体地说,我不想将此用于文档中声明的目的。我想以这种方式实现剩余网络:一个分支执行正常的可训练卷积,而并行分支执行一些常量,如平均。

1 个答案:

答案 0 :(得分:7)

您应该能够将trainable = False参数传递给图层定义,或者在创建图层后设置layer.trainable = False属性。在后一种情况下,您需要在事后编译。请参阅FAQ here

然后,您可以通过传递kernel_initializer = initializer argument为图层设置常量权重。有关初始化程序can be found here的更多信息。如果您已经在某处定义了权重矩阵,我认为您需要定义一个自定义初始值设定项,将权重设置为您想要的值。该链接显示了如何在底部定义自定义初始值设定项。假设您已定义my_constant_weight_matrix

,以下内容可能会起作用
def my_init(shape, dtype=None):
    # Note it must take arguments 'shape' and 'dtype'.
    return my_constant_weight_matrix
model.add(Conv2D(..., kernel_initializer=my_init))  # replace '...' with your args

那就是说,我还没有验证,当我进行Google搜索时,我看到很多关于图层冻结的错误报告无法正常工作。值得一试。