1、TensorFlow
tensor 是张量的意思在这里理解成多维数组,flow是流的意思,它表明了张量之间通过计算相互转化的过程。
2、计算图
TensorFlow是通过计算图来表述计算的编程系统,图中一个节点是一个计算,节点之间的边描述了计算之间的依赖过程。
3、计算图的表示和使用
import tensorflow as tf
a = tf.constant([1, 2], name='a')
b = tf.constant([2, 3], name='b')
result = a + b
print(result)
a、表示
![](https://img-blog.csdnimg.cn/20201019154413964.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
a:表示常量【1,2】,b:表示常量【2,3】add:表示加操作,并依赖a,b常量
b、tensorboard上的表示
![](https://img-blog.csdnimg.cn/20201019154716914.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
c、计算图,
TensorFlow中系统会自动维护一个默认图,通过tf.get_default_graph 获取当前默认的计算图。
通过tf.Graph()生成新的计算图,不同计算图上的张量和运算不共享。
import tensorflow as tf
g1 = tf.Graph()
with g1.as_default():
a = tf.constant([1, 2], name='a')
b = tf.constant([2, 3], name='b')
add1 = tf.add(a, b, name='add')
g2 = tf.Graph()
with g2.as_default():
a = tf.constant([2, 2], name='a')
b = tf.constant([3, 3], name='b')
add = tf.add(a, b, name='add')
with tf.Session(graph=g1) as ss:
result = ss.run([add1])
print(result)
with tf.Session(graph=g2) as ss:
result = ss.run([add])
print(result)
4、TensorFlow中维护的集合列表
![](https://img-blog.csdnimg.cn/20201019154802227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
5、TensorFlow会话
主动关闭会话释放资源
import tensorflow as tf
a = tf.constant([1, 2], name='a')
b = tf.constant([2, 3], name='b')
add = a + b
sess = tf.Session()
add = sess.run([add])
sess.close()
通过with上下文管理器来释放资源
import tensorflow as tf
a = tf.constant([1, 2], name='a')
b = tf.constant([2, 3], name='b')
add = a + b
with tf.Session() as ss:
result = ss.run([add])
print(result)
6、前向传播
神经元结构示意图
![](https://img-blog.csdnimg.cn/20201019154924655.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
三层神经网络结构示意图
![](https://img-blog.csdnimg.cn/20201019154938553.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
神经网络前向传播算法示意图
![](https://img-blog.csdnimg.cn/20201019154955824.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
7、TensorFlow随机数生成函数
8、TensorFlow常数生成函数
![](https://img-blog.csdnimg.cn/20201019155026243.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
9、TensorFlow变量初始化
单变量初始化
import tensorflow as tf
w1 = tf.Variable(tf.random_normal((2, 2)))
w2 = tf.Variable(tf.random_normal((2, 2)))
add = tf.add(w1, w2, name='add')
sess = tf.Session()
sess.run(w1.initializer)
sess.run(w2.initializer)
print(sess.run([w1, w2, add]))
sess.close()
多变量初始化
import tensorflow as tf
w1 = tf.Variable(tf.random_normal((2, 2)))
w2 = tf.Variable(tf.random_normal((2, 2)))
add = tf.add(w1, w2, name='add')
sess = tf.Session()
# sess.run(w1.initializer)
# sess.run(w2.initializer)
init_op = tf.global_variables_initializer()
sess.run(init_op)
print(sess.run([w1, w2, add]))
sess.close()
10、神经网络反向传播流程图
![](https://img-blog.csdnimg.cn/20201019155129797.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
11、placeholder
placeholder机制相当于定义了一个位置,这个位置的数据在程序运行时再指定。
12、TensorFlow常用的优化函数
tf.train.Optimizer
tf.train.GradientDescentOptimizer
tf.train.AdadeltaOptimizer
tf.train.AdagtadOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer
tf.train.RMSProOptimizer
13、深度学习重要特征
多层和非线性
14、线性模型表示
性质:任意线性模型组合仍然是线性模型。即任意层的全连接神经网络和单层神经网络的表达能力没有任何区别,他们都是线性模型,
线性模型解决的问题有限,这就是线性模型最大的局限性。
15、常用的神经网络激活函数
这些激活函数不是一条直线,每个神经元的输出通过这样一个非线性函数,模型将不再是线性的了。
tf.nn.relu(features, name=None)
tf.nn.relu6(features, name=None)
tf.nn.softplus(features, name=None)
tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
tf.nn.bias_add(value, bias, name=None)
tf.sigmoid(x, name=None)
tf.tanh(x, name=None)
16、感知机可以简单理解为单层神经网络
17、神经网络实际上有组合特征的提取功能,这个特性对于不易提取特征向量的问题(比如图片识别,语音识别)有很大帮助。
18、神经网络模型的效果以及优化的目标是通过损失函数来定义的。
19、交叉熵(cross entropy)是常用的分类问题评判方法之一,交叉熵刻画了两个概率分布之间的距离。
交叉熵是一个信息论中的概念,它原本是用来估算平均编码长度。
给定两个概率分布p和q,通过q来表示p的交叉熵为:
![](https://img-blog.csdnimg.cn/20201019155405621.png)
概率分布刻画了不同事件发生的概率,当事件总数有限的情况下,概率分布函数p(X=x)满足
![](https://img-blog.csdnimg.cn/20201019155417132.png)
20、softmax
softmax层可以将输出变成一个概率分布,其结构如下
![](https://img-blog.csdnimg.cn/20201019155446391.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
公式:
![](https://img-blog.csdnimg.cn/2020101915545861.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
理解:原始输出被用作置信度来生成新输出,这个新输出可以理解为经过神经网络的推导,一个样例为不同类别的概率分别多大,这样就把神经网络输出变成了概率分布,从而可以通过交叉熵来计算预测的概率分布和真实答案的概率分布距离了。
注:交叉熵不是对称的
![](https://img-blog.csdnimg.cn/20201019155514266.png)
它刻画的是通过概率分布q来表达概率分布p的
困难程度(值越小越好),所以用交叉熵做损失函数时,p代表正确答案,q代表预测值。
交叉熵示例:
假设有一个三分类问题,正确答案是(1,0,0),softmax回归后预测答案是(0.5,0.4,0.1)
则交叉熵H((1,0,0),
(0.5,0.4,0.1))=-(1*log0.5+0*log0.4+0*log0.1)=0.3
21、tf.clip_by_value函数
可以将一个张量中的数值限制在一个范围之内。
22、梯度下降法
不论是回归问题优化目标使用均方误差或是分类问题使用交叉熵,都是求函数最小值,曲线理解成模型(函数),要求的是曲线波谷(极小值)下的模型参数。
首先初始化一个模型参数,根据这个参数能求出这个参数下的模型梯度,然后根据学习率来更新参数的幅度。
参数更新公式:
![](https://img-blog.csdnimg.cn/20201019155605593.png)
示例:J(x) = x^2
假设参数初始值是5,学习率是0.3
![](https://img-blog.csdnimg.cn/20201019155617403.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
23.神经网络优化过程
两个阶段
第一阶段:先通过前向传播算法计算得到的预测值,并将预测值和真实值做对比得出两者之间的距离
第二阶段:通过反向传播计算损失函数对一个参数的梯度,在根据梯度和学习率使用梯度下降法更新每个参数
注:梯度下降法并不能保证被优化的函数达到全局最优解。只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优。
![](https://img-blog.csdnimg.cn/20201019155643817.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
24、梯度下降、随机梯度下降和批梯度下降
一、梯度下降
(1) 如果数据集比较小,完全可以采用全数据集(Full Batch Learning)的形式,采用全数据有两个好处:
a. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。
b. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。 Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。
(2) 但是梯度下降也存在一下这些缺点:
a. 梯度下降算法并不能保证被优化函数达到全局最优解,只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解,因此不能保证一定达到全局最优,受限于损失函数是否为凸函数。
b. 梯度下降算法的另外一个问题是计算时间太长,因为要在全部训练数据上最小化损失,在海量训练数据下,这样是十分耗时。
二. 随机梯度下降算法:
为了加速训练的过程,可以使用随机梯度下降算法(stochastic gradient descent-SGD)。随机梯度下降算法也是称为"在线学习"。
(1) 这个算法优化的不是在全部训练数据上的损失函数,而是在每轮迭代中,随机优化某一条训练数据上的损失函数,这样每一轮参数的更新速度大大加快。
(2) 但是带来了如下问题:
在某一条数据上损失函数更小并不代表在全部数据上的损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能无法达到全局最优。
三. 批梯度下降算法:
为了综合梯度下降算法和随机梯度下降算法的优缺点,在实际应用中一般采用这两个算法的这种----->每次计算一小部分训练数据的损失函数。批梯度下降算法(Mini-batches Learning)在深度学习很多算法的反向传播算法中非常常用。这一小部分训练数据也称为一个batch,因此也引入了batch_size的概念,batch_size顾名思义就是来度量每一个batch中实例的个数。
(1) 引入batch有很好的优势:
a. 通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。
b. 每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
--->但是批梯度下降算法带来一个问题,那就是如何选取最优的batch_size?
(2) 可不可以选择一个适中的 Batch_Size 值呢?
当然可以,这就是批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。
(3) 在合理范围内,增大 Batch_Size 有何好处?
a. 内存利用率提高了,大矩阵乘法的并行化效率提高。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
c. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。
(4) 盲目增大 Batch_Size 有何坏处?
a. 内存利用率提高了,但是内存容量可能撑不住了。
b. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
c. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。
25、学习率设置
learning_rate = tf.train.exponential_decay(0.1,global_step,10,0.96,staircase=True)
learning_rate:一个标量类型为float32或floate64、张量或一个python数字,代表初始化的学习率
global_step:一个标量类型为int32或int64,张量或一个python数字,用于衰减计算中,不能是负数。
decay_steps:一个标量类型为int32或int64,张量或一个python数字,必须是正数,用于衰减计算中。
decay_rate:一个标量类型为float32或floate64,张量或一个python数字,表示衰减的比率。
staircase:Boolean类型,默认是False表示衰减的学习率是连续的,如果是True代表衰减的学习率是一个离散的间隔。
26、过拟合问题
所谓过拟合,指的是当一个模型过为复杂之后,它可以很好的记忆每个训练数据中的随机噪声的部分而忘记了去学习训练数据的通用趋势。
27、L1正则化与L2正则化
为了避免过拟合问题,正则化是常用的方法,它的思想是在损失函数中加入刻画模型复杂程度的指标。
假设模型的损失函数是J(
θ
),那么在优化是不直接使用
J(
θ
),而是优化
J(
θ
)+
λR(w),其中R(w)刻画模型的复杂程度,
λ表示模型复杂损失在总损失的比例,
θ表示模型的所有参数
。
L1正则公式表示:
![](https://img-blog.csdnimg.cn/20201019155919673.png)
意义:会让参数更加稀疏,即更多参数变化为0,也达到类似特征选取的功能。
L2正则公式表示:
![](https://img-blog.csdnimg.cn/20201019155931176.png)
意义:将参数限定在一定范围内,防止过拟合。
L1和L2基本思想都是通过限制权重大小,使模型不能任意拟合训练数据中的随机噪音。
28、滑动平均模型
使用滑动平均模型在很多应用中都可以再一定程度提高最终模型在测试数据上的表现,使模型更健壮。
29、验证集作用
神经网络在验证集表现可以近似地作为评价不同模型的标准或者决定迭代轮数的依据。
使用测试数据来选取参数可能会导致神经网络过拟合,因此需要在训练数据中划分一部分数据作为验证数据,不适用验证集也可以采用交叉验证的方法来验证模型效果。
30、训练神经网络
深度学习一方面需要激活函数实现神经网络去线性化,另一方面需要更多个隐层使得神经网络更深,以解决复杂问题。使用指数衰减学习率和正则化来避免过拟合,使用滑动平均模型使最终模型更健壮。
因为神经网络训练过程中随机因素,所以不会得到一模一样的结果。
31、TensorFlow中的变量初始化函数
32、tf.variable_scope函数
本质是上下文管理器,用来控制变量的作用域
reuse=True:tf.get_variable会直接获取变量,如果不存在就报错
reuse=False:tf.get_variable会直接获取变量,如果变量已存在则报错
33、全连接神经网络vs卷积神经网络
34、图像分类问题的卷积神经网络及结构图
![](https://img-blog.csdnimg.cn/20201019160120769.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MTU3OTg2Mw==,size_16,color_FFFFFF,t_70)
输入层:可以使【32,32,3】前两个32分别表示图片的长和宽,3表示三个颜色通道(channel)黑白为1,RGB
彩色为3。
卷积层:卷积层试图将神经网络中每个小块进行更深分析从而得到抽象程度更高的特征。小块一般是3*3或5*5,称为过滤器或内核,一般来说,通过卷积层处理的节点矩阵会变得更深。
池化层:可以将分辨率高的图片转化为较低的图片,能进一步缩小最后全连接层中节点个数,从而减少参数。
全连接层:卷积和池化层看成是自动图像特征提取过程,全连接层用来完成特征向量空间转换,用作后续分类。
softmax:通过softmax层可以得到当前样例属于不同种类的概率分布情况。
35、卷积层输出矩阵长宽计算
a、使用全0填充
输出长= 向上取整(
输入长/步长长)
输出宽= 向上取整(
输入宽/步长宽
)
b、不适用全0填充
输出长= 向上取整((
输入长-过滤器长+1)/步长长
)
输出宽= 向上取整
((
输入宽-过滤器宽+1)/步长宽
)
36、共享过滤器作用
可以使图像上的内容不受位置因素影响
可以巨幅减少网络上的参数
37、LeNet-5
第一层 卷积层
输入层大小是32*32*1,过滤器尺寸是5*5,深度是6,步长是1,没有使用全0填充,则输出长=(32-5+1)/1=28,输出宽=(32-5+1)/1=28
这一层总共有5*5*6+6=156个参数。
第二次池化层
输入大小是28*28*6,过滤器大小是2*2,步长是2,则输出大小是14*14*6
第三次卷积层
输入大小事14*14*6,过滤器大小是5*5,深度是16,步长是1,没有全0填充,则输出长=(14-5+1)/1=10,输出宽=(14-5+1)/1=10
这一层共有5*5*6*16+16=2416个参数
第四次池化层
输入大小10*10*16,过滤器2*2,步长2,输出5*5*16
第五城全连接层
输入是5*5*16,全连接节点是120个,则参数为5*5*16*120 +120= 48120
第六次全连接层
输入是120,84个节点,参数为128*84+84=10164
第七次全连接层
输入84,节点10,参数为84*10+10=850
38、dropout
dropout在训练时会随机将部分节点的输出改为0,来避免过拟合。
39、池化层虽然可以起到减少参数防止过拟合,但在部分论文中发现可以直接通过调整卷积层步长来完成。
40、VGGNet模型
convX-Y:表示过滤器边长是X,深度是Y。
41、Inception-v3
Inception思想是同时使用所有不同尺寸的过滤器,然后在将得到的矩阵拼接起来。
42、迁移学习
所谓迁移学习就是将一个问题上训练好的模型通过简单的调整使其适用于一个新的问题。例如保留训练好的Inception-v3所有卷积层参数,只替换最后一层全连接层,在最后这一层全连接层之前的网络层称之为瓶颈层。
一般来说在数据足够情况下,迁移学习的效果不如完全重新训练。