语法:np.random.rand(d0,d1,d2……dn)
作用:通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
举例:
卷积运算需要好几层for语句,这样实现麻烦,而且numpy中存在使用for语句变慢的缺点,所以不使用for语句,而用im2col函数代替。
im2col全称image to column(从图像到矩阵),作用为加速卷积运算。即把包含批数量的4维数据转换成2维数据。(也就是将输入数据降维,然后通过numpy的矩阵运算后得到结果,再将结果的形状还原,从而通过用矩阵运算来代替for循环语句)
im2col 是一个函数,将输入数据展开以适合滤波器(权重)。如下图 所示, 对 3 维的输入数据应用 im2col 后,数据转换为 2 维矩阵(正确地讲,是把包含 批数量的 4 维数据转换成了 2 维数据)
im2col 会把输入数据展开以适合滤波器(权重)。具体地说,如下图所示, 对于输入数据,将应用滤波器的区域(3维方块)横向展开为1列。im2col会 在所有应用滤波器的地方进行这个展开处理。
此处参考了https://blog.csdn.net/cz9797/article/details/104970190?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2aggregatepagefirst_rank_ecpm_v1~rank_v31_ecpm-1-104970190.pc_agg_new_rank&utm_term=im2col%E5%87%BD%E6%95%B0&spm=1000.2123.3001.4430的解释
代码实现:def im2col(input_data, filter_h, filter_w, stride=1, pad=0): """ Parameters ---------- input_data: 由(数据量, 通道, 高, 长)的4维数组构成的输入数据 filter_h : 滤波器的高 filter_w : 滤波器的长 stride : 步幅 pad : 填充 Returns ------- col : 2维数组 """ N, C, H, W = input_data.shape #数据量、 通道、 高、 宽 #输出数据高宽可由以下公式计算,不懂的同学可以去看卷积的相关知识(就是一个数学公式而已,记住就好) out_h = (H + 2*pad - filter_h)//stride + 1 #输出数据高 //表示向下取整除法 例:3//2=1 out_w = (W + 2*pad - filter_w)//stride + 1 #输出数据宽 #np.pad教程: https://blog.csdn.net/hustqb/article/details/77726660 img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant') #初始化一个六维数组 (数据个数, 通道数, 滤波器高, 滤波器宽, 输出高, 输出宽) col = np.zeros((N, C, filter_h, filter_w, out_h, out_w)) #六维 #循环产生col数组,具体解释见代码下面 for y in range(filter_h): y_max = y + stride*out_h for x in range(filter_w): x_max = x + stride*out_w col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride] #transpose详解 https://blog.csdn.net/u012762410/article/details/78912667 #就是0维的不动,第1维的换到第3维,第2维的换到第4维, 第3维的换到第5维,第4维的换到第1维,第5维的换到第2维 #我的理解是矩阵变成了(数据个数,输出高,输出宽,通道数,滤波器高,滤波器宽) col = col.transpose(0, 4, 5, 1, 2, 3) #reshape变为2维数据,这样就可以不用循环,直接进行矩阵运算了 #-1意思为固定第一维,第二维自动生成 例如:数据共20个,N*out_h*out_w是4,则第一维是4, 第二维是5 col = col.reshape(N*out_h*out_w, -1) return col
**
shape函数和reshape函数**
二者的功能都是对于数组的形状进行 *** 作。
shape函数可以了解数组的结构;
reshape()函数可以对数组的结构进行改变
计算公式:
参数量=(filter size * 前一层特征图的通道数 ) 当前层filter数量*
详细如下:
输入卷积:Win * Hin * Cin
卷积核:k * k
输出卷积:Wout * Hout * Cout
参数量:(即卷积核的参数)
k * k * Cin * Cout
【卷积层的参数量】
VGG-16为例,Conv1-1,输入224x224x3 ,64个 3x3 filter,输出feature map 224x224x64 。
则Conv1-1的参数量为: 3x3x3x64
【全连接层的参数量】
上面已经说过卷积层的参数量计算方法了,那如何计算全连接层的参数量?其实和卷积层参数量的计算方法是一样的。
VGG-16最后一次卷积得到的feature map为7x7x512 ,全连接层是将feature map展开成一维向量 1x4096。实际上,我们就是用4096个 的filter77去做卷积(可以理解为是一个卷积层)。
我们就可以计算第一个FC的参数量7x7x512x4096* 。
**
**
在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗来说输出feature map上的一个单元对应输入层上的区域大小
关于感受野大小的计算方式是采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)