吴恩达卷积神经网络各个输入输出的shape详解
维度总结:
如果在Tensorflow中构建一个自己的神经网络,框架会自动进行后向传播,所以只需要搭建好前向传播的部分,这里面维度必须对应好,其他的调用函数就行,现在总结一下维度问题。
从最简单的说:如下图,X是一个全是像素值的列向量(将一幅图flatten得到),它的大小是(64*64*3,1),则W是(64*64*3,1),那么W的转置与X相乘得到的维度是(1,1),b是(1,1)。
下面举另一个例子:如下图,这是个含有一层隐藏层的网络。输入是坐标(x1,x2),所以维度是(2,1),如果隐藏层被设计为含有4个神经元,那么a就是(4,1),所以反推第一层权重W1为(4,2),b1为(4,1)。然后由于输出为(1,1),所以反推第二层权重W2为(1,4),b2为(1,1)。
下面讨论一下卷积神经网络的维度:
- 填充padding的函数维度:
def zero_pad(X, pad):
X_pad = np.pad(X, ((0,0), (pad, pad), (pad, pad),(0,0)), 'constant', constant_values = 0)
Return X_pad
X的维度是(m, n_H, n_W, n_C),代表有m张图片,图片大小是n_H*n_W,有n_C个通道。返回值X_pad的维度是(m, n_H + 2*pad, n_W + 2*pad, n_C),其中pad就是要填充的边缘圈数。
- 单步卷积:
def conv_single_step(a_slice_prev, W, b):
s = a_slice_prev * W + b
Z = np.sum(s)
return Z
单步卷积实现的就是最简单的卷积计算,a_slice_prev 大小和过滤器一样,它们的维度是 (f, f, n_C_prev),f*f是过滤器的尺寸,n_C_prev是颜色通道。(f, f, n_C_prev)和(f, f, n_C_prev)做卷积得到维度为(1,1,1)的结果,再给这个结果加上偏置b(1,1,1)。
- 卷积层:
def conv_forward(A_prev, W, b, hparameters):
……
return Z, cache
如下图,输入是A_prev,它的维度是(m, n_H_prev, n_W_prev, n_C_prev),针对输入中的一张图,维度为(n_H_prev, n_W_prev, n_C_prev),这是图片的大小和通道数,经过维度为(f, f, n_C_prev, n_C)的过滤器W,其中f*f是过滤器的平面大小,n_C_prev是通道数,n_C是过滤器的个数。单步卷积是只有一个过滤器,但是在CNN卷积层中过滤器会有多个。(多个过滤器的维度必须一样但是权重值可能不一样。过滤器的权重就像是全连接神经元里面的权重,需要先赋值,然后通过后向传播学习。)每一次卷积后的维度是(n_H,n_W),注意都变成了一个通道。输出时要把每个过滤器卷积后的图像叠加在一起。最后多张图片的输出为Z[i, h, w, c],它的值和i(第几张图片),h,w,c(过滤器在图片中的位置),它的维度是(m, n_H, n_W, n_C)。
其中n_H, n_W的计算公式如下:
当然,最后要把Z用**函数变成A:
A[i, h, w, c] = activation(Z[i, h, w, c])
- 池化层:
def pool_forward(A_prev, hparameters, mode = "max"):
……
return A, cache
输入A_prev维度为(m, n_H_prev, n_W_prev, n_C_prev),hparameters中存储的有f*f(池化过滤器的大小),stride(池化过滤器每次移动的步长),输出是A(m, n_H, n_W, n_C),其中n_H, n_W计算公式如下,n_C= n_C_prev。