TensorFlow:Keras 常见功能模块

在TensorFlow 中,也实现了一套Keras 协议,即tf.keras,但只能基于TensorFlow 后端计算,并对TensorFlow 的支持更好。对于使用TensorFlow 的开发者来说,tf.keras 可以理解为一个普通的子模块,与其他子模块,如tf.math,tf.data 等并没有什么差别。

文章目录

    • 一、常见网络层类
    • 二、网络容器

一、常见网络层类

对于常见的神经网络层,可以使用张量方式的底层接口函数来实现,这些接口函数一
般在tf.nn 模块中。更常用地,对于常见的网络层,我们一般直接使用层方式来完成模型的搭建,在tf.keras.layers 命名空间(下文使用 layers 指代tf.keras.layers)中提供了大量常见网络层的类接口,如全连接层,激活函数层,池化层,卷积层,循环神经网络层等等。对于这些网络层类,只需要在创建时指定网络层的相关参数,并调用__call__方法即可完成前向计算。在调用__call__方法时,Keras 会自动调用每个层的前向传播逻辑,这些逻辑一般实现在类的call 函数中。

我们以 Softmax 层为例,它既可以使用 tf.nn.softmax 函数在前向传播逻辑中完成Softmax 运算,也可以通过layers.Softmax(axis)类搭建 Softmax 网络层,其中axis 参数指定进行 softmax 运算的维度。

首先导入相关的子模块:

import tensorflow as tf
# 导入keras 模型,不能使用import keras,它导入的是标准的Keras 库
from tensorflow import keras
from tensorflow.keras import layers # 导入常见网络层类

x = tf.constant([2.,1.,0.1])
layer = layers.Softmax(axis=-1) # 创建Softmax 层
layer(x) # 调用softmax 前向计算

二、网络容器

对于常见的网络,需要手动调用每一层的类实例完成前向传播运算,当网络层数变得
较深时,这一部分代码显得非常臃肿。可以通过 Keras 提供的网络容器Sequential 将多个
网络层封装成一个大网络模型,只需要调用网络模型的实例一次即可完成数据从第一层到
最末层的顺序运算。

例如,2层的全连接层加上单独的激活函数层,可以通过 Sequential 容器封装为一个网络

from tensorflow.keras import layers, Sequential
network = Sequential([ # 封装为一个网络
layers.Dense(3, activation=None), # 全连接层
layers.ReLU(),#激活函数层
layers.Dense(2, activation=None), # 全连接层
layers.ReLU() #激活函数层
])
x = tf.random.normal([4,3])
network(x) # 输入从第一层开始,逐层传播至最末层

Sequential 容器也可以通过add()方法继续追加新的网络层,实现动态创建网络的功能:

layers_num = 2 # 堆叠2 次
network = Sequential([]) # 先创建空的网络
for _ in range(layers_num):
	network.add(layers.Dense(3)) # 添加全连接层
	network.add(layers.ReLU())# 添加激活函数层
network.build(input_shape=(None, 4)) # 创建网络参数
network.summary()

上述代码通过指定任意的 layers_num 参数即可创建对应层数的网络结构,在完成网络创建时,很多类并没有创建内部权值张量等成员变量,此时通过调用类的 build 方法并指定输入大小,即可自动创建所有层的内部张量。通过 summary() 函数可以方便打印出网络结构和参数量:
TensorFlow:Keras 常见功能模块_第1张图片
可以看到Layer 列为每层的名字,这个名字由TensorFlow 内部维护,与Python 的对象名不一样,Param#列 为层的参数个数,Total params 统计出了总的参数量,Trainable params 为待优化的参数量,Non-trainable params 为不需要优化的参数量。

当我们通过Sequential 容量封装多层网络层时,所有层的参数列表将会自动并入
Sequential 容器的参数列表中,不需要人为合并网络参数列表。Sequential 对象的
trainable_variables 和 variables 包含了所有层的待优化张量列表和全部张量列表:
TensorFlow:Keras 常见功能模块_第2张图片
Sequential 容器是最常用的类之一,对于快速搭建多层神经网络非常有用,应尽量多使用来提过代码可读性。

你可能感兴趣的:(TensorFlow,学习,tensorflow)