如何用Keras中的任意内核初始化卷积层?

时间:2017-06-20 21:53:28

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

我想通过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中定义任意内核吗?

提前谢谢。

1 个答案:

答案 0 :(得分:3)

要修复的一些项目。让我们从内核初始化器开始。来自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