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

Ali*_*ehi 6 initialization convolution neural-network keras 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
Run Code Online (Sandbox Code Playgroud)

并且卷积层设计如下:

model.add(Conv2D(filters=32, kernel_size=(3,3),
                      kernel_initializer=init_f(3)))
Run Code Online (Sandbox Code Playgroud)

我收到错误:

无法解释初始化标识符

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

gga*_*llo 9

需要修复的几个项目。让我们从内核初始化程序开始。从文档

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

所以签名应该变成:

def init_f(shape, dtype=None)
Run Code Online (Sandbox Code Playgroud)

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

np.zeros(shape, dtype=dtype)
Run Code Online (Sandbox Code Playgroud)

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

我猜你正试图用中间的 1 初始化内核,所以你也可以概括你的函数以处理它收到的任何形状:

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

把它们放在一起:

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
Run Code Online (Sandbox Code Playgroud)

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

model.add(Conv2D(filters=32, kernel_size=(3,3),
                  kernel_initializer=init_f))
Run Code Online (Sandbox Code Playgroud)

layer 函数会将参数传递给init_f.