
参考:
举例:图片猫?识别,目标检测(无人驾驶),图像风格转换(比如转成素描)等等
面临的挑战:
你希望模型也能处理大图。为此,你需要进行卷积计算,下节将用边缘检测的例子来说明卷积的含义

例如 6x6 的单通道灰度图像,检测垂直边缘,构造一个矩阵 ⎣⎡111000−1−1−1⎦⎤ (过滤器 / 核),进行卷积运算*(convolve)

import numpy as np
image = np.array([[3,0,1,2,7,4],[1,5,8,9,3,1],[2,7,2,5,1,3],[0,1,3,1,7,8],[4,2,1,6,2,8],[2,4,5,2,3,9]])
print(image)
print('-------')
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(filter_)
print('-------')
from scipy import signal
convolution = -signal.convolve2d(image, filter_, boundary='fill',mode='valid')
print(convolution)[[3 0 1 2 7 4]
[1 5 8 9 3 1]
[2 7 2 5 1 3]
[0 1 3 1 7 8]
[4 2 1 6 2 8]
[2 4 5 2 3 9]]
-------
[[ 1 0 -1]
[ 1 0 -1]
[ 1 0 -1]]
-------
[[ -5 -4 0 8]
[-10 -2 2 3]
[ 0 -2 -4 -7]
[ -3 -2 -3 -16]]为什么可以检测边缘?

image = np.array([[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0],[10,10,10,0,0,0]])
filter_ = np.array([[1,0,-1],[1,0,-1],[1,0,-1]])
print(-signal.convolve2d(image, filter_, boundary='fill',mode='valid'))[[ 0 30 30 0]
[ 0 30 30 0]
[ 0 30 30 0]
[ 0 30 30 0]]可以检测明暗变化方向

竖直,水平的过滤器


把这9个数字当成参数,通过反向传播学习,边缘捕捉能力会大大增强(可以检查任意角度)


输出是一个二维的,每个格子里是对应着 27个元素求和
如果希望对不同的通道进行检测边缘,对 filter 的相应层设置不同的参数就可以了
想要多个过滤器怎么办?(竖直的、水平的,各种角度的)



参数的个数跟图片大小无关,跟过滤器相关,假如有10个过滤器,上面每个过滤器有 27 个参数,加上 偏置 b,28个再乘以10,共计280个参数
即使图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“避免过拟合”。


除了 卷积层(convolution),还有 池化层(pooling),全连接层(fully connected)
除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性

Max 运算的实际作用:
池化,它有一组超参数 f , s f, s f,s,但没有参数需要学习,不需要梯度下降更新

最大池化比平均池化更常用
常用的参数值为 f=2 or 3,s=2
最大池化时,很少用到 padding( p=0)
输入输出通道数一样
最大池化只是计算神经网络某一层的静态属性,没有需要学习的参数

尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,它也有可能适用于你的应用程序

和只用全连接层相比,卷积层 的两个主要优势在于参数共享和稀疏连接
原因:

神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合