1 import
import tensorflow as tf
2 使用Sequential建立模型
在tf.keras.models.Sequential中添加模型:
官方文档对 Sequential 的描述是:Sequential groups a linear stack of layers into a tf.keras.Model
使用示例如:
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
# or
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(128, activation=;'relu')
model.add(tf.keras.layers.Dense(10, activation=;'softmax')
上一段函数建立了一个两层的全连接层。
2.1 全连接层
tf.keras.layers.Flatten()是一个用来将多维张量拉长变为一维张量的函数,如[[1, 2], [3, 4]]变为[1, 2, 3, 4]。tf.keras.layers.Dense()表示添加全连接函数,其中的参数activation表示添加的激活函数,分别为ReLU和softmax函数。其中的具体参数如下所示:
tf.keras.layers.Dense(
units, activation=None, use_bias=True, kernel_initializer='glorot_uniform',
bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None,
activity_regularizer=None, kernel_constraint=None, bias_constraint=None,
**kwargs
)
参数 | 参数的赋值、具体含义 |
---|---|
units | 正整数,表示输出空间的维数 |
activation | 字符串,表示激活函数,有’relu’、’‘softmax’、‘sigmod’、'tanh’等 |
use_bias | 布尔值,表示该曾是否使用偏置 |
kernel_initializer | 表示权重的初始化程序 |
bias_initializer | 表示偏置的初始化程序 |
kernel_regularizer | 表示权重的正则化方式,有l1、l2等 |
bias_regularizer | 表示偏置的正则化方式 |
activity_regularizer | 表示激活的正则化方式 |
kernel_constraint | 表示权重的约束函数 |
bias_constraint | 表示偏置的约束函数 |
2.2 卷积层
如果要添加卷积层,使用tf.keras.layers.Conv2D
tf.keras.layers.Conv2D(
filters, kernel_size, strides=(1, 1), padding='valid', data_format=None,
dilation_rate=(1, 1), groups=1, activation=None, use_bias=True,
kernel_initializer='glorot_uniform', bias_initializer='zeros',
kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None,
kernel_constraint=None, bias_constraint=None, **kwargs
)
该类许多参数与上面的Dense相似,在此只列举使用方式不同的参数:
参数 | 参数的赋值、具体含义 |
---|---|
filters | 整数,输出空间的维数(卷积核个数) |
kernel_size | 一个整数或者两个整数的元组或列表,表示卷积核的h和w |
strides | 一个整数或者两个整数的元组或列表,表示步长 |
padding | 字符串,表示填充方式,可选"same"或者"valid" |
data_format | 字符串,可选channels_last(默认)或channels_first,表示输入数据的顺序,如果选择channels_last,顺序为(batch_size, height, width, channels) ,选择channels_first顺序为(batch_size, channels,height, width) |
dilation_rate | 一个整数或者两个整数的元组或列表,表示指定用于卷积膨胀的膨胀率 |
groups | 一个正整数,指定输入沿通道轴划分的组数。 |
2.3 BN层
如果要添加BN层,使用tf.keras.layers.BatchNormalization
tf.keras.layers.BatchNormalization(
axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True,
beta_initializer='zeros', gamma_initializer='ones',
......, **kwargs
)
其中较为常见的有momentum动量等,此外需要注意的是,在训练过程中,如果使用了fit函数或 调用层或模型的时候使用training=True,BN 操作采用当前 batch 的均值和标准差当training = False 时,BN 操作采用滑动平均(running)的均值和标准差。在 Tensorflow 中,通常会指定training = False,可以更好地反映模型在测试集上的真实效果。滑动平均(running)的解释:滑动平均,即通过一个个 batch 历史的叠加,最终趋向数据集整体分布的过程,在测试集上进行推理时,滑动平均的参数也就是最终保存的参数。
2.4 池化层
如果要添加池化层,使用:
tf.keras.layers.AveragePooling2D
tf.keras.layers.AveragePooling2D(
pool_size=(2, 2), strides=None, padding='valid', data_format=None,
**kwargs
)
tf.keras.layers.MaxPool2D
tf.keras.layers.MaxPool2D(
pool_size=(2, 2), strides=None, padding='valid', data_format=None,
**kwargs
)
此外ReLU等层也可以通过tf.keras.layers进行添加。
3 模型配置及训练过程设置
3.1 compile配置
模型搭建好之后,训练的相关优化配置可以通过compile函数进行配置。
def compile(self,
optimizer='rmsprop',
loss=None,
metrics=None,
loss_weights=None,
weighted_metrics=None,
run_eagerly=None,
**kwargs):
# Configures the model for training.
# how to use
model = tf.keras.models.Sequential()
model.compile(optimizer=,
loss=,
metrics=,
......)
其中:
optimizer(优化器)可以赋值为字符串或者具体的函数(具体的class见tf.keras.optimizers)。
loss(损失函数)可以赋值为字符串或者具体的函数(具体class见tf.keras.losses)。
Metrics 可以输出网络评测的指标,以下为其中的三个主要参数(具体class见tf.keras.metrics.Metric)。
3.2 过程设置
模型的训练过程可以通过fit函数进行设置:
def fit(self,
x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_data=None,
......):
# how to use
model = tf.keras.models.Sequential()
model.fit(x=None,
y=None,
batch_size=None,
epochs=1,
......)
x一般为输入数据,y为数据的标签,还可以设置batchsize、epoch、validation_data(验证数据)。
4 统计与评估
4.1 统计
最后可以使用summary函数打印出网络结构和参数统计:
model = tf.keras.models.Sequential()
model.summary()
# example of output
Model: "mnist_model"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
flatten (Flatten) multiple 0
_________________________________________________________________
dense (Dense) multiple 100480
_________________________________________________________________
dense_1 (Dense) multiple 1290
=================================================================
Total params: 101,770
Trainable params: 101,770
Non-trainable params: 0
_________________________________________________________________
4.2 评估
也可以用tf.keras.Model.evaluate函数来进行评估训练效果:
evaluate(
x=None, y=None, batch_size=None, verbose=1, sample_weight=None, steps=None,
callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False,
return_dict=False
)
# how to use
model = tf.keras.models.Sequential()
model.evaluate(x=None, y=None)
x,y分别是测试数据以及标签。
5 自定义
5.1 自定义模型
不使用tf.keras.models.Sequential建立模型,可以通过继承父类tf.keras.Model来编写属于自己的模型,主要通过重写__init__()和call()来实现。
class MyModel(tf.keras.Model):
def __init__(self):
super().__init__()
# 初始化代码,包括call()方法中会用到的层
self.layer = tf.keras.layers.Conv2D()
......
def call(self, input):
# 建立模型的具体过程
x = self.layer(inptu)
......
output = tf.nn.softmax(x)
return output
值得注意的是,在此处是重写的call()方法而不是_call_()方法,是因为在tf.keras.Model中_call_()被Keras使用了并且有一定用处,所以专门有一个用来重载的call()方法。
5.2 自定义层、损失函数、评估指标
自定义层通过继承tf.keras.layers.Layer类,重写__init__()、build()、call()三个方法实现。
class MyLayer(tf.keras.layers.Layer):
def _init_(self):
super().__init__()
# 初始化代码
def build(self, input_shape):
# 在第一次使用该层时调用该部分代码
# 在这里创建变量可以使变量的形状自适应输入的形状而不需要额外指定变量
# 如果已经可以完全确定变量的形状,也可以在__init__部分创建变量
self.variable = self.add_weight()
def call(self, input):
......
return output
自定义损失函数需要继承tf.keras.losses.Loss类,并重写call方法。
自定义评估指标需要继承tf.keras.metrics.Metric类,并重写__init__、update_state、result三个方法。
参考:
tf官方文档
tf相关慕课
简明的TensorFlow2 李锡涵等著