Mitchy
今日もキラキラしていこう♪

大纲简介:

1. 将分类器变成深度网络

2. 用优化器计算梯度

3. 理解正则化

用之前MNIST例子,线性模型的参数有28*28(像素)*10(宽度)+10(b) = 7850个参数

总结一下就是(N+1)*K个参数,N是输入的维度,K是输出的维度。

线性模型能表现的输入输出关系有限,但是它高效(矩阵运算)、稳定。所以希望有一个在线性模型中加入一点非线性元素,使其保留线性模型的优点。

RELU: 最简单的非线性模型 f(x) = max(0, x)

在原来的线性模型输入后面插入一层Wx+b(隐藏层/中间层),再插入ReLUs,就有了一个简单的2层神经网络~

TensorFlow中:tf.nn.relu()

 

这里我们将模型转化为线性模块流程图,每一个模块都代表一步操作,每一步操作可以是基础的矩阵运算或数学运算,那么由于模型拥有前馈和(同样步数的)反馈,其实很多数学计算是可以被重复利用的,不过中间过程我们不用管,总之最终反馈的线路会用到比前馈多两倍的计算和内存,这个可以帮助估算模型占用内存和计算时间。

 

一些常用函数:tf.nn.softmax_cross_entropy_with_logits(logits = logits, label = y)

tf.train.GradientDescentOptimizer(learning_rate=learning_rate)

mnist.train.next_batch(batch_size)

扩展阅读:TensorFlow应用例子 https://github.com/aymericdamien/TensorFlow-Examples

 

如果想要模型更精确,比起加大中间层的宽度,不如加层数,所以才叫深度学习。当层度变多,模型能够捕捉到的就不止是线和边,而是图形,如果层数更多就有可能识别物体,比如人脸。归根究底模型就是在提取特征,层数越多提取起来会越方便。

 

想保存训练好的模型的话用tf.train.Saver.save(),可以保存所有tf.Variable,比如weights和bias。如果用的是0.11.0RC1或以上的TensorFlow那么还会生成一个.meta的TF图文件。

tf.reset_default_graph()

tf.train.Saver.restore()

提取保存的tensor变量的时候虽然不用初始化了但是变量名字还是需要定义的。

如果想调整保存好的模型的话,直接使用很容易出错,比如定义变量的时候顺序和保存时的顺序不一样就会出现shapes of tensors not match的错误,所以我们需要手动设定name这个property。

 

由于我们很难找到一个刚好的模型,所以我们一般会造一个更大的模型,并且防止其过拟合。

方法之一就是提早停止训练,一旦模型的准确度不再提高就停止训练。

方法之二就是正则化,人为地加一些限制,使模型的自由度降低 -> L2 Regularization:在原有的loss上加一个和权重平方正相关的系数,用于惩罚过大的权重。

方法之三是Dropout,在神经网络的激活函数部分每次都要随机杀掉一半的输出(强行将一半输出设为0),所以每次学到的都是幸存的表达,只留存了部分信息,能够有效避免过拟合,让模型拥有更强的鲁棒性。如果你觉得这个方法不行,试试更大的神经网络!

在评估dropout神经网络的时候,我们希望输出的期望和训练时输出的期望相等,但是评估的时候不会像训练时候一样随机砍掉一半的输出,所以我们将留下的一半的值乘以2

posted on 2020-08-24 23:18  Mitchy  阅读(195)  评论(0编辑  收藏  举报