一般情况下 一张分辨率高点的图片就是1000*1000*3维的放在矩阵里3百万啊一列
假设第一层隐藏单元是1000个 那么就是1000*3百万的矩阵 太大了
w1就是3百万 (1000隐藏层,1000*1000*3 输入层)=30亿个参数
所以就要用到卷积了 w*x
1边缘检测:别忘了一般都是低层次到高层次检测的 边缘到整体的 比如下图照片 先检测竖线 再水平线
垂直边缘检测:
比如现在给一个灰度图像 一层的6*6现在利用一个过滤器或者叫kernel检测竖线进行卷积运算
*就是卷积元素符号 对应相乘即可 然后蓝色块右移依次计算 然后还是从左边下移一格
可视化一下:灰白之间就是垂直边缘 加个绝对值也可以
可以可视理解一下 第一个例子 过滤器是个垂直检测边缘的 他和第一个3*3 的相乘 出来是0
移动一列 再乘是30 也就说明了 第一个里面没边缘 第二个里有边缘
很多种过滤器:这里过滤器怎样设置也有争论
甚至直接把过滤器当作要求的参数 反向传播学习出来
变一变可能识别出70度的直线 倾斜的直线
上面卷积的缺点
1会导致图像越来越小
2中间的点会重复多次采集 而旁边的点比如四个角的点 只被采集了一次
利用Padding:在处理之前在图像外围再加一层或者几层填充 有点像前端里的padding
用f*f大小过滤器进行卷积 得到就是n-f+1 * n-f+1的阵 是越来越小了
现在价格padding就得到n+2p-f+1了
valid卷积 就是不填充 Same卷积:让卷积完和之前一样
过滤器f通常奇数3*3 5*5 7*7 因为你想让卷积完和之前一样 这样好算吧 这样会有个中心像素
stride步长:之前一格一格移动的 步长就是1 若整除不是整数 就向下取整
实际在数学书或者信号处理中的卷积操作会对过滤器先进行翻转
深度学习中我们的卷积 应该成为交叉相关 但是在深度学习里 就称为卷积了
先关于行对称13行互换 然后列互换 在逆时针转180读
对于彩色图片:高 宽 通道6*6*3 就要用三维的过滤器了3*3*3
输出的是二维的啊 4*4 相当于这里3*3*3的数字求和了
这里每层的过滤器里面数字可以不一样
比如想检测红边就可以后面俩都设为0
也可以同时用几个过滤器 可能一个同时检测垂直 一个检测水平
几组过滤器就是几个面了
卷积神经网络: 图像直接当x算 过滤器就是w(3*3*3+1) 卷积完然后激活函数处理
有个好处就是不管输入图像像素多大 参数都是根据过滤器而固定的
这样也不太容易过拟合
用10个过滤器(3*3*3+1b)*10 也就280个参数 避免过拟合 想想开头以前的方法.
CNN:
最后把7*7*40的展开 然后再做个逻辑回归或者softmax就行了
重要的就是这些参数怎么确定 padding 过滤器 步长等等
一个典型的CNN一般三层 卷积层 池化层 全连接层
池化层:缩减模型大小 提高计算速度 同时提高鲁棒性 不用学习参数 手动设置
提取到每一小块最大特征值 平均的不常用
全连接层 相当于整合一下所有信息用来把前边提取到的特征综合起来
有时把池化层和卷积层看做一层 因为池化层没参数计算 只算有权重的层
一般一个或者几个卷积层后再跟个池化层
这一系列卷积池化做完后展开比如现在是400维的,全连接就是再来个以前的单层神经网络
最后的400维的一列 再做个WX+B吧 W120*400 * 400*1 变成120*1 可能连好几个
最后再softmax或者逻辑回归什么的
参数还是主要集中在全连接层 因为前面都是固定的 取决于那个过滤器
激活的数量也是逐渐下降的
机智的one-hot,这里Y是个 (1080,1)的 直接给reshape-1展开城一行,
np.eye就是生成一个C行的对角矩阵 ,他这里一展开相当于下标了 直接去选取对角阵对应的哪一行
反向传播:卷积操作中的反向传播
这里面最外面的dZ已经给了
池化层的反向传播 其实是没有参数的
上一层的导数 直接乘上 要他们那一块中 只保留最大的 或者平均
为什么CNN有用
1参数少,传统的参数太多了 比如图像是32*32*3的
传统的 32*32*3输入吧 隐藏层4704个单元 这样子就有 3072*4704=1400W个参数了
假设是1000*1000*3图像就更可怕了
而CNN你用6个过滤器5*5的 参数很少 6*(5*5+1b)=156
2参数共享:比如检测竖线的参数 可能运用到图片各个位置对于高阶也一样 比如检测眼睛的等
3 稀疏连接:比如输出层左上角的值 之和原本输入的矩阵前9个数(方块有关)
来源:https://www.cnblogs.com/hellodantong/p/9965243.html