基本知识
# 常用模块
tf.keras中常用模块如下表所示:
模块 | 概述 |
---|---|
activation | 激活函数 |
applications | 预训练网络模块 |
callbacks | 在模型训练期间被调用 |
datasets | 数据集模块 |
layers | 层API |
losses | 各种损失函数 |
metircs | 各种评价指标 |
models | 模型创建、与模型相关的API |
optimizers | 优化方法 |
preprocessing | 数据预处理模块 |
regularizers | 正则化,L1,L2等 |
utils | 工具类,如展示图像 |
# 执行流程
深度学习实现的主要流程:
- 数据获取
- 数据处理
- 模型创建与训练
- 模型测试与评估
- 模型预测
# 数据获取
数据可以由一线部门提供或者从网上获取数据集
例如: Fashion-MNIST
是一个替代MNIST手写数字集 (opens new window)的图像数据集。 它是由Zalando(一家德国的时尚科技公司)旗下的研究部门 (opens new window)提供。其涵盖了来自10种类别的共7万个不同商品的正面图片。Fashion-MNIST的大小、格式和训练集/测试集划分与原始的MNIST完全一致。60000/10000的训练测试数据划分,28x28的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
(x_train,y_train),(x_test,y_test) = tf.keras.datasets.fashion_mnist.load_data()
1
# 数据处理
获取到的数据需要利用变形、筛选等步骤才能作为训练集和测试集使用
# 将0~255的色度转化到0~1区间内
x_train = x_train/255
x_test = x_test/255
1
2
3
2
3
# 模型创建
- 简单模型使用Sequential进行构建
- 复杂模型使用函数式编程来构建
- 继承Model类定义模型
# 方法一:简单模型使用Sequential进行构建
model = tf.keras.Sequential(
tf.keras.layers.Flatten(input_shape=(28,28)),
tf.keras.layers.Dense(128,activation='relu'),
tf.keras.layers.Dense(10,activation='softmax')
)
# 方法二:复杂模型使用函数式编程来构建
# 利用Function API构建
# 定义模型的输入
inputs = tf.keras.Input(shape=(28,28),name="input");
x = tf.keras.layers.Flatten()(inputs)
# 第一层隐藏层: 激活函数为relu,其他默认
x = tf.keras.layers.Dense(128,activation='relu',name="layer1")(x)
# 输出层: 激活函数为softmax,其他默认
outputs = tf.keras.layers.Dense(10,activation='softmax',name="layer2")(x)
# 使用Model生成模型,并指明input和output
model = tf.keras.Model(inputs=inputs,outputs=outputs,name="my_model")
# 方法三:继承Model类定义模型
# 用Model子类构建模型(并非同个案例)
class MyModel(tf.keras.Model):
# 在__init__中定义模型的结构
def __init__(self):
super(MyModel,self).__init__()
# 第一层隐藏层:层单元数量为3,激活函数为relu,参数初始化为he_normal,输入特征为3个
self.layer1 = tf.keras.layers.Dense(3,activation='relu',kernel_initializer='he_normal',name='layer1',input_shape=(3,))
# 第二层隐藏层:层单元数量为2,激活函数为relu,参数初始化为he_normal
self.layer2 = tf.keras.layers.Dense(2,activation='relu',kernel_initializer='he_normal',name='layer2')
# 第三层输出层:层单元数量为2,激活函数为sigmoid,参数初始化为he_normal
self.layer3 = tf.keras.layers.Dense(2,activation='sigmoid',kernel_initializer='he_normal',name='layer3')
# 在call中定义前向传播
def call(self,inputs):
x = self.layer1(inputs)
x = self.layer2(x)
return self.layer3(x)
# 实例化自定义模型
model=MyModel()
# 设置输入
x = tf.ones((1,3))
y = model(x)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# 模型训练与预测
指明训练数据集,训练epoch,批次大小和测试集数据
model.fit(x_train,y_train,epochs=10,batch_size=3,validation_data=(x_test,y_test))
1
- epochs:使用训练集全部数据对模型进行一次完整训练,被称为“一次训练”
- batch:使用训练集中的一小部分样本对模型权重进行一次反向传播的参数更新,这一小部分被称为“一批数据”
- iteration:使用一个batch数据对模型进行一次参数更新的过程,被称为“一次训练”
实际上,梯度下降的几种方式的根本区别就在于上面公式中的 Batch Size不同,如下表所示
梯度下降方法 | Training set size | Batch size | Number of Batches |
---|---|---|---|
BGD | N | N | 1 |
SGD | N | 1 | N |
Mini-Batch | N | B | N/B+1 |
注:上表中 Mini-Batch 的 Batch 个数为 N/B+1是针对未整除的情况。整除则是N/B。
假设数据集有 50000个训练样本,现在选择 Batch Size = 256 对模型进行训练。
- 每个Epoch 要训练的图片数量: 50000
- 训练集具有的 Batch 个数: 50000/256+1=196
- 每个Epoch 具有的 lteration 个数: 196
- 10个Epoch 具有的Iteration 个数: 1960