深度学习基础知识②

深度学习基础知识②,第1张

深度学习基础知识② np.random.rand()函数

语法:np.random.rand(d0,d1,d2……dn)
作用:通过本函数可以返回一个或一组服从“0~1”均匀分布的随机样本值。随机样本取值范围是[0,1),不包括1
举例:

im2col()函数

卷积运算需要好几层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* 。
**

基本概念拓展:CNN感受野

**
在卷积神经网络中,决定某一层输出结果中一个元素所对应的输入层的区域大小,被称作感受野(receptive field)。通俗来说输出feature map上的一个单元对应输入层上的区域大小

关于感受野大小的计算方式是采用从最后一层往下计算的方法,即先计算最深层在前一层上的感受野,然后逐层传递到第一层,使用的公式可以表示如下:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5671208.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存