这是代码块
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?我们应该如何添加自定义权重?
我在文档中看不到任何相关信息;这只是关于初始化器。另外,对于自定义图层,只有一个线性示例。
我希望使用我创建的权重。
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')