我是靠谱客的博主 柔弱黑猫,最近开发中收集的这篇文章主要介绍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、代码参考

class 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)

使用的时候

//__init__(256)
mlayer=MyLayer(256)
//call(x)
mlayer(x)

2、build()在__call__中逻辑

在父类build()中

def build(self, input_shape):
self.built = True

然后在base_layer的Layer类的__call__()方法内通过

self._maybe_build(input_shape)

调用了

input_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()的情况

class 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__中初始化权重也能用

mlayer=MyDecse(512,256)
mlayer(x)

不使用__call__的时候build推导权重,直接在__init__初始化权重

最后

以上就是柔弱黑猫为你收集整理的tensorflow2.0自定义层Layers的 __init__,build,call,__call__关系如何自定义层Layer的全部内容,希望文章能够帮你解决tensorflow2.0自定义层Layers的 __init__,build,call,__call__关系如何自定义层Layer所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(81)

评论列表共有 0 条评论

立即
投稿
返回
顶部