tensorflow之自定义神经网络层实例
如下所示:
importtensorflowastf tfe=tf.contrib.eager tf.enable_eager_execution()
大多数情况下,在为机器学习模型编写代码时,您希望在比单个操作和单个变量操作更高的抽象级别上操作。
1.关于图层的一些有用操作
许多机器学习模型可以表达为相对简单的图层的组合和堆叠,TensorFlow提供了一组许多常用图层,以及您从头开始或作为组合创建自己的应用程序特定图层的简单方法。TensorFlow在tf.keras包中包含完整的KerasAPI,而Keras层在构建自己的模型时非常有用。
#在tf.keras.layers包中,图层是对象。要构造一个图层,只需构造一个对象。大多数层将输出维度/通道的数量作为第一个参数。 layer=tf.keras.layers.Dense(100) #输入维度的数量通常是不必要的,因为它可以在第一次使用图层时推断出来,但如果您想手动指定它,则可以提供它,这在某些复杂模型中很有用。 layer=tf.keras.layers.Dense(10,input_shape=(None,5)) #调用层 layer(tf.zeros([10,5])) #图层有许多有用的方法。例如,您可以通过调用layer.variables来检查图层中的所有变量。在这种情况下,完全连接的层将具有权重和偏差的变量。 variable=layer.variables #variable[0] layer.kernel.numpy() layer.bias
2.自定义图层
实现自己的层的最佳方法是扩展tf.keras.Layer类并实现:
__init__,您可以在其中执行所有与输入无关的初始化
build方法,您知道输入张量的形状,并可以进行其余的初始化
call方法,在这里进行正向传播计算
请注意,您不必等到调用build来创建变量,您也可以在__init__中创建它们。但是,在build中创建它们的优点是它可以根据图层将要操作的输入的形状启用后期变量创建。另一方面,在__init__中创建变量意味着需要明确指定创建变量所需的形状。
classMyDenseLayer(tf.keras.layers.Layer): def__init__(self,num_outputs): super(MyDenseLayer,self).__init__() self.num_outputs=num_outputs defbuild(self,input_shape): self.kernel=self.add_variable("kernel", shape=[input_shape[-1].value, self.num_outputs]) defcall(self,input): returntf.matmul(input,self.kernel) layer=MyDenseLayer(10) print(layer(tf.zeros([10,5]))) print(layer.variables)
3.搭建网络结构
机器学习模型中许多有趣的图层是通过组合现有层来实现的。例如,resnet中的每个residual块是卷积,批量标准化等的组合。
创建包含其他图层的类似图层的东西时使用的主类是tf.keras.Model。实现一个是通过继承自tf.keras.Model完成的。
classResnetIdentityBlock(tf.keras.Model): def__init__(self,kernel_size,filters): super(ResnetIdentityBlock,self).__init__(name='') filters1,filters2,filters3=filters self.conv2a=tf.keras.layers.Conv2D(filters1,(1,1)) self.bn2a=tf.keras.layers.BatchNormalization() self.conv2b=tf.keras.layers.Conv2D(filters2,kernel_size,padding='same') self.bn2b=tf.keras.layers.BatchNormalization() self.conv2c=tf.keras.layers.Conv2D(filters3,(1,1)) self.bn2c=tf.keras.layers.BatchNormalization() defcall(self,input_tensor,training=False): x=self.conv2a(input_tensor) x=self.bn2a(x,training=training) x=tf.nn.relu(x) x=self.conv2b(x) x=self.bn2b(x,training=training) x=tf.nn.relu(x) x=self.conv2c(x) x=self.bn2c(x,training=training) x+=input_tensor returntf.nn.relu(x) block=ResnetIdentityBlock(1,[1,2,3]) print(block(tf.zeros([1,2,3,3]))) print([x.nameforxinblock.variables])
以上这篇tensorflow之自定义神经网络层实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。