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

6

我希望能够使用特定的卷积核来初始化卷积层,而这种卷积核在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个回答

9

有几个需要修复的项目。让我们从内核初始化器开始。从文档中了解到:

如果要传递自定义可调用函数,则必须传入参数shape(要初始化的变量的形状)和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函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接