我想通过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中定义任意内核吗?
提前谢谢。
答案 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
。