代码中将 lambda 替换为子类的示例如下:
scale = tf.Variable(1.)
scale_layer = tf.keras.layers.Lambda(lambda x: x * scale)
因为scale_layer不直接跟踪scale变量,所以它不会出现在scale_layer.trainable_weights中,因此如果在模型中使用scale_layer则不会被训练。更好的模式是编写一个子类化的 Layer:
class ScaleLayer(tf.keras.layers.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.scale = tf.Variable(1.)
def call(self, inputs):
return inputs * self.scale
根据上面的说明,下面代码最后一行的lambda部分应该如何更改?
def grouped_convolution_block(inputs, num_filters, kernel_size, strides, cardinality):
# Adds a grouped convolution block
group_list = []
grouped_channels = int(num_filters / cardinality)
for c in range(cardinality):
x = tf.keras.layers.Lambda(lambda z: z[:, :, c * grouped_channels:(c + 1) * grouped_channels])(inputs)
替换代码最后一行(lambda部分)的子类层是什么?
如果您使用
grouped_channels
和 c
作为参数,我认为可能是class xLayer():
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.grouped_channels = kwargs['grouped_channels']
self.c = kwargs['c']
def call(self, inputs):
return inputs[:, :, self.c * self.grouped_channels: (self.c + 1) * self.grouped_channels]