从 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作用于传统的神经网络的工作方式是不同的!
从 python 中 axis 参数直觉解释 到 CNN 中 BatchNorm 的工作方式(Keras代码示意)的更多相关文章
- Python Pandas与Numpy中axis参数的二义性
Stackoverflow.com是程序员的好去处,本公众号将以pandas为主题,开始一个系列,争取做到每周一篇,翻译并帮助pandas学习者一起理解一些有代表性的案例.今天的主题就是Pandas与 ...
- 如何获取url中的参数并传递给iframe中的报表
在使用报表软件时,用户系统左边一般有目录树,点击报表节点就会在右侧网页的iframe中显示出报表,同时点击的时候也会传递一些参数给网页,比如时间和用户信息等.如何使网页中的报表能够获取到传递过来的参数 ...
- APPCAN开发笔记:html页面之间的参数传递:使用js获取url中的参数,以及在APPCAN中不能使用的解决方法
用PHP的GET/POST方式来传递方式已经是司空见惯了,但是如果我的页面是一个静态的html的页面,想传递参数的时候要怎么办呢?在APPCAN的开发中我们会经常遇到这样的问题,因为所有的页面都是静态 ...
- Python:SQLMAP参数中文解释
#HiRoot's BlogOptions(选项):--version 显示程序的版本号并退出-h, --help 显示此帮助消息并退出-v VERBOSE 详细级别:0-6(默认为1) Target ...
- Jmeter用beanshell将相应中的参数写入到本地文件中
实现效果: 将每次请求的指定参数写入到本地csv文件中. 实际场景:将登录请求中,服务器返回的token值获取并写入到本地csv文件中,供其他接口调用.这样在压测单接口时,不需要再进行登录,避免压测单 ...
- 【WPF】将控件事件中的参数,传递到ViewModel中
在MVVM模式下,在通常使用命令(Command)绑定的方式的时候 ,使用的是 CommandParameter 属性进行参数的传递. 但是很多时候,有一些事件我们需要使用其中的一些事件里面的参数,以 ...
- Java中带参数的方法和JavaScript中带参数的函数有什么不同?
javascript是动态语言,是弱类型语言,其参数的使用很灵活:java则是强类型语言,参数的类型必须明确的
- 梯度优化算法总结以及solver及train.prototxt中相关参数解释
参考链接:http://sebastianruder.com/optimizing-gradient-descent/ 如果熟悉英文的话,强烈推荐阅读原文,毕竟翻译过程中因为个人理解有限,可能会有谬误 ...
- 【转】使用JavaParser获得Java代码中的类名、方法形参列表中的参数名以及统计总的文件个数与不能解析的文件个数
遍历目录查找Java文件: public static void ergodicDir(File dir, HashSet<String> argNameSet, HashSet<S ...
随机推荐
- Swagger: 一个restful接口文档在线生成+功能测试软件
一.什么是 Swagger? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件.Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 ...
- 阿里安全归零实验室招聘各路大牛!offer好说!
阿里安全归零实验室成立于2017年11月,致力于对黑灰产技术的研究.实验室的愿景是通过技术手段解决当前日益严重的网络违规和网络犯罪问题,为阿里新经济体保驾护航. 实验室与寄生在阿里生态经济体的黑灰产直 ...
- python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序
说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...
- MYSQL之库操作
一.系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 mysql:核心数据库,里面包含用户.权限. ...
- python 开发之路 -MySQL
阅读目录 第一篇 : 数据库 之 基本概念 第二篇 : MySQL 之 库操作 第三篇 : MySQL 之 表操作 第四篇 : MySQL 之 数据操作 第五篇 : MySQL 之 视图.触发器.存储 ...
- centos7搭建nexus maven私服(二)
本文主要补充两个主题: 1.手动更新索引 2.通过maven客户端发布本地jar包到nexus 先说第一个主题: 由于maven中央仓库汇集了全世界绝大多数的组件,所以它的索引库非常庞大,在我们右击仓 ...
- 在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
在删除一个指针之后,一定将该指针设置成空指针(即在delete *p之后一定要加上: p=NULL)
- Hive:添加、删除分区
添加分区: ', p_loctype='MHA'); 已经创建好的分区表: INFO : Loading partition {p_hour, p_city, p_loctype=MHA} INFO ...
- Struts(十一):OGNL表达式(二)
Map栈 :request,session,application的一个属性值或一个请求参数的值. 若想访问ContextMap里的某个对象的属性,可以使用以下几种之一: #object.proper ...
- Windows使用Gitblit搭建Git服务器
安装之前需确定安装JAVA运行环境. 下载安装 首先到 Gitblit官网 下载安装包.此处使用的版本是1.8.0. 将解压得到的gitblit-1.8.0文件夹放于C:\gitServer目录下. ...