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 中定义任意内核吗?
需要修复的几个项目。让我们从内核初始化程序开始。从文档:
如果传递自定义可调用对象,则它必须采用参数 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
.
归档时间: |
|
查看次数: |
5985 次 |
最近记录: |