【问题标题】:How to initialize a convolution layer with an arbitrary kernel in Keras?如何在 Keras 中使用任意内核初始化卷积层?
【发布时间】:2017-11-23 14:54:55
【问题描述】:

我想通过 Keras 中未定义的特定内核来初始化卷积层。例如,如果我定义以下函数来初始化内核:

def init_f(shape):
      ker=np.zeros((shape,shape))
      ker[int(np.floor(shape/2)),int(np.floor(shape/2))]=1
      return ker

而卷积层设计如下:

model.add(Conv2D(filters=32, kernel_size=(3,3),
                      kernel_initializer=init_f(3)))

我得到错误:

无法解释初始化程序标识符

我在以下位置关注了类似的问题: https://groups.google.com/forum/#!topic/keras-users/J46pplO64-8 但我无法使其适应我的代码。 您能帮我在 Keras 中定义任意内核吗?

【问题讨论】:

    标签: initialization neural-network keras convolution keras-layer


    【解决方案1】:

    需要修复的一些项目。让我们从内核初始化程序开始。来自the documentation

    如果传递自定义可调用对象,则它必须采用参数形状(要初始化的变量的形状)和 dtype(生成值的 dtype)

    所以签名应该变成:

    def init_f(shape, dtype=None)
    

    该函数在没有dtype 的情况下也可以工作,但最好将其保留在那里。这样你就可以指定 dtype 在你的函数内部调用,例如:

    np.zeros(shape, dtype=dtype)
    

    这也解决了您的第二个问题:shape 参数是一个元组,因此您只需将其直接传递给 np.zeros 而无需创建另一个元组。

    我猜您正在尝试使用中间的 1 初始化内核,因此您还可以概括您的函数以使用它接收到的任何形状:

    ker[tuple(map(lambda x: int(np.floor(x/2)), ker.shape))]=1
    

    把它们放在一起:

    def init_f(shape, dtype=None):
        ker = np.zeros(shape, dtype=dtype)
        ker[tuple(map(lambda x: int(np.floor(x/2)), ker.shape))]=1
        return ker
    

    最后一个问题。您需要将函数传递给层,而不是调用的结果:

    model.add(Conv2D(filters=32, kernel_size=(3,3),
                      kernel_initializer=init_f))
    

    图层函数会将参数传递给init_f

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 2018-01-26
      • 2019-05-17
      • 2017-07-25
      • 2021-06-09
      • 1970-01-01
      相关资源
      最近更新 更多