tensorflow之自定义神经网络层实例

作者:大雄没有叮当猫 时间:2022-05-26 07:05:27 

如下所示:


import tensorflow as tf
tfe = tf.contrib.eager

tf.enable_eager_execution()

大多数情况下,在为机器学习模型编写代码时,您希望在比单个操作和单个变量操作更高的抽象级别上操作。

1.关于图层的一些有用操作

许多机器学习模型可以表达为相对简单的图层的组合和堆叠,TensorFlow提供了一组许多常用图层,以及您从头开始或作为组合创建自己的应用程序特定图层的简单方法。TensorFlow在tf.keras包中包含完整的Keras API,而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__中创建变量意味着需要明确指定创建变量所需的形状。


class MyDenseLayer(tf.keras.layers.Layer):
def __init__(self, num_outputs):
 super(MyDenseLayer, self).__init__()
 self.num_outputs = num_outputs

def build(self, input_shape):
 self.kernel = self.add_variable("kernel",
                 shape=[input_shape[-1].value,
                     self.num_outputs])

def call(self, input):
 return tf.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完成的。


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

def call(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
 return tf.nn.relu(x)

block = ResnetIdentityBlock(1, [1, 2, 3])
print(block(tf.zeros([1, 2, 3, 3])))
print([x.name for x in block.variables])

来源:https://blog.csdn.net/u013230189/article/details/81742306

标签:tensorflow,自定义,神经网络层
0
投稿

猜你喜欢

  • 如何在一个广告旗帜里轮番显示时间长度不一的不同广告?

    2010-06-26 12:35:00
  • python多次绘制条形图的方法

    2021-07-22 09:36:45
  • 利用python-pypcap抓取带VLAN标签的数据包方法

    2021-03-15 04:46:20
  • Django框架实现分页显示内容的方法详解

    2023-05-31 17:06:38
  • 什么是Semantics?

    2008-04-16 13:45:00
  • PHP数据类型之布尔型的介绍

    2023-11-14 21:56:00
  • python执行系统命令后获取返回值的几种方式集合

    2022-07-24 22:43:56
  • Yahoo!上的小秘密

    2007-08-23 09:48:00
  • Go语言区别于其他语言的特性

    2023-06-26 02:52:10
  • Python利用pandas处理Excel数据的应用详解

    2022-02-08 16:25:02
  • centos7利用yum安装lnmp的教程(linux+nginx+php7.1+mysql5.7)

    2023-11-14 11:40:18
  • Python 阶乘详解

    2022-01-16 13:56:00
  • js字放大效果

    2010-09-07 12:18:00
  • 如何利用SysOjects来获知数据库的信息?

    2010-01-01 15:43:00
  • 彻底理解Python list切片原理

    2023-10-19 03:34:43
  • Django模板报TemplateDoesNotExist异常(亲测可行)

    2023-11-02 18:53:49
  • python 基于空间相似度的K-means轨迹聚类的实现

    2022-10-24 07:29:02
  • python神经网络学习使用Keras进行简单分类

    2023-09-18 04:37:23
  • SQL Server日志清除的两种方法教程简介

    2008-05-04 20:59:00
  • Python configparser模块应用过程解析

    2022-08-03 19:56:11
  • asp之家 网络编程 m.aspxhome.com