customizedDenselayer子类下标

来源:3-6 使子类与lambda分别实战自定义层次

慕神2274550

2022-03-06

老师您好,子类实现layer重写这一部分,customizedDenselayer的构造函数传了一个inputshape=x_train.shape[1:],按我的理解应该是只传了一个8。但是子类里重写build方法时,addweight的inputshape参数却仍然是inputshape[1], 按理说inputshape只传进来一个8,怎么会有1下标呢。不会出现下标越界的问题吗?

写回答

1回答

正十七

2022-03-13

好问题

code是这样子的:

class CustomizedDenseLayer(keras.layers.Layer):
    def __init__(self, units, activation=None, **kwargs):
        self.units = units
        self.activation = keras.layers.Activation(activation)
        super(CustomizedDenseLayer, self).__init__(**kwargs)    
    def build(self, input_shape):
        """构建所需要的参数"""
        # x * w + b. input_shape:[None, a] w:[a,b]output_shape: [None, b]
        self.kernel = self.add_weight(name = 'kernel',
                                      shape = (input_shape[1], self.units),
                                      initializer = 'uniform',
                                      trainable = True)
        self.bias = self.add_weight(name = 'bias',
                                    shape = (self.units, ),
                                    initializer = 'zeros',
                                    trainable = True)
        super(CustomizedDenseLayer, self).build(input_shape)    
    def call(self, x):
        """完成正向计算"""
        return self.activation(x @ self.kernel + self.bias)

然后,可以看到,这里的input_shape[1]的input_shape是从build的参数中传过来的,并不是我们传给构造函数的那个[8], 在Layer的底层实现中,会给传给构造函数的[8]加上一个batch的维度,然后再传给build函数,所以build 函数可以用input_shape[1]。

1
0

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程