我是靠谱客的博主 柔弱黑猫,这篇文章主要介绍tensorflow2.0自定义层Layers的 __init__,build,call,__call__关系如何自定义层Layer,现在分享给大家,希望可以做个参考。
tensorflow2.0自定义层Layers的 __init__,build,call,__call__关系笔记
- 如何自定义层Layer
- 1、代码参考
- 2、build()在__call__中逻辑
- 3、不用build()的情况
如何自定义层Layer
查看源码和其他的教程,只要继承tf.keras.layers.Layer类,并且重写类的几个方法就可以自定义层了。
其中各路教程里面推荐重写的3个方法
1、init 初始化参数。在创建Layer的时候执行一次(相当于C++里面构造函数)
2、build 根基输入shape的维度,生成w,b等权重。可以单独执行build生成权重信息,或者在__call__方法执行的时候,自动只执行一次build。
3、call 前向传播。在__call__方法执行build后执行call
参考TensorFlow的Dense层和其他代码
1、代码参考
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15class MyLayer(layers.Layer): def __init__(self,units,activation=None,*kwargs) super(MyDense, self).__init__(**kwargs) //自定义变量units,或者output,存放储存shape大小 self.units = int(units) //自定义变量激活函数 self.activation = keras.layers.Activation.get(activation) def build(self, input_shape): //添加权重w,b self.w=self.add_weight(name='w',shape=(input_shape[1],self.units),initializer='uniform',trainable=True) self.b=self.add_weight(name='b',shape=(self.units),initializer='zero',trainable=True) //调用父类的build,self.built = True,使build在__call__内只执行一次 super(MyDense, self).build(input_shape) def call(self, inputs, **kwargs): return self.activation(inputs@self.w+self.b)
使用的时候
复制代码
1
2
3
4//__init__(256) mlayer=MyLayer(256) //call(x) mlayer(x)
2、build()在__call__中逻辑
在父类build()中
复制代码
1
2def build(self, input_shape): self.built = True
然后在base_layer的Layer类的__call__()方法内通过
复制代码
1self._maybe_build(input_shape)
调用了
复制代码
1
2
3
4
5
6input_shapes = None if all(hasattr(x, 'shape') for x in input_list): input_shapes = nest.map_structure(lambda x: x.shape, inputs) if not hasattr(self.build, '_is_default'): with tf_utils.maybe_init_scope(self): self.build(input_shape)
其中input_shape是根基input来的
所以在重构build()的时候,layer的权重生成要与input数据shape来推导生成
3、不用build()的情况
复制代码
1
2
3
4
5
6
7
8
9class MyDencse(layers.Layer): def __init(__self,inp_dim,outp_dim): //不再是只获取units/output,而是获取input,output super(MyDense,self).__init__() //直接初始化权重 self.w=seld.add_variable('w',[inp_dim,outp_dim]) def call(self,inputs,training=None): return inputs@self.w
直接在__init__中初始化权重也能用
复制代码
1
2mlayer=MyDecse(512,256) mlayer(x)
不使用__call__的时候build推导权重,直接在__init__初始化权重
最后
以上就是柔弱黑猫最近收集整理的关于tensorflow2.0自定义层Layers的 __init__,build,call,__call__关系如何自定义层Layer的全部内容,更多相关tensorflow2.0自定义层Layers的内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复