阅读《深度学习入门:基于Python的理论与实现》的一些问题

一些问题

是 2019-04-03 看书时写下的

关于展开为二维数组后转置规律的探究(p208-p221)

  • 对输入数据展开后,其维度情况是 ( 行 数 = 数 据 个 数 × 单 个 数 据 卷 积 次 数 , 列 数 = 输 入 通 道 数 × 卷 积 核 的 宽 × 卷 积 核 的 高 ) (行数=数据个数\times 单个数据卷积次数, 列数=输入通道数\times 卷积核的宽\times 卷积核的高) (=×,=××)

    若把输入数据维度情况记为 ( N , C , H , W ) (N, C, H, W) (N,C,H,W),卷积核维度情况记为 ( F N , C , F H , F W ) (FN, C, FH, FW) (FN,C,FH,FW),输出数据维度情况记为 ( O N , O C , O H , O W ) (ON, OC, OH, OW) (ON,OC,OH,OW),则有以下关系:
    O N = N ON=N ON=N
    O C = F N OC=FN OC=FN
    O H = H + 2 P − F H S + 1 OH=\frac{H+2P-FH}{S}+1 OH=SH+2PFH+1
    O W = W + 2 P − F W S + 1 OW=\frac{W+2P-FW}{S}+1 OW=SW+2PFW+1

    N N N个输入数据展开的二维数组形状为 ( N × O H × O W , C × F H × F W ) (N\times OH\times OW, C\times FH\times FW) (N×OH×OW,C×FH×FW)

    其中,行数中 ( O W × O H ) (OW\times OH) (OW×OH)为单个输出数据的维度情况,亦即对单个输入数据需要卷积的次数;而 N N N则是输入数据的个数,也是输出数据的个数。完整的行数表示只有一个卷积核时, N N N个输入数据对应的输出元素个数。
    列数中, C C C为输入数据的通道数;而 ( F H × F W ) (FH\times FW) (FH×FW)则代表卷积核的维度情况,其值是卷积核的元素个数。完整的列数表示对具有 C C C个输入通道的输入图像,一次卷积运算需要运算的区域对应的输入元素个数。

    F N FN FN个卷积核展开的二维数组形状为 ( C × F H × F W , F N ) (C\times FH\times FW, FN) (C×FH×FW,FN)

    其中,行数 ( C × F H × F W ) (C\times FH\times FW) (C×FH×FW)的解释如上的列数。
    列数 F N FN FN则为卷积核的个数,也就是输出数据的通道数。

    按照数组的排列规则,其排列顺序是优先排最低维度。比如对二维数组(5, 3),其排完一行的元素个数为 3 ,排完一行再排第二行,也就是说,离首元素最近的元素首先是第一行的其他元素,而不是下一行的首元素。在reshape的时候必须要考虑到元素的顺序问题。
    数组维度规律是越靠前维度越高,新增的更高维因此也必须加在数组维度的最左边。比如从 W i d t h Width Width维度开始,增加了一个 H e i g h t Height Height维度,则数组变为 ( H e i g h t , W i d t h ) (Height, Width) (Height,Width),再增加一个通道维度 C h a n n e l Channel Channel,则数组维度变为 ( C h a n n e l , H e i g h t , W i d t h ) (Channel, Height, Width) (Channel,Height,Width),以此类推。

  • 输出数据在进行reshape操作前,维度情况是 ( 行 数 = 数 据 个 数 × 单 个 数 据 卷 积 次 数 , 列 数 = 卷 积 核 个 数 = 输 出 通 道 数 ) (行数=数据个数\times 单个数据卷积次数, 列数=卷积核个数=输出通道数) (=×,==)

    输出数据的维度情况用字母表达则为 ( N × O H × O W , F N ) (N\times OH\times OW, FN) (N×OH×OW,FN)
    对应为最终需要的输出,可以表示为 ( O N × O H × O W , O C ) (ON\times OH\times OW, OC) (ON×OH×OW,OC),经过reshape调整之后维度情况为 ( O N , O H , O W , O C ) (ON, OH, OW, OC) (ON,OH,OW,OC)而需要的输出是 ( O N , O C , O H , O W ) (ON, OC, OH, OW) (ON,OC,OH,OW),以便作为下一次的输入。
    所以对reshape的结果,还需要通过transpose更改轴的顺序,把原先的(0,1,2,3)转换为(0,3,1,2)

突然想到一个类比:数组的高维、低维就像数制中的高位、低位一样,数先在低位排,排满一个低位之后,则向高位进1,然后继续排列下一个高位的一系列低位。并且数制的进位也是让高位在左,低位在右。十分有趣。数制也可以理解为维度的一种特殊形式,其各维具有相同的元素个数。数组的高维和低维之间也存在一种类似的“进位”关系。

关于“为什么二维数组的第0轴是列方向”

从上面的分析可以看出来,多维数组对轴的编号是从左往右的,也就是说,对二维数组(y, x)来说,x方向是第0轴,y方向是第1轴;对三维数组(z, y, x)来说,第0轴则是z轴,第1轴是y轴,第2轴是x轴。

图书链接

深度学习入门:基于Python的理论与实现》(图灵社区)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值