1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
1.7 单层卷积网络 One layer of a convolutional network
本节课我们要讲的是如何构建CNN的卷积层,下面来看个例子。
上节课,我们已经讲了如何通过两个过滤器卷积处理一个三维图像,并输出两个不同的4×4矩阵。假设使用第一个过滤器进行卷积,得到第一个4×4矩阵。使用第二个过滤器进行卷积得到另外一个4×4矩阵。
最终各自形成一个卷积神经网络层。
如上图,然后增加偏差 b 1 b_1 b1,它是一个实数,通过Python的广播机制给这16个元素都加上同一偏差。
接着应用非线性函数,为了说明,它是一个非线性激活函数ReLU,输出结果是一个4×4矩阵。
对于第二个4×4矩阵,我们加上不同的偏差,它也是一个实数 b 2 b_2 b2,16个数字都加上同一个实数,接着应用非线性函数,也就是一个非线性激活函数ReLU,最终得到另一个4×4矩阵。
重复我们之前的步骤,把这两个矩阵堆叠起来,最终得到一个4×4×2的矩阵。我们通过计算,从6×6×3的输入推导出一个4×4×2矩阵,它是CNN的一层,把它映射到标准NN中四个卷积层中的某一层或者一个非CNN中。
注意,前向传播中一个操作就是 z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]}=W^{[1]}a^{[0]}+b^{[1]} z[1]=W[1]a[0]+b[1],其中 a [ 0 ] = x a^{[0]}=x a[0]=x。执行非线性函数得到 a [ 1 ] a^{[1]} a[1],即 a [ 1 ] = g ( z [ 1 ] ) a^{[1]}=g(z^{[1]}) a[1]=g(z[1])。
上图中6x6x3图像输入是 a [ 0 ] a^{[0]} a[0],也就是 x x x。中间这些过滤器用变量 W [ 1 ] W^{[1]} W[1]表示。在卷积过程中,我们对这27个数进行操作,其实是27×2,因为我们用了两个过滤器,我们取这些数做乘法。实际执行了一个线性函数,得到一个4×4的矩阵。卷积操作的输出结果是一个4×4的矩阵,它的作用类似于 W [ 1 ] a [ 0 ] W^{[1]}a^{[0]} W[1]a[0],也就是这两个4×4矩阵的输出结果,然后加上偏差。
上图中这一部分就是应用激活函数ReLU之前的值,它的作用类似于 z [ 1 ] z^{[1]} z[1],最后应用非线性函数Relu,得到的4×4×2矩阵,成为NN的下一层,也就是激活层。
以上就是 a [ 0 ] a^{[0]} a[0]到 a [ 1 ] a^{[1]} a[1]的演变过程。
- 首先执行线性函数
- 然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差
- 然后应用激活函数ReLU。
这样就通过NN的一层把一个6×6×3的维度 a [ 0 ] a^{[0]} a[0]演化为一个4×4×2维度的 a [ 1 ] a^{[1]} a[1],这就是CNN的一层。
本例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个4×4×2的输出。但如果我们用了10个过滤器,而不是2个,我们最后会得到一个4×4×10维度的输出图像,因为我们选取了其中10个特征映射,而不仅仅是2个,将它们堆叠在一起,形成一个4×4×10的输出图像,也就是 a [ 1 ] a^{[1]} a[1]。
一层中参数的数量
为了加深理解,我们来做一个练习。
假设你有10个过滤器,而不是2个,NN的一层是3×3×3,那么,这一层有多少个参数呢?
我们来计算一下&#