胡乱写的!!!
目录
一、CNN架构
- 第一个,要生成一个pattern,不要看整张的image,你只需要看image的一小部分。
- 第二个,通用的pattern会出现在一张图片的不同的区域。
- 第三个,可以做subsampling
二、每层layer详解
1.Convolution
你有100个filter,你就得到100个4 * 4的image,组成feature map
3.Max pooling
3.Flatten
flatten就是feature map拉直,拉直之后就可以丢到fully connected feedforward netwwork,然后就结束了。
三、CNN in Keras
1.语句介绍
因为image的长宽高各是一维,若是彩色的话就是第三维。所以要给三维的tensor
model.add(Convolution2D(25, 3, 3))
25代表有25个filter,3 *3代表filter是一个3 *3的matrix(在二维卷积中,卷积核大小通常设置为 3×3)。
Input_shape=(28,28,1)
假设我要做手写数字辨识,input是28 *28的image,每个pixel都是单一颜色。所以input_shape
是(1,28,28)。
MaxPooling2D(( 2, 2 ))
2,2表示把2*2的feature map里面的pixel拿出来,选择max value
假设我们input一个1 *28 * 28的image,你就可以写
model.add(Convolution2D( 25, 3, 3, Input_shape=(28,28,1)))
通过convplution以后得到output是25 *26 26(25个filter,通过3 *3得到26 * 26)。
然后做max pooling,2 *2一组选择 max value得到 25 *13 * 13
然后在做一次convolution,假设我在这选50个filter,每一个filter是3 *3时,那么现在的channel就是50。
13 *13的image通过3 *3的filter,就成11 *11,然后通过2 *2的Max Pooling,变成了50 *5 *5
通过两次convolution,两次Max Pooling,原来是1 *28 *28变为50 *5 *5。flatten的目的就是把50 *5 *5拉直,拉直之后就成了1250维的vector,然后把1250维的vector丢到fully connected。
四、 复杂的Input时
到目前为止学的Network的输入都是一个向量(比如CV还是youtube视频等的输入都可以看做一个向量),而输出可能一个数值(如类别等)
五、What is the output?
输入是一堆向量,它可以是文字,可以是语音,可以是Graph,这样输出是有三种可能的
每一个向量都有一个对应的Label
这种情况是说输入和输出一样数量。
当你的模型,看到输入是四个向量的时候,它就要输出四个Label,而每一个Label,它可能是一个数值,那就是Regression的问题,如果每个Label是一个Class,那就是一个Classification的问题
六、Sequence Labeling
输入跟输出数目一样多,给Sequence裡面的每一个向量,都给它一个Label
把每一个向量,分别输入到Fully-Connected的Network裡面。然后Fully-Connected的Network就会给我们输出,那现在看看,你要做的是Regression还是Classification,產生正确的对应的输出,就结束了
缺陷:后面这一个saw跟前面这个saw完全一模一样。既然Fully-Connected的Network输入同一个词汇,它没有理由输出不同的东西。
所以我们可以给Fully-Connected的Network,一整个Window的资讯,让它可以考虑一些上下文的,跟我现在要考虑的这个向量,相邻的其他向量的资讯
那有人可能会想说这个很容易,我就把Window开大一点啊,大到可以把整个Sequence盖住就结束了。但是,今天Sequence的长度是有长有短的,我们刚才有说,我们输入给我们的Model的Sequence的长度,每次可能都不一样
开一个这麼大的Window,意味著你的Fully-Connected的Network,它需要非常多的参数,那可能不只运算量很大,可能还容易Overfitting
七、Self-Attention
Self-Attention不是只能用一次,你可以叠加很多次。所以可以把Fully-Connected的Network,跟 Self-Attention交替使用
- Self-Attention处理整个Sequence的资讯
- Fully-Connected的Network,专注於处理某一个位置的资讯
- 再用Self-Attention,再把整个Sequence资讯再处理一次
- 然后交替使用Self-Attention跟Fully-Connected
这每一个b都是考虑了所有的a以后才生成出来的
1.怎么产生b^1这个向量
每一个向量跟a 1 的关联的程度,用一个数值叫α来表示
这个计算attention的模组,就是拿两个向量作為输入,然后它就直接输出α那个数值,
2.计算α
一、矩阵的角度
二、Multi-head Self-attention