1、先定义几个参数
于是我们可以得出
N = (W − F + 2P )/S+1
输出图片大小为 N×N
2、Padding 在stride_x=stride_y,image size长宽相等时,
整理一下,对于“VALID”,输出的形状计算如下:
new_height=new_width=⌈(W–F+1)S⌉
对于“SAME”,输出的形状计算如下:
new_height=new_width=⌈WS⌉
其中,W⌈⌉为向上取整符号。
The TensorFlow Convolution example gives an overview about the difference between SAME
and VALID
:
For the SAME
padding:
out_height = ceil(float(in_height) / float(strides[1])) #向上取整
out_width = ceil(float(in_width) / float(strides[2]))
For the VALID
padding:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))
3、参数计算
http://blog.csdn.net/dcxhun3/article/details/46878999
4.BN
Batch normalization主要解决深度神经网络层数太多,导致没办法向前传递(forward propagate)的问题,他的每一层输出值都会有不同的mean和deviation,其中的 batch 是批数据, 把数据分成小批小批进行SGD. 而且在每批数据进行前向传递 forward propagation 的时候, 对每一层都进行 normalization 的处理.
顺便要提一下我们和他有点相似的Normalization这个数据预处理的方法,总之呢,他们都是为了使你的接收数据不是辣么乱,让他们有一个统一的规格吧,在神经网络中, 数据分布对训练会产生影响. 比如某个神经元 x 的值为1, 某个 Weights 的初始值为 0.1, 这样后一层神经元计算结果就是 Wx = 0.1; 现在还不能看出什么问题, 但是, 当我们加上一层激励函数, 激活这个 Wx 值的时候, 问题就来了. 如果使用 像 tanh 的激励函数, Wx 的激活值就变成了 ~0.1 和 ~1, 接近于 1 的部已经处在了 激励函数的饱和阶段, 也就是如果 x 无论再怎么扩大, tanh 激励函数输出值也还是接近1. 换句话说, 神经网络在初始阶段已经不对那些比较大的 x 特征范围 敏感了. 当然可以对数据做 normalization 预处理, 使得输入的 x 变化范围不会太大, 让输入值经过激励函数的敏感部分.
但刚刚这个不敏感问题不仅仅发生在神经网络的输入层, 而且在隐藏层中也经常会发生.~
差不多就是:数据--> FC层---> BN---->Activate Function