在这种情况下,您必须实现自定义卷积层。你必须创建一个类,它应该是 keras 的 Layer 类的实例。这需要为前馈计算实现 call 方法。
这可能是您正在寻找的东西。
class CustomConv2D(Layer):
def __init__(self, k=3):
super(CustomConv2D, self).__init__()
c1_1 = self.add_weight(shape=(k,k, 1, 5), initializer='zeros', dtype=tf.float32, trainable=False)
c1_2 = self.add_weight(shape=(k,k, 1, 11), initializer='zeros', dtype=tf.float32, trainable=True)
self.c1 = tf.concat([c1_1,c1_2], axis=-1)
self.c2 = self.add_weight(shape=(k,k, 1, 16), initializer='zeros', dtype=tf.float32, trainable=True)
self.c3 = self.add_weight(shape=(k,k, 1, 16), initializer='zeros', dtype=tf.float32, trainable=True)
def call(self, inputs):
x_1_c1 = tf.nn.conv2d(tf.expand_dims(inputs[:,:,:,0],-1), self.c1,padding='VALID')
x_1_c2 = tf.nn.conv2d(tf.expand_dims(inputs[:,:,:,1],-1), self.c2,padding='VALID')
x_1_c3 = tf.nn.conv2d(tf.expand_dims(inputs[:,:,:,2],-1), self.c3,padding='VALID')
x_1 = tf.concat([x_1_c1,x_1_c2, x_1_c3], -1)
return x_1
在这种情况下,我们有三组过滤器(每个通道 16 个),对于第一个通道,我们将 5 个过滤器保持为不可训练,其余 11 个作为可训练过滤器,其余 32 个(用于通道 2 和 3)过滤器是可训练的。
这是 keras 中 Layer 类的实例,可以像任何普通层一样使用。
model = tf.keras.models.Sequential()
model.add(CustomConv2D(3))
model.build(input_shape=(None,None,None,3))
I = tf.keras.Input((None,None,3))
model.call(I)
model.summary()
'''
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
custom_conv2d_2 (CustomConv2 (None, None, None, 48) 432
=================================================================
Total params: 432
Trainable params: 387
Non-trainable params: 45
_________________________________________________________________
'''
如您所见,我们没有训练 5 个过滤器,因此有 45 个 (3x3x5) 不可训练参数
这里我有没有添加偏见这个词。您可以进一步添加并自定义您的 Conv 层。还可以更改过滤器的顺序,只需将可训练参数设置为 False,然后将 initializer 更改为您想要训练的层的其他值。