什么是子类 tf.keras.layers.Layer 而不是在此代码中使用 Lambda?

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

代码中将 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部分)的子类层是什么?

lambda model load subclass marshalling
1个回答
0
投票

如果您使用

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]
© www.soinside.com 2019 - 2024. All rights reserved.