不得不说,李老师的课质量真的很高,不光课程本身好,课后作业也布置的很棒,写代码苦手如我都能跟着一起学习baseline的code。如果想要提升的话,也可以自己补充To Do的部分,很nice。
我跟着学习的是2021 Spring这一届,b站和油管都能看。课程主页
台大李宏毅机器学习
今天的部分是从理论来理解CNN,实践部分,pytorch部分的库函数如何使用,我会在以后补充。
Image Classification
假设目前我们要做一个图像识别系统,给一张猫的图片确定这个猫确实是猫,而不会识别成dog。整个过程抽象出来如图。
Input
对于图像,一般会把图像按照RGB的形式组织成length × width × channel,channel就是图像的颜色数,或者我个人觉得可以叫图层。如果是一个灰度图片,那么channel =1
Output
对于分类问题,比如有两个类,cat和dog,可以采用独热码(one-hot)的形式。
model
如果只是简单的用全连接层做模型的话,那么它的参数会巨大
识别图片大小为100 ×100 的图片,1000个neuron,那么weight会算3×10^7之多
但实际上,做图像识别是不需要这么多参数的,所以从两个方面考虑简化:
Receptive field
如同人类识别鸟是通过鸟的特征,而不是整张图片一样,一个neuron也并不需要观察整个图片,而只用观察到鸟的pattern。patten在的地方,就是receptive filed。
Receptive field存在的意义是抓pattern,所以,对于不同的目标,可以自己设计receptive field 的size,3×3,5×5都可以。size的形状也可以自己设定。
虽然receptive field size可以设置的比较小,但是它能学习到比较大的pattern
Typical Setting
Weight Sharing
特征不会说固定出现在一个地方,比如鸟嘴不会总在左上方出现,而是有可能出现在图片的中央、右上方等,但位置的改变没有改变本质,鸟嘴还是鸟嘴。如何利用这个特性简化模型呢?
不同的neuron计算时共享相同的参数,但是由于input不同,所以output也会不同。负责同一个receptive field 的neuron不会共享参数。
Typical Setting
假设一共有64组不同的参数,(实际上,一个filter就是其中的一组参数),对于同一个 receptive field,64个filter都会参与计算。而到了下一个receptive field, 还是这64组参数作为w ,与作为x 的input计算产生output。
这时,一个CNN初步成型了。
CNN layer与全连接层的关系
Filter
另一种理解CNN的方式是直接从filter的角度看
每个filter都想抓住一个pattern
计算方式
feature map : filter 计算后的集合。
多层卷积后,filter是可以抓住大的pattern的。network越深,图像看到的pattern越大。
两种理解的对比
Max Pooling
max pooling 不会学习任何参数,只是减少计算量的手段
max _pooling 选了最大的那个值
CNN的整体架构
可以看出,convolution和pooling交替使用,最后用flatten拉平tensor,再过全连接网络,最后用softmax得到分类结果
事实上,CNN可以不经过Pooling,因为它只是减少计算量的手段,所以有些比较高精度的任务就不适合用它。比如Alpha Go用了CNN,但没有池化层。
CNN 用处
- 图像识别
- 语音辨识
- 自然语言处理
CNN的局限性
它不能识别放大、缩小和旋转的图片
有专门处理这种问题的网络,例如Spatial Transformer Layer