Tensorflow进阶

第一章

图像域,从(i)类图像中提取的特征:

[={i,j}x_j+b_i]

其中,(j)表示图片的第(j)个像素,(b_i)是偏差值(bias),顾名思义,就是数据本身的一些趋势,例如,如果训练得到的大部分参数(w)都是0,那么0特征对应的bias就会很大。

对于多分类问题,通常使用交叉熵作为损失函数(loss),通常可以用来判断模型对真实概率分布的估计的准确性,

[H_{ y’}(y)=-\’log(y_i)]

其中,(y’) 为真实概率分布,(y) 为预测概率分布

y_=tf.placeholder(tf.float32,[None,10])  # 真实label
cross_entropy=tf.reduce_sum(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))

定义优化器

train_step=tf.train.GradientDecentOptimizer(learning_rate=0.1).minimize(cross_entropy)

图片[1]-Tensorflow进阶-唐朝资源网

初始化:

tf.global_variable_initializer().run()

使用样本子集进行训练,称为随机梯度下降,对应于传统梯度下降每次都使用所有样本唤醒训练。如果每次都使用所有样本,计算量太大,可能跳不出局部最优。

for i in range(1000):
    batch_xs,batch_ys=mnist.train.next_batch(64)
    train_step.run(feed_dict={x:batch_xs,y:batch_ys})

计算精度:

correct_prediction=tf.equal(tf.argmax(y,axis=-1),tf.argmax(y_,axis=-1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

print(accuracy.eval(feed_dict={x:mnist.test.images,y_:mnist:test.labels}))

第二章第三章

p>

一般来说,提高卷积层的表现力,主要是靠增加输出通道的数量,但是副作用就是增加计算量和过拟合,因为每个输出通道对应一个滤波器(卷积核),同一个共享参数,只能提取一种特征,所以一个输出通道只能做一种特征处理。而 NIN 中的 MLP conv 具有更强大的能力,允许在输出通道之间组合信息。 MLP conv基本相当于普通的卷积层,然后连接1×1卷积和ReLU激活函数。 1×1卷积是一个很好的结构,可以跨通道组织信息,提高网络表达能力,同时可以输出通道进行维度上下。

如果数据集的概率分布可以用一个非常大且非常稀疏的神经网络来表示,那么构建这个网络的最佳方式是逐层构建网络,将前一层高度相关的节点聚类,并连接集群中的每个小集群。

Batch 是一种非常有效的正则化方法,可以将大型卷积网络的训练速度提高数倍,同时显着提高收敛后的分类精度。当BN作用于神经网络的每一层时,会对里面的mini-batch数据进行标准化,使输出归一化为N(0,1)的正态分布,减少内部协方差偏移(shift) .

v3网络结构:首先是5个卷积层和2个池化层交替的普通结构,然后是3个模块组,每个模块组包含多个相似的结构。设计网一个重要的原则是:图像尺寸不断缩小,但输出通道不断增加;每一层卷积、池化或模块组的目标是简化空间结构,同时将空间结构信息转化为高层抽象特征信息,即将空间维度转化为通道维度。

规则:一般有4个分支,第一个分支一般是1×1conv;第二个分支一般是1×1conv再分解第三个分支的n×1或1×n卷积和第二个分支类似,但一般更深;抽象(),更复杂的特征抽象( 2和)以及一个结构简化的 layer)(),一共4个不同程度的特征抽象和变换)有选择地保留不同级别的高级特征,以最大限度地提高网络的表现力。

一般认为神经网络的深度对性能很重要,但网络越深越难训练。

图片[2]-Tensorflow进阶-唐朝资源网

相当于修改了每一层的激活函数。前面的激活函数只对输入(y=H(x,w_h))进行非线性变换,但允许保留一定比例的原始输入(x),即(y=H( x,w_h)*T(x,w_T)+x*C(x,w_c)),其中(T)为变换系数,(C)为保留系数,文中设( C=1-T)。上一层的信息有一定的比例,不需要矩阵乘法和非线性变换就可以直接把信息送到下一层。

当神经网络的深度不断加深时,会出现()问题,即准确率先上升到饱和,然后继续加深深度会导致准确率下降。这不是过拟合的问题,因为不仅测试集网络上的误差会增加,训练集的误差也会增加。假设有一个浅层网络已经达到了饱和精度,那么后面加几个(y=x)全等映射层,至少误差不会增加,也就是说更深的网络应该不会带来增加在训练集上的错误。

如果某个神经网络的输入为(x),则期望输出为(H(x)),如果直接将输入(x)作为初始结果传给输出,那么此时你需要学习的目标是(F(x)=H(x)-x)。学习只是输出和输入的区别(H(x)-x),即,残差。

残差网络等价于:

[H(x)=F(x)+x\=本层残差拟合+的拟合值]

上一层相当于学习了某个结果,目标已经拟合到一定程度,后面的层只是想减少拟合误差,所以至少不会让拟合变差,至少和上一层一样。

普通卷积神经网络和直接连接的卷积神经网络最大的区别在于有很多旁路分支,将输入引导到后面的层,这样后面的层就可以直接学习残差了。这个结构也被称为或跳过

传统的卷积层或全连接层在传播信息时或多或少存在信息丢失、丢失等问题,在一定程度上解决了这个问题。输入信息绕过输入和输出以保护信息的完整性。整个网络只需要学习输入和输出之间的差异部分,简化了学习目标和难度。

论文中除了提出的二层学习单元外,还有三层学习单元。两层的残差学习单元包含两个相同的输出通道(因为残差等于目标输出减去输入,即(H(x)-x),所以输入和输出维度必须一致) . 3层残差网络在In和Net中使用了1×1的conv,中间是3×3的卷积。前后使用1×1 conv,先降维再升维。另外,如果有输入和输出不同维度的情况,可以做一个线性映射来变换(x)的维度,然后连接下面的层。

图片[3]-Tensorflow进阶-唐朝资源网

两层残差单元,输入输出维度相同。

前后1×1卷积,先降维再升维

第 4 章

语言中的单词被转换成计算机可以理解的密集向量(Dense)。向量空间模型(Space)可以将单词转换为连续值向量表示。并且具有相似含义的单词被映射到向量空间中的相似位置。

向量空间模型在自然语言中主要依赖的假设是:出现在同一上下文中的词在上下文中也是相似的。

向量空间模型大致可以分为两类:一类是计数模型,比如 ,一类是预测模型,比如 Model 。计数模型统计语料库中相邻单词的概率,然后将这些计数统计量转化为一个小而密集的矩阵;而预测模型根据单词周围的相邻单词推断单词及其空间向量。

词空间的预测模型可以从原始语料库中学习,主要分为两个模型:CBOW(Bag Of Words)和Skip-Gram。其中,CBOW是从原句中推断出目标词,而Skip-Gram则正好相反,从目标词中推断出原词和句子。 CBOW对小数据更有效,Skip-Gram对大数据更有效

预测模型( )通常使用最大似然法来最大化目标词汇(w_t)的概率。但它有一个严重的问题是计算量非常大,需要计算词汇表中所有单词出现的概率。在CBOW模型中,不需要计算完整的概率模型,只需要训练一个二元分类模型,只需要区分真实目标词和虚构词(噪声)两类。这种用少量噪声词进行估计的方法,类似于蒙特卡罗模拟,当模型以高概率预测真实目标词,同时以低概率预测其他噪声词时,优化训练的学习目标。用捏造的噪声词汇进行训练的方法称为(负采样)。这种方式计算loss的效率非常高。它只需要计算k个随机选择的单词而不是词汇表中的所有单词,因此训练速度非常快。在实践中,使用了噪声(NCE)损失。 tf.nn.() 直接实现了这个损失。

训练样本的构建:以quick brown fox over the lazy dog为例,构建上下文与目标词汇的映射关系。上下文包括单词左侧和右侧的单词。假设滑动窗口大小为1,可以创建映射关系包括[the,brown]->quick、[quick,fox]->brown、[brown,]->fox等,因为Skip-Gram模型从目标词汇中预测上下文,因此训练样本不再是 [the, brown]->quick,而是 quick->the, quick->brown。所以数据集就变成了(quick, the), (quick, brown), (brown, quick), (brown, fox)等。因此,在训练的时候,希望模型能够从目标词汇中预测上下文快的。同时,还需要创建随机词作为负样本(噪声)。希望预测的概率分布在正样本上尽可能大,在随机生成的负样本上尽可能小。方法是通过SGD等优化算法更新模型的词参数,使概率分布NCE loss尽可能小。这样每个词的值都会随着训练过程不断调整,直到处于最适合语料库的空间位置。

在开源库(如 )中,模型的常用参数:

图片[4]-Tensorflow进阶-唐朝资源网

虽然卷积神经网络可以对图像进行分类,但它们无法对视频的每一帧中发生的情况进行分类。执行关联分析。循环神经网络最大的特点是神经元的部分输出可以作为输入重传给神经元,因此可以利用之前的信息。

(x_t) 是 RNN 的输入,A 是 RNN 的一个节点,(b_t) 是输出。向RNN输入数据(x_t),然后通过网络计算得到输出结果(h_t),然后将一些信息(状态,状态)传递给网络的输入。将输出与标签进行比较会给出错误,之后可以使用梯度下降 ( ) 和回溯 (BPTT) 方法训练网络。 BPTT类似于训练前馈神经网络的传统BP方法,同样使用反向传播来求解梯度和更新网络参数。还有一种叫做Real-Time(RTRL)的方法,可以求解正向的梯度。

BPTT和RTRL之间还有一种混合方法,可以用来缓解时间序列间隔过长带来的梯度弥散问题。

RNN展开成系列后,每一层神经网络的参数都是一样的,不需要训练成百上千个神经网络参数,只需要训练一层RNN的参数。这里共享参数的思想类似于卷积网络中共享权重的方式。

对于一些复杂的问题,需要更早的信息,甚至是时间序列开头的信息。但是对于相距太远的输入信息,RNN很难记忆,因此长程依赖是传统RNN的致命伤。

LSTM的状态会依次流过所有的LSTM单元,从第一个LSTM单元一直到最后一个LSTM单元,只有少量的线性干预和变化。当状态通过此隧道时,LSTM 单元可以从中添加或删除信息。这些对信息流的修改操作由 LSTM 中的门控制,每个 LSTM 单元包括 3 个门(输入、输出和遗忘门)。

GRU的结构比LSTM简单,比LSTM少一个门,只有更新门和重置门,但精度相同,收敛速度更快。

tf.nn..():

RNN 层:tf.nn..()

RNN 堆叠函数:tf.nn..()

© 版权声明
THE END
喜欢就支持一下吧
点赞12赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容