深度学习入门-某些细节的理解2(im2col,transpose交换维度)

前置知识

 1,关于np.transpose 的用法

import numpy as np

a = np.arange(24)
a = a.reshape(2,3,4)
print(a)
print('\n\n\n\n')
a = a.transpose(1,0,2)
print(a)
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]





[[[ 0  1  2  3]
  [12 13 14 15]]

 [[ 4  5  6  7]
  [16 17 18 19]]

 [[ 8  9 10 11]
  [20 21 22 23]]]

Process finished with exit code 0

2,pad()

"""
pad()函数
方法参数:pad(array, pad_width, mode, **kwargs)
方法返回:填充后的数组
参数解释:
array:表示需要填充的数组;
pad_width:表示每个轴(axis)边缘需要填充的数值数目。
参数输入方式为:((before_1, after_1), … (before_N, after_N)),其中(before_1, after_1)表示第1轴两边缘分别填充before_1个和after_1个数值。
mode:表示填充的方式(取值:str字符串或用户提供的函数)

mode中的填充方式:
constant’——表示连续填充相同的值,每个轴可以分别指定填充值,constant_values=(x, y)时前面用x填充,后面用y填充,缺省值填充0
‘edge’——表示用边缘值填充
‘linear_ramp’——表示用边缘递减的方式填充
‘maximum’——表示最大值填充
‘mean’——表示均值填充
‘median’——表示中位数填
‘minimum’——表示最小值填充
‘reflect’——表示对称填充
‘symmetric’——表示对称填充
‘wrap’——表示用原数组后面的值填充前面,前面的值填充后面
用法

作者:青吟乐
链接:https://www.jianshu.com/p/426a1622dd9f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"""

 分析代码



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 #地板除,先做除法再向下取整 图像是7X7,卷积核是5X5  结果是3X3
    out_w = (W + 2*pad - filter_w)//stride + 1#算一下卷积之后的形状

    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))

    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] #从 y到 y_max 取数,步长是1
            """
             #transpose 操作很关键
    #原来shape是(N,C,filter_h,filter_w,out_h,out_w)
    #现在保持N,out_w,out_h不变,将C,filter_w,filter_h的值放都后面维度,相当于把卷积感受野部分全放后面维度
    #然后reshape 操作把channel,filter_h,filter_w(卷积感受野部分) 规整成一行,方便直接与卷积做矩阵乘法
    https://www.jianshu.com/p/93a1abcc4717
    
    transpose 怎么用在:https://blog.csdn.net/u012762410/article/details/78912667
            """

    col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)
    return col

 关于为什么引入 out_h和out_w  ,以及用这两个参数升维度。

参考
(19条消息) 卷积神经网络——im2col函数_anlian523的博客-CSDN博客_im2col函数https://blog.csdn.net/anlian523/article/details/81979496

 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] #从 y到 y_max 取数,步长是1

这里需要明确一点,卷积操作,由于卷积核的滑动,第一次卷积中的后面几列,又在下几次卷积中使用,所以原图像必须升维(或者说产生一部分冗余数据)。

原图7*7 卷积核5*5,卷积结果3*3

也就是说 5*5的卷积核在7*7的原图上滑动了3*3次。

col[:, :, y, x, :, :]

 的含义是:

N个数据,C个通道 ,y*x(5*5)的卷积核,滑动3*3次

col = col.transpose(0, 4, 5, 1, 2, 3).reshape(N*out_h*out_w, -1)

将4,5维提前就是将滑动次数提前,最后的维度是2,3  也就意味着,这是一次滑动中的数据。再去reshape。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值