深度学习
Last updated
Was this helpful?
Last updated
Was this helpful?
参考资料:实战谷歌TensorFlow框架
卷积神经网络
L0范数:向量中0的个数
L1范数:向量元素绝对值之和
L2范数:向量元素平方和再开方
L-P范数:向量元素p次方之和再开p方根
归一化:将数据变成某个特定范围之间的数值;把有量纲的数据变为无量纲的数据
优点:加快梯度下降求解最优解的速度;可能提高精度
归一化属于线性变化,不会影响原数据的性质
条件概率:在B发生的情况下,A发生的概率
贝叶斯公式:在A发生的情况,寻找导致A发生的Bi的可能性(图片怎么这么大?)
上面分数上是条件概率,代表AB事件同时发生的概率,下面是全概率公式,代表A发生的概率,然后这个分数也就是条件概率的变形,代表在A事件发生的情况下B事件发生的概率
softmax
信息熵
信息熵是消除不确定性所需信息量的度量,也即未知事件可能含有的信息量
奈奎斯特定理和香农定理
原文提到的波特率可能是错的,真实的应该是传递的符号数,
确定了每个符号拥有的位数之后,才可以确定波特率
写论文、写诗、写程序
梯度消失是指更新参数时会用到激活函数的导函数,如果这个导函数得到的结果总是小于1,那么不断相乘之下,结果就会很小,最终对末层的参数没有起到优化修改的作用;而梯度爆炸是指当导函数结果总是大于1时,对参数的修改会越来越大。
梯度消失和梯度爆炸的原因:反向传播法则,激活函数
问题:如果这些激活函数有这样的隐患的话,为什么还在用它们?
解决方法:
预训练
梯度剪切、权重正则
换激活函数(relu,leakrelu,elu)
batchnorm:在反向传播中乘以权重
逻辑回归不仅可以做二分,而且可以给出属于该类的概率
12、channel和卷积核
在我看来就是深度,样本深度,过滤器深度(卷积核个数)
in_channel:此层输入的深度
out_channel:此层要输出的深度,也就是过滤器的深度
深度神经网络中的线性和非线性模型,激活函数,隐藏层解决异或运算(提取高维特征)
损失函数刻画推测结果与正确结果的落差,分类问题,回归问题
分类问题
交叉熵用来刻画两个概率分布之间的距离,不对称,实际意义是用q来表达p的难度,p为正确结果,q为输出结果
但神经网络的输出不是概率分布,于是使用softmax回归算法,去掉回归参数后,对原始输出结果做处理,得到概率分布,
因为softmax和交叉熵经常一起使用,因此TensorFlow将两者合并了,直接就可以得到softmax回归之后的交叉熵
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
回归问题
使用均方误差来刻画
自定义损失函数
tf.placeholder、tf.Variable、tf.random_normal
反向传播算法:所有参数;梯度下降算法:单个参数
学习率:每次参数移动的幅度
反向传播算法:首先前向传播得到预测值,然后计算预测值和实际值之间的差距,再然后使用反向传播算法计算每个参数的梯度,再然后使用梯度和学习率来更新每个参数
梯度下降算法的结果可能是局部最优,这个很容易理解,因此初始值对结果的影响就可能会变得很大;另外就是耗时间,每次迭代都要将所有数据计算一遍
随机梯度下降算法(SGD):提高效率,随机的问题也很明显,以偏概全,结果可信度下降
折中方法,batch,每次计算一块数据,时间不会比一条数据慢太多,其次降低迭代次数。
学习率
指数衰减法设置学习率参数,前期较快接近,后期稳定靠近
该函数中有一个staircase的参数,默认为False,此时学习率的下降趋势就是指数衰减,如果为True,则为阶梯下降的趋势,较为集中的数据集在训练阶梯类型时会起到相同的作用,
代码部分:
learning_step能不能代入到Adm优化的算法中?
各个参数的意义
初始学习率,每隔decay_steps下降decay_rate,但这个global_step还是不太清楚
过拟合问题(Dropout)
正则化避免过拟合,在损失函数中加入刻画模型复杂程度的指标,这样我们在优化参数的时候就不是只根据损失函数,而是根据损失函数和模型的复杂度之和
前者代表原来的损失函数,参数θ包括模型中所有的参数,w和b;后者代表模型复杂度,一般只由w决定。
正则化
L1正则化:绝对值相加;L2正则化:平方相加
L1的问题,参数变稀松(出现更多的0),L2不会;不可导,L2可导
当然也有将两者结合的优化方法
当神经网络结构变复杂之后,这样的正则化就可能很不方便了,解决这个问题,可以使用TensorFlow中提供的collection
3、滑动平均模型
滑动平均模型会对每个变量,(确定不是参数?),不是很懂在什么样的情形下使用影子变量
神经网络的结构会对神经网络的准确率有很大的影响,常用的神经网络结构--卷积神经网络(CNN)
图像识别技术近年来的突破进展背后卷积神经网络就是最大的技术支持
全连接层神经网络,卷积神经网络、循环神经网络
卷积神经网络中每一个节点都是一个神经元(在所有的神经网络结构中不都是这样的吗?)
在相邻两层只有部分节点相连,
“为了展示每一层神经元的维度,一般会将每一层卷积层的节点组织成一个三维矩阵”
输入为原始像素,输出为每个类别的可信度,与全连接神经网络的唯一区别就是神经网络中相邻两层的连接方式
全连接神经网络失败的原因:在处理图像识别时,参数过多,容易导致过拟合,计算速度变慢,因此要有效减少神经网络中的参数个数
输入层:原始图片像素组成的三维矩阵,长×宽×深度
卷积层:每一个节点的输入只是上一层神经网络的一小块(提取抽象程度更高的特征),大小3×3,或5×5,经过卷积层处理的矩阵会变得更深,
池化层:作用是缩小矩阵的大小,深度不变,减少节点数,主要目的是为了减少参数,
全连接层:
softmax层:
1、卷积层
过滤器需要指定三个参数,长宽,深度;长宽是过滤器要处理的节点矩阵的长宽,深度是指处理得到的矩阵的深度
输入图片集,数据为四维矩阵,第一个参数代表第几张图片,后面三维矩阵代表图片信息;然后创建过滤器的变量,需要确定尺寸和当前层的深度和过滤器深度,其中当前层的深度是由当前层的神经网络的深度确定的,其余需要设置;确定好之后,使用下面的函数
来操作卷积层的操作,
w权重矩阵与原数据截取出来的那一部分尺寸是相同,因为它们是点乘,所以最后结果一定是一个数据,也因此过滤器得到的结果是一个1×1×deep的矩阵(深度不限)
问题:当过滤器移动在同一层的神经网络上时,同一层使用权重参数是不是相同的?
问题:在numpy矩阵可以与常数相加,结果便是矩阵中每个数据都加上这个数据,在tensorflow中不行吗?
2、池化层
使用最大值操作的池化层被称为最大池化层,用得最多,使用平均值操作的叫做平均池化层,用得较少
卷积层中间往往会添加一个池化层,用于缩减矩阵尺寸,减少节点和参数的个数
这一层的操作不会影响矩阵的深度,只会影响长宽,效果是提取数据特征
怪不得这种方法可以很好地用于图片识别
形式与卷积层类似
问题:ksize定义的过滤器尺寸中每个位置参数的意义是不是与卷积层过滤器中的参数意义不相同?
答:先别管了,ksize一四参数为1,其余为池化层过滤器尺寸;strides,一四参数为1,其余为步长幅度
TensorFlow_slim,TFlearn,Keras,Estimator
基础用法:
训练过程可以分为数据处理,模型定义和模型训练三个部分。
Keras如何实现lenet5结构,暂时跳过循环神经网络的部分
高级用法:
Sequential只适合实现顺序性的模型结构,但是如Inception这类的就不适用了。
还有用keras实现多输入多输出的结构
缺点:
1、原生态的Keras API对训练数据的处理流程支持得不太好,基本上需要一次性把数据全部加载到内存
2、原生态Keras API无法支持分布式训练
解决方法就是讲Keras和Tensorflow API结合起来