Keras 上的 Conv2d 自定义权重

问题描述 投票:0回答:1

这是代码块

x = np.random.rand(4, 10, 10, 128)
y = keras.layers.Conv2D(32, 3,activation='relu',kernel_initializer='glorot_uniform')
print(y.weights) 
y.add_weight(shape =(3, 3, 128, 32),initializer='glorot_uniform', name='kernelA',trainable=True) 
print(y.weights) 
z = y(x) 
print(y.weights)

输出:

[] 
[<KerasVariable shape=(3, 3, 128, 32), dtype=float32, path=conv2d_1/kernelA>] 
[<KerasVariable shape=(3, 3, 128, 32), dtype=float32, path=conv2d_1/kernelA>, <KerasVariable shape=(3, 3, 128, 32), dtype=float32, path=conv2d_1/kernel>, <KerasVariable shape=(32,), dtype=float32, path=conv2d_1/bias>]

所以我想使用我的内核/权重,但我不能,因为 Keras conv2d 在使用输入运行后默认创建另一个内核。这在火车情况下会成为问题,因为它只看到它创建的内核。我怎样才能克服这个问题或这个功能?

此外,当我们想将其实现为客户层时:

customconv2d(keras.layers.Layer) 
带有 init、build 和 call?我们应该如何添加自定义权重?

我在文档中看不到任何相关信息;这只是关于初始化器。另外,对于自定义图层,只有一个线性示例。

我希望使用我创建的权重。

keras keras-layer
1个回答
0
投票

build方法用于创建自定义内核权重,call方法用于使用自定义内核执行卷积操作。

class CustomConv2D(keras.layers.Layer):
    def __init__(self, filters, kernel_size, **kwargs):
        super(CustomConv2D, self).__init__(**kwargs)
        self.filters = filters
        self.kernel_size = kernel_size

    def build(self, input_shape):
        self.kernel = self.add_weight(shape=self.kernel_size + (input_shape[-1], self.filters),
                                      initializer='glorot_uniform',
                                      name='kernelA',
                                      trainable=True)
        super(CustomConv2D, self).build(input_shape)

    def call(self, inputs):
        return tf.nn.conv2d(inputs, self.kernel, strides=[1, 1, 1, 1], padding='SAME')

© www.soinside.com 2019 - 2024. All rights reserved.