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]。
10
相似问题