1、先定义几个参数

  • Image_size =  W×W
  • Filter_size =  F×F
  • Stride =  S
  • padding的像素数 P

于是我们可以得出

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

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