• 从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)


    1. python 中 axis 参数直觉解释

    网络上的解释很多,有的还带图带箭头.但在高维下是画不出什么箭头的.这里阐述了 axis 参数最简洁的解释.
    假设我们有矩阵a, 它的shape是(4, 3), 如下:

    import numpy as np
    
    a = np.array([[1, 2, 3],
                  [4, 5, 6],
                  [7, 8, 9],
                  [10, 11, 12]])
    # a.shape = (4, 3)
    

    要做如下不同维度求和操作:

    # keepdims=True 保持了结果维度
    s0 = np.sum(a, axis=0, keepdims=True)  # s0.shape = (1, 3)
    s1 = np.sum(a, axis=1, keepdims=True)  # s1.shape = (4, 1)
    

    观察上面代码,有:

    • a.shape = (4, 3), 这样的话 axis 只能等于 0 or 1;(若 x.shape = (4, 4, 3), x 上的 axis 可以为 0 or 1 or 2)
    • 观察 s0, 当 axis = 0 时, a.shape, (4, 3) 中的 4 将变成1, 其余维度不变化, 既 3 没变;
    • 同样观察 s1, 当 axis = 1 时, a.shape, (4, 3) 中的 3 将变成1, 其余维度不变化, 既 4 没变;

    2. CNN 中 BatchNorm 的工作方式(Keras代码示意)

    假设 X 的 shape 为 (m, n_H_prev, n_W_prev, n_C_prev), 其中 m 为图片样本个数, n_H_prev, n_W_prev, n_C_prev 分别为 高,宽,通道数.

    X = Conv2D(filters = 2, kernel_size = (3, 3), strides = (1,1), padding = 'valid', name = 'c1', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = 'bn1')(X)
    X = Activation('relu')(X)
    

    上面代码第一行:

    • 最右侧的(X)假如是原始图片集合,X.shape就是(m, n_H_prev, n_W_prev, n_C_prev);
    • 经过Conv2D处理后,既第一行最左边的 X, 它的shape应该是(m, H, W, c = 2), (注意: H, W是根据原图尺寸, kernel size 和 strides 算出来的, 具体值我们不写了);

    上面代码第二行:

    • 最右侧的(X)的shape是(m, H, W, c=2);
    • 要对最右侧的(X)进行BN运算, 参数 axis=3, 指的就是数值为2的那个维度, 咋算呢?
    • step 1: 把(m=1, H=1, W=1, c=1)的那个点的数值和(m=1, H=1, W=1, c=2)的那个点的数值结合起来算均值和方差,然后再用相应公式对这两个点做归一化, 然后呢?
    • step 2: 把(m=1, H=1, W=2, c=1)的那个点的数值和(m=1, H=1, W=2, c=2)的那个点的数值结合起来算均值和方差,然后再用相应公式对这两个点做归一化, 然后呢?
    • step 3: 直到把图片1处理完,既m=1处理完成. 然后呢?
    • 按照 step 1 to 3所述,把所有mini-batch图片都处理完成, 假设m=100, 一个mini-batch有100个图片.

    BatchNorm只是归一化特征图内的数字,它不会改变特征图的shape.

    观察我对第二行代码的理解,发现了个事情:

    • BatchNorm作用于CNN时,是针对一个图片,由不同的filter生成的特征图所对应的点的归一化!
    • 而BatchNorm作用于传统的神经网络时,是对不同样本产生的Z的归一化.比如对是对(z_{3}^{[2]{1}})(z_{3}^{[2]{100}}) 的归一化.其中假设了mini-batch=100, ([2])表示网络第2层,下标3表示第二层第三个节点,({1})表示第一个样本.
    • BatchNorm作用于CNN,与BatchNorm作用于传统的神经网络的工作方式是不同的!
  • 相关阅读:
    Windows Embedded CE 中断结构分析
    linux framebuff驱动总结
    Linux assemblers: A comparison of GAS and NASM
    使用C#编写ICE分布式应用程序
    makefile的写法
    在客户端中如何定位服务器(即如何寻找代理)
    番茄花园洪磊: 微软很早给我发过律师函
    利用ICE编写程序的几个注意点
    ICE架构
    AT&T汇编语言与GCC内嵌汇编简介
  • 原文地址:https://www.cnblogs.com/ZhongliangXiang/p/8144715.html
Copyright © 2020-2023  润新知