00:13
我简单给大家把这个代码过一下行吗?这个代码非常简单,大家看这个代码的时候是不是能看到,好像代码上下长的都差不多是吧。这就是刚才我们经常说的这个这个卷积神经网络主要来做的是事情是什么呢?就是先做卷积,再说实话清算积,这说实话是吧,卷积实化,最后再乘一个全连接,把它变成十个数字分类的一个一个分数,对吧,就这么一个工作,非常简单,我们从上面开始说啊,嗯,这个地方呢,因为那个M这个数据集啊,它是有自己的格式的,所以呢,我们要导入一个它的包。你看的包去读,就我们自己手写这个读还是不行的啊,把Miss读进来,问号是什么意思,大家能记得住吗?
01:05
昨天给大家讲过啊。一个标签现在是有什么0123456789取值对吧,但这个你不能把这个值送去让他学对吧,对吧,你要你要怎么着,要把它变成什么问号的编码。零就是全零是吧,如呃,也可以也可以是全零,最后是一是吧?如果是一的话,那就可能是某一位是一呗,对吧,就看你总共几种取值,如果是两种取值的话,那就零一就就很简单了,对吧?如果是三种取值的话呢,那你可能就要变成什么0001和一零对吧。类似于这种自己小分号的编码,当然有很多人就可能图简单啊,可能就直接是001010和100,这更简单了,就没有全程那一说了,对吧。这是问号的编码。接下来XY是两个place holder,一个用于接收图像,一个用于接收标签。标签是十个是官号的编码嘛,对吧,所以是十个十十个维度长了对不对,这很好理解,那为什么图像是784呢。
02:09
因为这个图像都是手写数字识别,都非常小,这个图像原始的尺寸是什么?28乘28的。28乘28的,其实最好呢,是用28乘28放进来做这个训练,但是呢,28把它打成一条直线也没问题,对吧,打一条直线也没问题,第一个shift,第一个维度都是难。Ten词里的难是啥意思呢?就是现在这个维度,我不知道。比如说你你一次可能扔进来100个样本,也可能扔来十个样本,对吧?所以我不知道,但是我知道第二回肯定是724,就你扔进来十个样本,或者是20个样本,每一个样本呢,这个长度肯定是784,对不对?所以第一维你可以填氮,这个氮呢,就是说你可以填,你甚至可以两个都填蛋,扔进来的时候现就现场决定都OK的,对吧。
03:02
就是这个这个,所以呢,我们一般有一个参数叫什么size。是吧,但现在是十,后面我发现训练的可能不够好,改成100,因为这个地方写的是难,所以这个网络都可以正常训练,对吧?如果你这个地方写的是十的话,100的时候就训练不了了,就就提示这个参数对不上了,对吧。接下来呢,叉image image等于TF点。为什么要做这样一个,大家可以看到啊,本身就是一个28乘28的,为什么要做呢?那能想到吗?因为刚才啊,因为一般的图像啊,图像某一位上面是不是都有值对不对。我一位上都有值,比如说你八位图像,24位图像,256,它的另一位上都是256或者八位,对吧,现在你就扔进了一个零一的一个图像,就这个图像就二值化,就是零和一,你你如果想做卷积的话,人家卷积核是给所有图像设计的,而不是给你这个二值化图像设计的,对吧?所以你第三维要弄出来一个一对不对。
04:07
对吧,然后呢,为什么第一位是负一呢,第二位写负一行不行呢。不行的啊,为什么呢?负一和难不一样,那是你扔进来多少,我就匹配你这个数。负一的意思是根据其他的维度推测第一个维度。可想而知,能推测的只有一个维度对吧,两个维度也推测不了了,对吧。比如说现在我扔进来了十个784的数数据啊。其实就十个图像嘛,对吧,我只能推断,我只能利用,比如说的话,28 28第三位是一,第一维肯定得什么,肯定得是十,对不对,就是能推测出来的,所以这维你可以填成负一,但是如果你你第一维和第二维都填成负一的话,那就可以有很多种复合了。对吧,它的目的呢,是让每一张图像都变成一张图像,而不是变成一个就是混在一块的一个长的向量,或者一个二维向量,是变成一个四维的这样一个第一维是图像,第二维是长宽啊,第三维是宽,然后第四维是它那个像素那个数量,对吧,做这样一个工作。
05:18
接下来就开始做这个卷积了,第一个卷积用的是什么呢?五乘五的卷积盒,这个乘数只有一,然后呢,出口就是说卷积盒的数量有32个,为什么用五乘五卷积盒呢?刚才我们说过啊,用33比较好,但是它这用五乘五也没有什么问题啊,然后呢,现在我们扔下来的图像,扔下来图像我们不说了嘛,第三维它就是零或者是一,对不对,所以它是没有RVB这个概念的,对吧?如果你说如果你是有RPB的概念,你第三维肯定就不是一了,就肯定是三了,对吧?现在它第三维是一,所以你这个地方就一定要写一去跟他匹配,这个地方代表着它的层数,我们刚才说了,它是这个汉堡,这个卷积盒像一个汉堡一样,但是现在汉堡只有一层对吧,你这个匹配的时候也得只有一层,但是你可以决定我有32汉堡对不对,所以它后边是32。
06:15
为什么决定有32个呢?还是刚才说那句话,这32个里边各司,其实每一个卷积盒检测不同的特征。有的专门检测九的那个钩,有的专门检测七的那个尖啊,有的专门检测一的那个斜,斜的那个斜杠。是吧,有的专门检测六的这个连接处。这就是我们给他定义这么多卷积盒的一个好处,这个数字可以通过调三得出来,你写128 256都可以啊,但是写32如果就够用了的话,你有要求写更多了。做完卷,做完这个卷积之后呢,又加了一个B,这就是最经典的一个线性的一个模型,Wi加B对吧,然后呢,做卷积这个地方呢,大家能看到啊,我们用了一个叫路的东西。
07:04
我之前今天早上刚给大家讲过,如果我做了一道这个卷积,大家能看到卷积是线性运算,对不对,就是乘法对吧,就是对应的乘法,绝对就是线性运算,我做了五层和我做一层是没区别的,我是学不到任何非线性的东西的,非线性怎么办呢?靠着这样一个函数叫激活函数引进来,我们今天早上说过啊,我得到了0.5,负0.5啊,负0.5和0.5,怎么把它画到这两个数画到一个空间里去,都和零零分开呢?给它加一个激活函数,加激活函数把它砍掉,把它砍掉对不对,对吧,这就是在这个路的意思,先做了一个线性变换之后呢,把那些负值改掉,Re的函数呢,它的函数非常简单,就是这个。就是这个,呃,写起来就是Y等于XX大于零。
08:02
Y等于0X小于零的地方呢,Y等于零。它就是这样一个函数,这就是圆周。看起来非常非常简单,对吧?好像都并没有什么好想的,但是即使它再简单,它也是一个非线性函数。只要它是非行星,它就引入了非天性。在这个模型里明白吧。最开始有人会问,这么简单的一个函数,有什么非线性的帮助呢?大家可以想啊,很多人就就希望说用S的S摩的那个非线性好,对吧,那个非线性是这样,这这这个看起来平滑多了,对吧。为什么不用s Mo里呢?昨天给大家讲过S的函数的导数是什么?是SX乘上一减SX对吧。大家不要忘了,后面这个是有极值的。
09:01
不管X怎么取值,后边这个这个这个是有极值的。明白。X乘一减X,它的极值是什么呢?是不是,是不是负X方加X,它的值对不对。他其实算一下就就知道了吧,是吧。导数对不对?负2X加一对不对?其实是什么0.5啊。所以这个其实嗯,没算错,是负零,这没算错没算错,这个它的导数呢,就这个就这个东西,它最大值就是1/2。是吧,最大值是1/2,什么时候取得最大值呢?X等于0.5的时候。啊X啊,说错了,X0.5的时候取得极大值,但值不是1/2值,值是1/4是吧。最大值就是1/4,那意味着你反向传导的时候啊,你你是反向求导对不对,每过一层它就至少得乘1/4,乘1/4还是比较好的,那可能1/16,所以用不了几成,这个导数就没了。
10:15
导数没了导致什么问题呢?最前面那些人就是最前面那些人是跟这个数据结合的非常紧密的一帮神经元,对吧?这帮神经元在等着后边传递给你信息呢,就等着你告诉我,我到底哪里错了,哪里哪里对了,我好去对数据进行重新的一个这个感觉和这个筛选,但是现在这个导数都传不过来,所以前面根本就没有办法训练,所以前面的神经元呢,就是盲人摸象,就瞎弄了。所以后边不管怎么训练,因为你这根都没做好,就后边肯定训练不好,明白吧。软著的好处呢,是什么呢?任何一层它的导数什么呀,它导数永远是什么。因为你导数是一嘛,对不对,假设你这个导数是现在的梯度是100,经过这个传导之后,它是没有损失的,下上一层还是100对吧,再上层还是100对吧。
11:06
明白吗?这是的好处。另外一个有有人质疑说re,太简单,然后不能做很好的,这个非线性,大家可以想一下折纸的一个过程。当你把纸对折1024长的时候,说是比宇宙的要长是吧?对吧?111张纸,假设它厚度是一毫米是吧?对折一次,再对折一次,再对折一次是吧?看起来很简单,但是你要对折1024的时候,对折024折的时候,虚数应该是比宇宙还要长。为什么呢?因为它是指数膨胀的,它指数的这个指数是了不得的啊,它不像是X方这种东西,这个X方其实不大的,但是二的X次幂是非常大的,二的1020次幂,这是不是一个天文数字对吧,非常非常巨大对吧,我们昨天说的三的381次幂嘛,还是380次次幂,361次幂是吧?他眼一看起来一看这么一看,好好像也不大样,其实它已经很大,这就是幂函数了。
12:10
它不是幂函数,这是指数函数啊,它是非常大的,所以你用一个简单的re,其实没有关系的,只要你这个层足够多,它能拟合,拟合那个函数的形状也非常多。然后呢,做两层那个卷积,然后和这个max呢,就是从比如说现在是四乘四。Max poing呢,就是从这四个元素里挑出一个最大的作为新的这个地方的元素,从这四个里面挑一个大来作一个新的元素,得出来一个二乘二嘛,对吧?为什么说ma克po是有用的呢?因为我们现在认为啊,这里边这个最大的元素代表了它像素,局部肯定是最明显的一个像素,代表了它那个,呃,信息嘛,对吧,这可以理解对吧。然后呢,再往下来。那最后呢,我们做了一个这个全连接,然后把这个,呃,这个值呢,最后变成了这个十个,应该是往后这又把中间又做了一个那个这个卷积啊,然后这里边有一个keep keep的意思就是我之前给大家讲过那个状况,明白吧,就随随机丢,对这个这个不是TF32嘛,你可以给他一个0.5,他就会在这里边随机丢弃神经元上的那个权重。
13:31
OK哈,然后。但大家注意啊,这个地方随机丢,绝对不是只丢一条群重,如果你把一个路前面的那个给丢了,那条路后边全更新不了了啊,明白吧,然后呢,接下来呢,就是说最后又做了一个卷积,这个地方是非这个地方是非常重要的,有一个cross entropy。什么叫这个东西?说起来非常简单啊。比如现在你的标签是假设咱们咱们不说有九个十个数字,就三个数字,你的标签是100,然后我现在算出来是010,它的损失值是多少呢?我认为是二,对不对。
14:11
对吧,因为你至少需要它变成零,它变成一嘛,对吧,那它变成零,它变成它变成零或者怎么样,反正就得变成一样的,至少得是二,对不对,但是呢,你这么去算呢,这个这个实在是没没有办法说,因为嗯,因为你你出来的值啊,那他不是010。我们的优化目标不是说一定要让他这个概率最大化,就就怎么样。明白吧,我们刚才跟大家说过,我们预测的是什么分数。明白吧,就我我预测的是分数,只要这个地方分最高就可以了。这这明白吧,是吧,我预测的是分数,所以呢,这个里边用的是一个昨天给大家讲过的一个信息论里边的一个,呃,优化的一个优化目标叫交叉商,交叉商的一个概念,大家可以回下来看一下啊,那所以我优化这个交叉商,呃就可以优化到最后的这一个最优化的一个结果,对吧,然后直接去这个minima,这里面用了一个AA用的非常频繁啊,它和那个刚才讲的那个GR boos那个优化器不太一样,是考虑的什么呢?就后面有很多这个优化方法,比如说打比方你先下山的时候,一次下一,一次下一。
15:28
毫无对之前的记忆。这种下下山的方法呢,就不好,对不对,因为我们知道山的大方向肯定是一个总的一个方向,对吧,我这一次突然间发现这个地方有一个石头,但是这不意味着我立马就要朝那个方向下,我跨过这个石头对吧。他们做的这个就基本上这个工作就是说什么,把以前的更新过的这个参数和这个值加过来,有一个大的方向,这样的话你优化会更快,就不会像那个随意性下降一样,左左更新一次,右更新一次了,那具体的细节也没有必要掌握那么透彻了,大家知道如果你一个不行的话,你可以换其他的优化器去试,因为我们也不知道哪一个优化器适合哪种数据。
16:14
都是试出来的啊。然后接下来呢,有一个这个预测的一个准确率,就是做一个,然后呢,准确率ccac。就这样之后呢,还是跟其他代码政代码是一样的,第一步启动一个session,就上面我们已经把gra建好了,接下来我们要启动一个session,然后开始跑这个gra对吧?第一步呢,还是把所有的变量都初始化一次,第二步呢,是对每设一个2万的一个BA是吧?每次呢,从这个M这个数据里取出来一个BA,然后去run这个set,这个呢跟刚才那个非常雷同,非常像啊,就是mini这个东西使用一个优化器。
17:01
把一个损失值变成最小,就是它的C,就是这个节点。去优化对吧,然后accuracy呢,是顺带着跑一下,有同学还会问,如果accuracy和这个train正好是有上下游关系。会不会跑两次?是不会的哈。就你run一个,比如说你你现在run ACC,然后呢,正好它依赖于train,并且你把train也填进这个列表里了,它是不会跑两次的,是一次把这个数据都跑出来,但只跑一次,明白哈。你明白是吧,因为有人会有这个疑问,就是说比如打个比方说,我们还说我们班是一个网络图,社交网络,然后呢,老师和那个宋老师过来了,说想从一个同学里探听一个消息,他同时又找到另外一个同学。我们这个班不会对这两个同学传递两次消息,明白吧,我们会传递到一个公共节点,然后把这个消息分发给他们俩,他们俩同时知道。
18:04
明白吧?因为这个这个事情是很重要的,如果是传递两次的话,你的参数就会变。因为因为你每次传递一次,你要求导嘛,参数就要变一次了,对吧,所以求两次是有问题的。然后之后呢,就是做这个预测,然后这里边有一个啊,这个大家可以再看一下,这个就是专门往place holder里边送数据的,这个数据格式啊,一定要跟你那个定义的数据格式是一样的。而且要以字典形式给他。然后嗯,12点了,然后咱们可以先休息了,大家中午可以跑一下,这里面有一个3.png,大家可以自己编辑一个PNG去跑。编辑要偏辑,然后他就会给你打印出来结果,如果想打印多次的话,你加一个while,然后你每次编辑完,然后你输入一个A,然后他跑一次。大家明白这个意思是吧?对就OK了。这个模型我们保存在了这个大家本地的这个m model的这个model.ckpt里边,第二次当你再去用的时候,故需重新训练,你只需要做一次save.restore就可以了。在这个参数,在这里边我们有一个参数叫process控制,如果你把它变成true的话,它就会去加载模型而不去训练,你就可以直接做预测。
我来说两句