【songbo】TF学习笔记总结记录之week2--努力补习中

深度学习
机器学习

#1

到18号的时候,要将上周遗留的和这周的学习任务处理完。


#2

加油,:joy:


#3

加油加油:wink:


#4

嗯嗯,继续努力!


#5

嗯嗯,一起进步!


#6

斯坦福cs231n课程->图像分类–数据驱动方法总结

开始切入算法,进行具体思路实现的分析。

图像分类-开始阶段

  • 刚开始的想法是输入一张图片,我们试图站在计算机的角度去分析这张图片的含义,然而仔细想想,我们给某种像素的组合命名为猫,火车,飞机等等。我们驶入从另外一种发现这种像素组合是非常困难的。这两者之间有着比较大的距离。由于图片很容易受到角度,光照等因素的影响。这又给这种识别方式造成了很大的困难。

图像分类-数据驱动方法

  • 由于直接识别的方法比较困难,我们开始从相关性入手,有一组训练数据。我们是知道哪个图片对应哪个分类的。而现在我们的思路是这样,假设我们要分类图片A,我们去训练集找和A最相似的图片B,因为我们是知道B的分类的,所以我们认为A 的分类也就是B的分类,这也就是近邻算法

  • 现在问题在于,确定相似度。我们现在是找最相思的,开始我们可以采用L1距离(曼哈顿距离),将两张图片每个像素点的值相减去绝对值,差值加起来作为相似度,越小则认为越相似。 $$d1(I_1,I_2)=\sum_p|I_1^p-I_2^p|$$ 具体代码如下:

import numpy as np

class NearestNeighbor:
    def _init_(self):
       pass

    def train(self,X,y):
        self.Xtr = X
        self.Ytr = y

    def predict(self,X):
        num_test = X.shape[0]
        Ypred = np.zeros(num_test,dtype=self.ytr,dtype)

        for i in xrange(num_test):
            distances = np.sum(np.abs(self.Xtr-X[i,:]),axis=1)
            min_index = np.argmin(distances)
            Ypred[i] = self.ytr[min_index]

        return Ypred

####K近邻算法 在上个近邻算法的基础上,我们不是每次寻找最近的那个店,而是寻找最近的K个点,然后由着K个点所代表的类别进投票,所属类别最多的那个类别就为预测的类别 举个例子 预测图片A,找到了可以相似的图片B,C,D,E,F,然后B,C,D代表类别m,E,F代表n. 那么很明显图片A应该属于m类别。


#7

斯坦福cs231n课程->图像分类–交叉验证总结

距离选择

在之前的选择中,我们是采用L1距离,对差值的绝对值进行求和,在这里我们考虑L2距离(欧氏距离). $$d_2(I_1,I_2)=\sqrt{\sum_p(I_1^p-I_2^p)^2}$$ 当某些特征为明确的重要性特征我们可以采用L1距离,当特征通用或者不明确的时候,我们可以采用L2距离进行计算。

现在我们的K的值可以调节,可以选择不同的距离,那么我们就需要调出比较好的参数去测试集验证。

交叉验证

最后验证时刻再去测试集验证,因为我们所追求的是模型的泛化能力,希望在没有看到过的数据上能跑的更好。 因此我们需要在自己的数据集上进行交叉验证,适用于数据量较少的情况。求出比较好的模型。 在深度学习中,训练本身会耗费大量的计算能力,因此分成多组的交叉验证不会很常用。

学生提问

  • 训练集和验证集的区别?

  • 将将验证集当成测试集去使用,然后采用验证集的Lable去计算准确率。

  • 测试集不能够代表真实世界的数据?

  • 根据统计学的假设,我们认为测试集和验证集服从同一分布,这样会保证我们的测试集在现实世界的表现是好的,需要数据集的创建者来保证测试集和现实世界的差距。

  • 为什么经过变换后的图片与原图片L2距离相同?

  • 在变换的时候就确保他们的L2距离相同,这样就可以证明,L2距离无法说明两张图是有差异的。

  • 经过变换后的图片与全图只是做微小调整,L2距离相同,不是更好说明,可以区分出来? +我们可以变化图片使其靠近另外一张而致使L2距离相同。因此不能作为衡量的标准。

  • 一旦找到最优的参数,然后重新训练整个训练集是否常见?

  • 并不总是这样,因人而异。

总结

  • 一定要按顺序去思考事情,多提问题可以让自己对所表述的事情更加理解,切记不能忽略,不能不懂装懂。遇到不理解的事情就应该提出来。看到自己不会的应该去进行思考。多问为什么。

#8

##斯坦福cs231n课程->图像分类–线性分类总结

####线性分类器 线性分类器的思路是找出一个模板,和要测试的图片进行匹配。然后加上一个偏移量进行个性化定制,最终得出分类的结果。 一般公式如下: $$f(w,X) = Wx+b$$

W为一个参数矩阵,表示学习的模型,x为要测试的图片像素,b为偏移量。

举个例子 有个图片像素为 $$\begin{bmatrix}3&5 \\ 1 &3\end{bmatrix}$$ 有四个像素点,我们类别有两类A和B。 假设W矩阵的第一行为类别A,第二行为类别B,我们的W矩阵为: $$\begin{bmatrix} 1&2&3&4 \\ 2&3&4&5\end{bmatrix}$$ 偏移量为: $$\begin{bmatrix} 2 \\ 3\end{bmatrix}$$ 首先我们把像素点拉长为41的矩阵 $$\begin{bmatrix} 3 \\ 5\\1 \\ 3 \end{bmatrix}$$ 然后: $$f(w,x)=\begin{bmatrix} 1&2&3&4 \\ 2&3&4&5\end{bmatrix}\begin{bmatrix} 3 \\ 5\\1 \\ 3 \end{bmatrix}+\begin{bmatrix} 2 \\ 3\end{bmatrix}=\begin{bmatrix} 30 \\ 43\end{bmatrix}$$ 在类别B上得分更高,因此分类的结果为类别B。

####缺陷

  • 不能解决非线性问题,因为它试图用直线区分出不同的元素,当分界线是圆的时候,它就无法正确的划分分界线。 ####学生提问

  • 三种颜色通道指的是什么?

  • 指红色,蓝色,和绿色。


#9

##李宏毅老师课程 Logistic Regression 逻辑回归课程总结。 承接上一节课的分类问题,上一节课最后将公式简化为一个线性模型 $$P_{w,b}(C_1|x)=\sigma(z),\sigma(z)=\frac{1}{1+\exp(-z)}$$ $$z=w*x+b=\sum_iw_ix_i+b$$ 公式变为: $$f_{w,b}(x) = P_{w,b}(C_1|x)$$

其中,z是一个线性模型,经过$\sigma$变换之后成为一个曲线。 现在也就是给了w,b,去求产生一个x的概率是多大,损失函数如下: $$L(w,b) = f_{w,b}(x^1)f_{w,b}(x^2)…$$ $$w^{\star},b^{\star}=\arg \max_{w,b}L(w,b) = w^{\star},b^{\star}=\arg \min - lnL(w,b)$$ $$-lnL(w,b) =-lnf_{w,b}(x^1)-lnf_{w,b}(x^2)+…$$ 假设$\hat{y}$表示结果当分类为A的时候,是1,为B的时候是0 公式可以写成 $$-lnf_{w,b}(x^1)=-[\hat{y}^1lnf(x^1)+(1-\hat{y}^1)ln(1-f(x^1))]$$ 其它也是一样。 那么公式就可以写和的形式。 $$-lnL(w,b)=\sum_n-[\hat{y}^nlnf_{w,b}(x^n)+(1-\hat{y}^n)ln(1-f_{w,b}(x^n))]$$ 实质为两个伯努利分布的交叉熵,表示两者的相近程度,如果一模一样,那么交叉熵结果为0 那么逻辑回归的损失函数就为 $$L(f) = \sum_nC(f(x^n),\hat{y^n})$$ 不用误差的平方和原因在于,微分后结果为0的地方并不就是距离目标点远 的地方。 其中 $$C(f(x^n),\hat{y}^n) = -[\hat{y}^1lnf(x^1)+(1-\hat{y}^1)ln(1-f(x^1))$$

同一个模型,一个采用概率进行计算,一个采用梯度下降的方法求出结果,通常情况下梯度下降的要好,原因在于采用概率计算的话,他会假设训练数据是服从某个分布的。而实际情况可能不是这样。但是采用概率也有优点如下:

  • 当训练数据较少的时候,可以得出较好的结果。
  • 噪声数据较多。
  • 从概率的计算公式可以看出,P(x|C1)和P(C1)的概率可以分开考虑,这样在实践起来,会比较方便。

####多分类问题

  • 求出w,b算出该x对应不同类别的值,然后经过softmax,得到一组分布,对应类别上大的结果就是属于该类别.。 softmax:假设取值为3,1,-3,那么以e为底,以算出来的结果为指数得到的值为20,2.7,0.05,然后加起来除每个以e为底得到的值。目的是强化其差距,大的越大,小的越小。
  • 那么在求w,b的时候,算出的结果也要进行softmax,然后与目标值做交叉熵,作为Loss函数的衡量标准。

逻辑回归的限制

  • 由于划分结果是一条直线,所以,线性解不掉的问题。逻辑回归也很难做到。

  • 如果还是要用逻辑回归的话,就要进行特征转换。但是并不总是能够找到一种转换方法,使得可以转换后的结果可以用直线分开。因此在加几个逻辑回归用作特征转换。


#10

##李宏毅老师课程 Deep Learning 深度学习总结

####深度学习发展史

  • 1958年,首先是感知机的提出,开始进行机器学习的时间。
  • 1969年,发现感知机有他的局限性,不能正确的进行学习。
  • 1980年,将感知机组合起来,和现在的多层神经网络没有较大差别。
  • 1986年,后传播算法的提出,超过3层就无法很好的学习了。
  • 1989年,提出,是否一层网络就可以了?
  • 2006年,RBM想法的提出,(重大突破),用于找出梯度下降的初始值。但是已经不怎么用了。
  • 2009年,GPU的提出,加速运算。
  • 2011年,在语音识别领域有了好的作用。
  • 2012年,在Imagnet比赛上一举将错误率降低了近10%,从此名声大噪。

####深度学习结构

深度学习就是多个层连接起来,有一个输入向量,然后通过一个神经网络之后,得到一组输出向量。 深度其实指的就是很多层。 在进行深度学习的时候,通常是用矩阵来进行数据操作的。这样矩阵运算可用GPU来进行加速。

神经网络和传统方法选择

  • 神经网络是有作用的,但是在一些方面,比如NLP方面表现的没有比传统方法好那么多的原因可能是,人在语言处理这方面有较大的优势,人为设计的特征比机器学习的特征要好。

神经网络的结构是可以自动生成的,但不是那么普及。

神经网络的结构是可以自行设计的,不一定非要采用全连接的方式,比如CNN。

在计算偏微分的时候,可以采用Backpropagation来计算,在多个参数的情况下进行加速。

####神经网路越深越好吗? 神经网路随着层数的加深,变量也会增多,参数越多,拟合结果是会更好,但是如果我们采用一层网络,多个神经元的话,是否就可以代表多层呢?我认为是不同的。多层给的话可以进行多方面的处理,而一层的话做不好这一点。

####参考资料 http://speech.ee.ntu.edu.tw/~tlkagk/courses_MLSD15_2.html https://www.slideshare.net/tw_dsconf/ss-62245351 http://neuralnetworksanddeeplearning.com/ http://www.deeplearningbook.org/


#11

##李宏毅老师课程总结 Backpropagation 反向传播算法总结

反向传播算法就相当于是在梯度下降的时候,帮助你更好的微分。

####Chain Rule 这里从两个方面来进行偏微分的计算。 第一个方面解决连续影响的问题。 $$y=g(x),z=h(y)$$ $$\Delta{x} \rightarrow \Delta{y} \rightarrow \Delta{z} \qquad \frac{dz}{dx}=\frac{dz}{dy}\frac{dy}{dx}$$ 第二个方面解决多个因素影响的问题。 $$x=g(s),y=h(s),z=k(x,y)$$ $$\frac{dz}{ds} = \frac{dz}{dx}\frac{dx}{ds}+\frac{dz}{dy}\frac{dy}{ds}$$

####神经网络 给一组特征, $$\begin{bmatrix} x^1 \\ x^2\end{bmatrix} \underrightarrow{\theta} \begin{bmatrix} y^1 \\ y^2\end{bmatrix} \underrightarrow{定义误差} \begin{bmatrix} \hat{y}^1 \\ \hat{y}^2\end{bmatrix} $$ 现在来看这张图

现在求最终结果C对某个参数w的偏微分 $$ \frac{\partial{C}}{\partial{w}} = \frac{\partial{C}}{\partial{Z}}\frac{\partial{Z}}{\partial{w}} $$ $$ \frac{\partial{C}}{\partial{Z}} = \frac{\partial{a}}{\partial{Z}}\frac{\partial{C}}{\partial{a}} $$ 我们在计算Loss函数对当前节点权重的微分值的时候,需要知道后面节点的微分值,因此再建立一个反向传播网络,从输出层来开始计算,类似于动态规划的思想,减少大量的重复计算。便于每次计算多个参数的微分值的时候比较方便。


#12

##思考问题


#13

##思考问题

back propagation算法原理

  • 首先,back prooagation算法是在进行梯度下降计算时候的一个手段,并不是一种新型的机器学习的方法。因为我们要改变每一个参数就需要求出损失函数对于每个参数的微分。在CNN网络中参数非常的多,就采用这种方法快速的进行微分计算。至于微积分的物理意义,确定已知曲线的曲线就是微分学的基本问题之一,确定已知曲线的面积就是积分学的基本问题之一。引自《什么是数学》。

  • 算法原理:我们要计算最后的损失函数对于神经网络中的每个参数的积分,越靠近输出层的积分越好计算,越靠近输入层计算起来越复杂,因此我们建立起另外一个反向神经网络,类似动态规划的思想,一次性计算出所有参数的微分,方便我们进行梯度下降。 ####sigmoid函数。tanh函数和ReLU函数的区别,以及各自优缺点,对应的tf函数

  • sigmoid函数 $\quad\sigma(z) = \frac{1}{1+e^{-z}}$

  • 图像

  • 优点

    • 从图像可以看出,可以将任意值变换为0到1之间的区间内的值。可以用做概率计算
    • 求导比较容易
  • 缺点

    • 如果输入值很大或者很小,那么求导后的切线趋近于0,这样会使得梯度下降非常的慢。
    • 不是零均值的。当$f(x) = w^Tx+b$时,在神经元中,对权重的求导值取决于输入值,当输入值是正的时候,那么求出的梯度恒为正。
  • tf函数tf.nn.relu(features, name=None)

  • tanh函数$\quad tanh(x)=\frac{sinh(x)}{cosh(x)=}=\frac{e^x-e^{-x}}{e^x+e^{-x}} =2sigmod(2x)-1$

  • 图像

  • 优点

    • 零均值的 实际应用效果好。
    • 比sigmod函数收敛更快。
  • 缺点

    • 仍然存在sigmod的饱和性问题。
  • tf函数 tf.sigmoid(x, name=None)

  • ReLU函数数学上,$发f(x)=max(0,x)$。在神经网络中$f(x) = max(0,w^Tx+b)$

  • 图像

  • 优点

    • 比前两者收敛速度跟快。
    • 有效缓解了饱和度的问题。
    • 再无监督学习中也有好的表现。
  • 缺点

    • 可能会出现神经元死亡的现象,比如输入值小于0,然后求导为0,导致参数不更新,相当于该神经元已经“死亡”。
  • tf函数 tf.tanh(x, name=None) ####softmax和cross_entropy原理解释

  • softmax

  • 用于多分类问题,将计算出的结果,经过底数为e的变化,然后进行标准化,达到的目的是使得某个参数都大于0小于1,它们之和为1。

  • cross_entropy

  • tf.placeholder() ,定义一个占位符,在运算要用到的时候,要给其确定的值,否则报错,用于某些值是运算过程中产生的。

  • tf.constant() 定义一个常量,可以复制给变量,保存在Graph中,不可变。

  • tf.Variable() 定义一个变量,用于保存会定时修改的数据,比如weight,bias等等。保存在Session中。要给一个初始值

####举例说明:tf.Graph()概念理解

  • tf.Graph()

    • 创建一个图,在图中定义节点进行计算,神经网络就可以看成一张图,数据经过各项参数加权变换后进行输出。 ####tf.name_scope()和tf.variable_scope()的理解
  • tf.name_scope()

    • 和variable作用相同,区别是这个不会给变量名加前缀,vartable_scope会加前缀。
  • tf.variable_scope()

    • 用于在变量名前加scope 添加上作用域,就可以使得同名变量进行共享。

####tf.variable_scope()和tf.get_variable()的理解

  • tf.variable_scope()

  • 用于在变量名前加scope 添加上作用域,就可以使得同名变量进行共享。

  • tf.get_variable()

  • 产生在共享变量的需求上,get_variable()用于寻找变量,如果找不到就新建变量。

####tf.global_variables_initializer()什么时候使用

  • 在定义了变量后,在执行计算图的时候,首先要调用该函数对所有的变量进行初始化。在初始化要做很多事情,比如讲变量加载到Graph中等等。 ####学习中的知识点收获记录
  • 通过查阅资料,了解了很多知识,发现知识很浩瀚,自己要不断的学习。

#14

学完,有了框架知识体系,以后再找资料就不乱了。整理笔记就是整理思路,加油💪


#15

嗯嗯,便于自己及时查询整理。谢谢前辈


#16

整理得挺详细的 向你学习!


#17

一起努力!,打磨技术