04_深度学习与tf.keras基础API总结
1. 深度学习基本问题
1.1 什么是深度学习
深度学习允许由多个处理层组成的计算模型来学习具有多个抽象级别的数据表示,这些方法极大地改善了语音识别,视觉对象识别,物体检测以及药物发现和基因组学等许多其他领域的最新技术。深度学习通过使用反向传播算法来指示机器应如何更改其内部参数(用于从前一层中的表示)计算每个层中的表示来发现大数据集中的复杂结构。
- 深度学习出发点:数据+任务。确定任务后获取相应的数据集,数据集形成的过程中往往伴随着噪声数据,噪声是相对于每一个任务来说,因为可能不同的任务对同一份数据集的需求是不一样的。因此数据基于任务的目标可以分成两部分,即有价值的数据和噪声。深度学习的每一个Layer就是用来放大前者,抑制后者的,经过一系列的Layer之后,数据中最有用的部分被提取出来,之后再进行相应目标的任务会特别简单,这就是深度学习。
1.2 深度学习计算的本质
在计算机,或者说在TensorFlow
中,深度学习计算的本质是张量(Tensor)
的计算,每一层Layer
都是数据的一系列几何变换,这是使得复杂问题简单化的过程(放大数据中的价值,抑制噪声),深度学习的训练过程就是一系列的几何变换的搜索过程。所谓的搜索过程,就是一开始几何变换的方法是未知的(或者说模型的权重参数是未知的),但是可以通过数据来反推应该如何进行变换,使得经过变换后的数据更加有用。
1.3 分类问题与回归问题
分类问题预测的是目标的类别,模型的输出是每个类别的概率分布,比如对于三分类的问题,模型的输出可能是 [0.1,0.1,0.8],不同的索引对应不同的类别,它的类别就是值最大的那个索引,在前面的例子中,模型给出的结果类别就是索引 [2] 位置对应的类别。
回归问题预测的是一个值,例如房价等连续变量。
1.4 神经网络的基本要素
-
输入数据(InputData)
:InputData
真正决定了任务实现的上限,学术界都是在数据规定好的上限内通过一定的算法逼近上限,工业界由于各家数据不同,上限也各不相等。 -
网络层(Layer)
:Layer
是神经网络的基本数据结构,它是一个数据处理的模块,数据(一个或者多个Tensor
)经过一个Layer
转换成一个或者多个Tensor
。大部分Layer
是有状态的,其状态的表示就是层的权重(weights)
,如卷积层,全连接层。少部分层是没有状态的,如池化层。每一层的权重就是通过Loss
和Optimizer
学习到的"知识"。 -
模型(Model)
:Model
是一系列Layer
连接而成的有向无环图,模型的拓扑结构决定了搜索空间,搜索空间过大会导致很难找到合适的数据表示,搜索空间太小容易导致数据表示的表达效果上限很低。 -
损失函数(Loss)
:深度学习中的参数是逐步调整的,让预测值逐步逼近真实值,Loss
可以帮助衡量模型的好坏,它决定了训练的反馈信号。对于分类问题来说,Loss
需要衡量出目标类别与当前预测的差距,例如对于一个三分类问题来说,假设模型输出为 [0.1,0.1,0.8],真实分类是 2,则需要将 2 通过独热编码(one-hot)变成一个分布 [0,0,1],这时候就可以计算 [0.1,0.1,0.8],[0,0,1] 这两个向量的距离。对于回归问题来说,因为预测结果直接就是一个值,因此只需衡量出两个值之间的差距。 -
优化器(Optimizer)
:Optimizer
决定了如何利用反馈信号,即Loss
去调整模型。
2. tf.keras基础
2.1 keras工作流
2.2 keras主要模块
Dataset
,Model
,Layer
,Loss
,Optimizer
,Metrics
。
这里有一个小 trick,就是在TensorFlow
官网中查询keras
相关资料时之能查到很少的东西,因此想查询api具体的解释建议去 keras官网 来查询。还有就是往往随着版本的升级,可能本来在这个模块下的一个函数,被弄到了另一个模块下,导致函数本身是有的,但是导入的时候却找不到,这个时候只要去搜索这个函数,就会看到这个函数当前在哪个模块下。以下内容参考了keras官方中文文档。
3.Sequential Model
tf.keras
中的Sequential Model
是keras
三大模型方法中为最简单的,它只支持线性的结构顺序,因此不支持定义多输入和多输出的模型,它是多个网络层(卷积层,池化层,Dropout层等)的线性堆叠 。
Sequential Model
的相关方法文档链接:
3.1 模型定义
模型定义主要有两种方法:构造函数定义
或者通过model.add
方法。
构造函数定义是在实例化Sequential
对象的时候就将各个层通过一个列表传进去,如下面的代码:
model = Sequential([
Dense(units=200,input_dim=784,bias_initializer='one',kernel_regularizer=l2(0.0003),activation='tanh'),
Dropout(0.4),
Dense(units=100,input_dim=200,bias_initializer='one',kernel_regularizer=l2(0.0003),activation='tanh'),
Dropout(0.4),
Dense(units=10,input_dim=100,bias_initializer='one',kernel_regularizer=l2(0.0003),activation='softmax'),
])
add
方法,实例化好Sequential
对象可以调用该方法以向网络中添加新的层:
model = Sequential()
model.add(Dense(units=200,input_dim=784,bias_initializer='one',
kernel_regularizer=l2(0.0003),activation='tanh'))
model.add(Dropout(0.4))
model.add(Dense(units=100,input_dim=200,bias_initializer='one',
kernel_regularizer=l2(0.0003),activation='tanh'))
model.add(Dropout(0.4))
model.add(Dense(units=10,input_dim=100,bias_initializer='one',
kernel_regularizer=l2(0.0003),activation='softmax'))
3.2 keras网络层
Keras网络层
的相关方法文档链接:
3.2.1 Dense层
https://keras-zh.readthedocs.io/layers/core/
Dense
层即全连接层,主要参数:
units
: 正整数,输出的维度。activation
: 激活函数, 若不指定,则不使用激活函数。bias_initializer
: 偏置向量的初始化器。kernel_regularizer
: 运用到 kernel 权值矩阵的正则化函数。
使用示例:
model.add(Dense(units=200,input_dim=784,bias_initializer='one',
kernel_regularizer=l2(0.0003),activation='tanh'))
3.2.2 Dropout层
https://keras-zh.readthedocs.io/layers/core/
主要参数:
rate
: 在 0 和 1 之间,需要丢弃的输入比例。
使用示例:
model.add(Dropout(0.25))
3.2.3 卷积层Conv2D
https://keras-zh.readthedocs.io/layers/convolutional/
主要参数:
input_shape
: 输入大小,模型的第一个卷积层需要指定该参数。filters
: 巻积核个数。kernel_size
:卷积核大小。strides
:卷积步长。padding
:padding方式。activation
:激活函数。
使用示例:
model.add(Conv2D(64,3,strides=2,padding='same',activation = 'relu'))
3.2.4 最大池化层MaxPooling2D
https://keras-zh.readthedocs.io/layers/pooling/
主要参数:
pool_size
:池化尺寸。strides
:池化步长。padding
:补足方式。
使用示例:
model.add(MaxPooling2D(2,2,'same'))
3.2.5 拉平Flatten
https://keras-zh.readthedocs.io/layers/core/
使用示例:
model.add(Flatten())
3.3 模型编译
模型的层添加好的可以使用compile
方法来编译模型,例如
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])
其中optimizer
指示优化器,loss
指示损失函数,metrics
指示评估标准,这些可以定制化。
主要参数:
optimizer
: 字符串(优化器名)或者优化器对象。详见https://keras.io/optimizers/。loss
: 字符串(目标函数名)或目标函数。详见 https://keras.io/losses/。 如果模型具有多个输出,则可以通过传递损失函数的字典或列表,在每个输出上使用不同的损失。模型将最小化的损失值将是所有单个损失的总和。metrics
: 在训练和测试期间的模型评估标准。通常你会使用metrics = ['accuracy']
。 要为多输出模型的不同输出指定不同的评估标准,还可以传递一个字典,如metrics = {'output_a':'accuracy'}
。loss_weights
: 指定标量系数(Python浮点数)的可选列表或字典,用于加权不同模型输出的损失贡献。 模型将要最小化的损失值将是所有单个损失的加权和,由loss_weights
系数加权。 如果是列表,则期望与模型的输出具有 1:1 映射。 如果是张量,则期望将输出名称(字符串)映射到标量系数。sample_weight_mode
: 如果你需要执行按时间步采样权重(2D 权重),请将其设置为temporal
。 默认为None
,为采样权重(1D)。如果模型有多个输出,则可以通过传递 mode 的字典或列表,以在每个输出上使用不同的sample_weight_mode
。weighted_metrics
: 在训练和测试期间,由sample_weight
或class_weight
评估和加权的度量标准列表。target_tensors
: 默认情况下,keras
将为模型的目标创建一个占位符,在训练过程中将使用目标数据。相反,如果你想使用自己的目标张量(反过来说,keras
在训练期间不会载入这些目标张量的外部Numpy
数据),可以通过target_tensors
参数指定它们。对于单输出Sequential
模型来说,它应该是单个张量。
3.4 模型训练
模型编译好后就可以开始训练,训练使用的是fit
方法,里面需要指定训练集,可以配置batch_size
和训练轮次,如下:
model.fit(x_train_data,y_train_data,batch_size=64,epochs=100)
model.fit
返回一个History
对象。其History.history
属性是连续 epoch 训练损失和评估值,以及验证集损失和评估值的记录(如果适用)。
4. 总结
- 选择
tf.keras
。 tf/keras
是武器,MachineLearning
和DeepLearning
是内功。