tensorflow----padding详解

tf.truncated_normal()

def truncated_normal(shape,
                     mean=0.0,
                     stddev=1.0,
                     dtype=dtypes.float32,
                     seed=None,
                     name=None):

功能说明:

产生截断正态分布随机数,取值范围为[ mean - 2 * stddev, mean + 2 * stddev ]。

参数列表:

  • shape: 一维的张量,也是输出的张量。
  • mean: 正态分布的均值。
  • stddev: 正态分布的标准差。
  • dtype: 输出的类型。
  • seed: 一个整数,当设置之后,每次生成的随机数都一样。
  • name: 操作的名字。

在tf.truncated_normal中如果x的取值在区间(mean - 2 * stddev, mean + 2 * stddev)之外则重新进行选择。这样保证了生成的值都在均值附近。


tf.reduce_mean()

def reduce_mean(input_tensor,
                axis=None,
                keep_dims=False,
                name=None,
                reduction_indices=None):

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
参数列别:

  • input_tensor: 输入的待降维的tensor;
  • 数axis: 指定的轴,如果不指定,则计算所有元素的均值;
  • 数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
  • name: 操作的名称;
  • reduction_indices:在以前版本中用来指定轴,已弃用;

例子:

 # 'x' is [[1., 1.]
 #         [2., 2.]]
 tf.reduce_mean(x) ==> 1.5
 tf.reduce_mean(x, 0) ==> [1.5, 1.5]
 tf.reduce_mean(x, 1) ==> [1.,  2.]

tf.nn.conv2d()----卷积函数

def conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,
           data_format=None, name=None):
  • input:指定需要做卷积的输入图像,它要求是一个Tensor,具有[batch,in_height,in_width,in_channels]这样的形状(shape),具体含义是"训练时一个batch的图片数量,图片高度,图片宽度,图片通道数",注意这是一个四维的Tensor,要求类型为float32或者float64.
  • filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height,filter_width,in_channels,out_channels]这样的shape,具体含义是"卷积核的高度,卷积核的宽度,图像通道数,滤波器个数",要求类型与参数input相同。有一个地方需要注意,第三维in_channels,就是参数input中的第四维。
  • strides:卷积时在图像每一维的步长,这是一个一维的向量,长度为4,与输入input对应,一般值为[1,x,x,1],x取步长。
  • padding:定义元素边框与元素内容之间的空间。string类型的量,只能是"SAME"和“VALID”其中之一,这个值决定了不同的卷积方式。
  • use_cudnn_on_gpu:bool类型,是否使用cudnn加速,默认是True.
  • name:指定名字

该函数返回一个Tensor,这个输出就是常说的feature map。

注意:在卷积核函数中,padding参数最容易引起歧义,该参数仅仅决定是否要补0,因此一定要清楚padding设置为SAME的真正意义。在设SAME的情况下,只有在步长为1时生成的feature map才会与输入大小相等。


padding规则介绍:

padding属性的意义是定义元素边框与元素内容之间的空间。

在tf.nn.conv2d函数中,当变量padding为VALID和SAME时,函数具体是怎么计算的呢?其实是有公式的。为了方便演示,我们先来定义几个变量:

  • 输入的尺寸中高和宽定义为in_height,in_width;
  • 卷积核的高和宽定义成filter_height,filter_width;
  • 输出的尺寸中高和宽定义成output_height,output_width;
  • 步长的高宽定义成strides_height,strides_width;

1、VALID情况
输出宽和高的公式分别为:

output_width = (in_width - filter_width + 1)/strides_width (结果向上取整)
output_height = (in_height - filter_height + 1)/strides_height (结果向上取整)

2、SAME情况
输出宽和高的公式分别为:

output_width = in_width/strides_width (结果向上取整)
output_height = in_height /strides_height (结果向上取整)

这里有一个很重要的知识点–补零的规则:

  • pad_height = max((out_height - 1)xstrides_height + filter_height - in_height,0)
  • pad_width = max((out_width - 1)xstrides_width + filter_width - in_width,0)
  • pad_top = pad_height/2
  • pad_bottom = pad_height - pad_top
  • pad_left = pad_width/2
  • pad_right = pad_width - pad_left
  • pad_height:代表高度方向要填充0的行数;
  • pad_width:代表宽度方向要填充0的列数;
  • pad_top,pad_bottom,pad_left,pad_right:分别表示上、下、左、右这4个方向填充0的行数、列数。

tf.nn.max_pool() && tf.nn.avg_pool()----池化函数

def max_pool(value, ksize, strides, padding, data_format="NHWC", name=None):
def avg_pool(value, ksize, strides, padding, data_format="NHWC", name=None):

这两个函数中的4个参数和卷积参数很相似,具体说明如下:

  • input:需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch,height,width,channels]这样的shape。
  • ksize:池化窗口的大小,取一个思维向量,一般是[1,height,width,1],因为我们不想在batch和channels上做池化,所以这两个维度设为1.
  • strides:和卷积参数含义类似,窗口在每一个维度上滑动的步长,一般也是[1,stride,stride,1]。
  • padding:和卷积参数含义一样,也是"VALID"或者"SAME"。
  • name:指定名字

该函数返回一个Tensor。类型不变,shape仍然是[batch,height,width,channels]这种形式。


padding

https://blog.csdn.net/wuzqChom/article/details/74785643
计网络结构时需要设置输入输出的shape,源码nn_ops.py中的convolution函数和pool函数给出的计算公式如下:

If padding == "SAME":
      output_spatial_shape[i] = ceil(input_spatial_shape[i] / strides[i])

    If padding == "VALID":
      output_spatial_shape[i] =
        ceil((input_spatial_shape[i] -
              (spatial_filter_shape[i]-1) * dilation_rate[i])
              / strides[i]).

dilation_rate为一个可选的参数,默认为1

整理一下,对于VALID,输出的形状计算如下:

new_height=new_width=⌈(W–F+1)/S ⌉

对于SAME,输出的形状计算如下:

new_height=new_width=⌈ W / S  ⌉

其中,W为输入的size,F为filter的size,S为步长,⌈ ⌉为向上取整符号。


tf.nn.dropout()

https://blog.csdn.net/stdcoutzyx/article/details/49022443
https://blog.csdn.net/hjimce/article/details/50413257

def dropout(x, keep_prob, noise_shape=None, seed=None, name=None):  # pylint: disable=invalid-name
tf.nn.dropout是TensorFlow里面为了防止或减轻过拟合而使用的函数,它一般用在全连接层。**
工作原理:在前向传导的时候,让某个神经元的激活值以一定的概率p,让其停止工作

实现源码:

#dropout函数的实现
def dropout(x, level):
	if level < 0. or level >= 1:#level是概率值,必须在0~1之间
	    raise Exception('Dropout level must be in interval [0, 1[.')
	retain_prob = 1. - level
    #我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
	#硬币 正面的概率为p,n表示每个神经元试验的次数
	#因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
	sample=np.random.binomial(n=1,p=retain_prob,size=x.shape)#即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
	print sample
	x *=sample#0、1与x相乘,我们就可以屏蔽某些神经元,让它们的值变为0
	print x
	x /= retain_prob
 
	return x
#对dropout的测试,大家可以跑一下上面的函数,了解一个输入x向量,经过dropout的结果
x=np.asarray([1,2,3,4,5,6,7,8,9,10],dtype=np.float32)

tf.argmax()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值