00:00
呃,大家好,今天给大家讲一个test cn模型,以及它的拍拓实现。传统LP领域的话,大家用的比较多的一般都是RN。模型对吧?呃,但是R它会有个问题,就是它没有办法并行,因为呃你就你要计算当前时刻的输出,你一定要等到上一个时刻结束了才,呃,因为上一个时刻结束了,他才会把输出传入到当前时刻,然后再和当前时刻的输入一起去运算。所以他没有办法并行,但是CNN就没有这种时间上的限制,没有这种时间就是维度的限制,所以说它是可以去并行的。然后呃,就去看一下在CV领域用的比较多的CN是如何用在NLP领域的啊,这篇论文的话比较短,也其实也没什么难的,也比较好理解,就主要把这个图看懂了,就很很好理解了。它是怎么做的呢?首先有一句话,就是说wait for the video and don't it,就是说这句话,呃,这句话里面有123456789有九个词。
01:09
呃,所以说他这个非去卖。就是说呃,在在CV领域啊,那种图像的就叫map,就说这个feature map,它就有九九行,然后呢,有多少列呢,有六列,这个这个列。六列代表的就是说每个词用一个六,呃,六维的向量去编码,就是把这个词通过word in bedding,那么这个wordding的维度是设置为多少呢?设置为六,在这张图上是这样子。那么行列解释了以后就是,呃,就是接下来就是卷积核,呃,卷积核的大小在CV领域的话一般都是。长宽相等的,比方说三乘三,五乘五,但是我们可以很明显的看到,在这里面它一般是不相等的。首先这个红色的框,我们看作是第一个卷积盒的话,那么这个卷积和它的长就是六,它的宽是二,首先这个长呃,你也不一定设为六,你设为呃三其实也是可以的,你比方说你设为三乘二,那个就是这样子,然后下一个步骤就是这样子,然后就这样也是也是可以的,当然这样的话有什么,呃,像他这样做有什么好处呢?
02:21
我们看到比方说这个二,最主要是这个二,它就同时把wait和for这两个词的。向量全部都考虑到。就是就是说这这一个六。六列的这个卷积盒,他把每他把。对应的这个词它的向量都考虑到了,并且再给它两行,那么它就能够考虑到同时两个词它的向量。那那么在下一个时刻,如果就是说不长等于一的话,它就会去去框住for和这这两个词的向量。呃,我们可以这么理解,就是它就是一个。呃,类似于的一个模型,对吧,这就非常非常有意义,非常重要,因为我们知道。
03:07
同时考虑一个词的上下文,是啊是很重要的,对吧,所以说呃,他虽然能够做到这一点,其实就非常非常厉害了。呃,当然这里你也可以设置为三或者四之类的都都可以,这样的话就是啊,就是四或者是啊,它它当然它这里就是一个。啊,大概是这样子吧,然后呢,呃,做了一个卷积之后,得到一个相呃相乘,然后再相加,就是卷积嘛,然后就得到一个呃这么一个数,然后这个数,呃把所有的都做好之后呢,就得到这么样一个卷积以后的飞map。之后再通过一个软路激活,然后做一个max。呃,得到的feature map在Fla就打平,在打平这样子最后通过一个全链接神经网络。呃,最后得到两个输出,就是这么简单,就就就这么多。
04:02
呃,论文部分的话就是它整个结构也就非常简单啊,最主要的一点就是说,呃,你怎么把这个词编码,编码完了之后呢,怎么把这一句话里面的每个词都给它呃框在一起。就大概这样子,然后呢,还要去,然后后面就是做剪辑啊,然后做化之类的,就传统的CV的步骤就非常简单了,那我直接看一下代码吧,啊,这里代码我就不手写了,直接大家过一遍就可以了,因为比较简单。呃,首先是导入一些库,哦,对,他这个代码是这个人写的,然后是在一个get上面一个项目,但是他这个代码呃,有点问题。有一些问题,所以我改了之后,等会我会跟大家说有什么问题,嗯,首先看一下啊,导出一些库,然后定一些变量,然后这也是随便自己设置一个数据集就非常小,一二就这么几,也就这么几个句子,然后每句话里面都是有三个单词构成的,每句话都是三个单词。
05:04
每句都是三,每句话都是三个单词,呃,然后呢,下面有一个label就是它的标签。这是一个二分类问题,一表示的是。积极的情感的句子,零表示的是消极情感的句子,表示I loveyou就是一,然后I hate you就是零,然后下面是一些text cn参数,首先是你每一个单词要用多少维度的向量去编码,就是word embedding就是embedding science。因为我这里数据比较少,所以说我就用一个两维的向量就可以了,然后sequence就是说每一句话你到底是长度是多少,就是说你每一句话里面有多少个单词,这里其实就是三,那为什么我没有写三呢?因为后面如果大家想要去自己修改的话,比方说你改成了每句话有四个词构成的,那么就只用改这里就可以了,就不用改这里,你如果说这里写是三就不太好改,懂吗?就有很多地方要改,所以说我就改成这种动态的获取的方式就行,然后呢,这个classes就是说你有多少类别,这个其实就是二。
06:10
因为这是一个二分类问题嘛,所以就是二。但是我这么写的话,就是说把这个list放到sat里面去重,去重之后就只有零和一了,对吧,那么零和一,然后求它就是就是二了,其实就是二。呃,这也是为了避免到时候好大家好修改,然后这里是size,呃的话,因为我这个数据比较本来就比较少,所以我就设置了小1.3就可以了。呃,然后是这就是构建一个world list,呃,就是说把所有的词去重以后放到这里面,就是what,就是cabulary词词典,然后呢图DX就是构建一个引。就是表,呃,就是这里大家可以看到的this,它的索引是0HE,它它的索引是一,就是非常简单,然后vocabulary size就是整个词。
07:00
有多少个词?驱虫以后多少就是这个。呃,下面这个地方呢,就是。去构建data size,然后定义data load,这个在原来的就是它原本的,这这个是它原本的代码,它是没有这种方式的。而我是改成这样子了,因为我觉得大家如果后面要自己去运行的话,如果用的数据集比较大。就比较好修改,这样的话我也帮大家写好了这条load的这种数据的方式。啊,首先看input。就是呃,首先我对于一个句子来了之后,它是遍历每一个句子,首先我遍历第一个句子存在这个SE里面去,然后呢,第一个句子我用空格去进行分格,比方说第一个句子那么就分开了I love和you,然后去分别去循环一遍,那么第一次循环得到就是I,然后去查这个word,呃,查这个word to idx那个表,查到这个ii所所对应的它的索引是多少。然后再查到love,查到U,它对应的索引都是各是多少,然后给他存进去。
08:03
然后下面呢,就是非常简单,就是把。这个labels直接取出来,然后放进去就可以了。然后下面就是义以看一个什。啊,它就是这样子,因为我一共有123456,我一共就有六句话对吧,所以说就有六行,然后每一行里面呢,有三列,因为我每一句话有三个词的构成。比方说像第一个的话,I love you,那么它个对应的索引就是12,三和七,然后he loves me,它对应的索引就是一,八九,就就是这样子,非常简单。好,那么定义完数据,然后定义完各种参数之后,下面就是建立模型了,这个模型的构建也比较简单。
09:06
要给一个inbedding对吧,你要那么inbedding的参数呢,第一个参数就是说你这个词典到底有多少,就一共有多少个词,所以就是what cup这里。然后呢,第二个维,呃,参数就是说in是你要用多少维的向量去编码,一个词就是两维的。然后out of the channel是三啊,这个等会儿再说啊,我先看一下。我来看一下这个PPT是这样子的,就是说呃,比方说我现在有这么一个输入数据是样子十二三七,然后069,然后后面巴拉巴拉吧,一一对,那么这有多少行呢?有size这么多行,有多少列呢?就quence这么多列,那么我首先通过inding,这个是inding那个表首,通过inbding之后,那么会得到一个这个东西。呃,这个是什么意思呢?比方说呃,看下这个。
10:01
就是你12去查,比方说这有个in的表。它有它有多少行呢?比方说它有30行吧,那么你就去,然后他是从零开始的,然后你就查第12行,然后12行在这里,你查第12行这个向量是多少。然后就把这个向量替换掉12这个值。就可以了啊。比方说吧,比方说那么通过100点之后,那个12就会变成比方说0.30.4。然后三它就会变成0.5和0.2,然后七就会变成0.1。啊,七就会变成0.1 0.7就是一个数,它会被一个向量所替代,这样的话无形之中就会增加它的一个维度,原来是个两维的,因为有两个括号,对吧,现在变成三维的了。这里这个向量其实原本是12,好,这个向量原本是三,这个向量原本是七,它就是一个三,它现在已经变成三位的,因为全部用向量来替代了。
11:09
就是这样的一个过程,所以说它经过emding之后,那么它的呃,这个这个方向就是inbding size,然后这个方向是sequence,就是说你有多少。就是然后你一共有半size这么多,就变成一个立方体了,就变成一个三维的数据。呃,好,那么是这样子的,然后inding就是说通过这个东西就可以查,然后它就会原本是size,这样维度就会变成sizeence,然后emb size这样的一个维度变成这样的维度之后呢,我按ze一下。呃,这个是为什么呢?就是熟悉CV的同学大家应该都会知道,呃,就是说在CV领域啊,你去输入一个图片。都是这样子的,嗯,比方说我现在有个手写数据数字的数据集。
12:02
那么它它的通道是一一通道的,就是说它只有一个黑白图像,这里是一通道的,然后是一个呃高,然后这个宽。然后还呃一通道的,那么如果是一个彩色数据集呢,那么就是如果是个彩色数据集,那就是一个三通道的RGB是吧,然后这还是个高,这还是个宽。当然这是一张图片,如果是彩色的话,但如果是多张图片呢,就是有你设定了白棋size对吧,那么就有多张图片。所以说就是一个四维的啊。不知道这里大家能不能理解啊?嗯,不能理解的话,直接看这里吧,就是说IREZE1,就是在一这个位置上添加一个维度一,那么它就会变成black size,然后China通道一通道的。然后这个的话,大家就可以把它看成什么呢。这就是一个图片的一个维度,对吧,大家可以把它理解成一个图片的维度。
13:04
啊,变成这样的维度之后呢,就是再去做卷积,那么我卷积是在这里定义的。嗯,首先你的input channel是。是一对吧,然后output呢。我这里设定的是三啊,大家也可以设定更大一点都可以的,然后后面是呃,你的卷积盒的高和卷积的宽,那么这里卷积的。高和宽。啊,我是怎么定义的呢。这个高的话,首先啊看这里。这里,呃,这个比方说我这里定义的卷线和的高是二,宽是size,那么就对应的就是这个东西。并且它是个三通道的,对吧,所以说这个。其实就是我这里的这个卷积,卷积卷积和。那么他是怎么做,呃,卷积运算的呢?它会把这个,哎,他会首先把第一个卷积和这一共有三个卷积和嘛,他首先把第一个剪积和和这里进行一个对应,对应完了之后呢,乘相乘再相加得到一个数。
14:10
就会得到这里的一个数。就得到这个这个数对吧,然后呢,在。因为它的默认值是一,它就会向下滑动一格,再相乘的相加,再得这个数,得到的是这个,得到的是这个数,哎,错了错了,得到的是这个数。就这个数,然后这是第一个卷积完了之后呢,在第二个卷积再去一样的,然后就后面这两个,在第三个卷积,就是就是面这两个就可以了。啊。这里我画了一张图。就是比方说I loveyou这个词啊,这个句子,然后I它是这样的一个向量,然后love是这样的一个向量,又是这样的一个向量,那然后这是一个卷积盒,那么这个卷积合就会首先在I love上面去计算相乘,然后再相加得到一个个数。
15:05
它就会得到这么一个数,然后呢,它刚刚是在这运算的,现在string等于一,它就会向下滑,向下滑就会计算rough和U的一个值相乘的相加,然后又得到一个数。对吧,就是这样子。嗯,好,做完之后呢,呃,那么它的输出是大小是什么样的一个大小呢。这里它的输出大小其实是有一个公式可以计算的,嗯。这里有公式,当然这里我就不推这个公式了,大家记住,或者说怎么样都可以,就就大概这样子吧。啊,然后呃,反正大家只要知道,他最后就变成一个,嗯,三个通道的,然后。宽是一,长高是二这样的一个,然后呢,有这么多by size子这么多。呃,大概是这样子,然后经过一个它的呃尺寸是不变的,经过只是改变成数数值而已,然后再做一个maxing maxing的话,我这里面传入了一个top,就是一个呃top类型的一个数据,这里面的是一个首先是这个呃,Ma呃,Ing的它这个高和ing的宽。
16:20
上面是二一,那么就是说。其实就是在这两个,在这个第一个通道上,我去在这两个值当中找一个较大的取出来放这,然后在第二个通道上再找一个较大的放第二个通道,第三个通道再放第三个通道,那么这就会就是这样子,它就变成了这样。所以这是这是一个数据的维度的变化的一个图。大家如果能看懂的话就就可以了。OK,那么通过剪辑之后,它的维度是size,然后output channel,也就是我这里设定的三,然后是一和一,呃,哦,不对,应该是二和一。对二合一,然后呢,这里是嗯。
17:02
啊,通过卷积就是,哦,不对不对,是一合一通过卷,呃,通过卷积以后这里。By size。然后凹。二合一。通过这里的时候,它会变成这样子。但是完整的下来之后,它会变成一和一的,然后呢,我再去打平,打平的话就是一下就是size,然后负一它会变成size,然后后面是这样的一个维度,然后去最后做一个啊,通过一个全连接神经网络,它的输入的维度是。是呃,对吧,这里有了,然后那么它后面就是output乘以一乘以一,那么这里就是output,然后输出的话就是两个向量,所以我就因为它这是一个二分类问题,所以就只要设置这个就可以了。然后就输出就非常简单,大家应该没有什么不理解的吧,这是一个非常简单的一个,呃,只做了一次卷积的一个卷积神经网络,当然后面大家有什么呃,像那种呃呃,比方说最简最基本的还有之类的,都是非常深的一个神经,神经网络,这里我就没有做了,就用一个普通的。
18:23
异层卷积就够了。好,运行一下。呃,下面的话是训练训练也没什么好说的吧,就是这样子,因为它是个分类问题嘛,所以我用的crosss。嗯,大概也没什么。就是运行,呃,关于这个地方,这个地方by size,为什么我前面设置了by size。啊,这里等于三,而我这里还要获取一遍呢,是这样子的,因为我们在训练的过程当中确实是三维,呃,333句话一起输入。
19:03
但是当你测试的时候,我这只有一句话对吧,我这只有一句话,你如果不不去动态的获取。他就会,嗯,他就会还是以三。去进行运算,那就会报错,因为维度不匹配了,所以我就让他去自动的适应一下,如果是我测试的情况下,那我的呃,By size肯定是一,那么这里就会是一了,对吧。OK,训练完了,然后就测试一下啊,测试的时候我用的是I hate me这样一个呃句子,呃,为什么呢?因为。首先对于这句话来说,Me这个单词它在。它是在就是good,就是呃呃积极的情感里面出现过,而I这个词在积极和消极里面都出现过,并且各出现过一次。那么呃,他如果说单单只看到了I或者是me,他都会把它呃,基本上会认为是good。
20:04
而hate只在消极的里面出现过,所以说呃,我就用I hate me,看它是否能够真正的抓住这个hate这个词的,呃这样的一个意思吧,然后运行一遍。OK,他就会,呃,预测出来hit me是一个消极的情感。嗯。大概就是这么多吧,我看看还有什么没想到的。嗯。啊关,如果说我视频没有听懂的话,可以看一下我这篇博客。我这边博客也是详细介绍了一下,说的应该比较清楚,哦对了,关于这个,呃,就是说他这个原本写的这个代码其实有点问题了,他原本代码在这里。我就不运行了,虽然前面这这都没有用,然后这里是有用的,呃,它的代码可能版本比较老吧,还用到variable这个。
21:03
东西。然后他他这里有时候有个什么问题呢。损for循环。他做卷积的话,它用了for循环去做卷积。呃,你用复循环去做剪辑,无非就两个目的,我我就是猜的话,当然我明白他这个是到底是为了干什么,当然如果各位去猜的话,用复循环就做剪辑,无非就两个目的,第一加深卷积的层,呃层数,比方说像那样,呃18层啊,多少多少层那种的。倒入到层卷积对吧,或者是呢,你去获得更多的那个。你从输入数据当中获取更多的feature map去提取更多特征,但是我发现它这个两个都不对。都有点儿奇怪,因为你要用,呃,你要去,比方说第二种情况,你要获取更多特征,那你直接去在这里调整一下你的output channel,比方说我设置为32,那么你到时候输出。
22:02
你的输出这就不是一个三通道的,而是一个32通道的,那你获取的呃特征就会很多,你直接改这里就好了,为什么要用这种for循环的形式去写呢?这是第一点,这呃,那么还有一种情况就是说它想要加深这个整积的层数。加强卷积的层数的话,也不是这么写的,因为它你看我们加上卷积的层数是通过一层卷积以后,把这个输出的数据再通过下一层卷积是这样子的,但是他每一次卷积。都是对于。初始数据去做卷积,这我就不太理解了,你对初始数据去做卷积,你也不是那种加深卷积乘数的那种效果呀,而是那种获取更多输入特征的效果,但是如果这样子的话,你获取更多输入特征,你直接改。卷积的,呃,Output channel不就完了吗?所以说他这个代码写的有点问题啊,而且这个代码版本有点老,我用的是最新的一点,呃,一点多少1.2吧,好像是不太记得了,然后啊,而且我用的是呃,Data size,然后data load这种方式,他用的不是,它就是一个简单的非常简单的一个DEMO吧,就是。
23:17
所以我在他的代码上进行了大改。大概就这么多吧。啊,这个。项目是在在这里。呃,这里test cn它这个代码,然后里面也有也提了issue的是。对,就是关于这个test的扣有点问题太呃,别人也提了,就我很好奇这个。这个循环里面的是是。OK,所以我觉得我的代码应该写的是对的,大家就参考我的代码就可以了。好,那么呃,今天就讲这么多吧,谢谢大家。
我来说两句