Tensorflow函数学习笔记3---tf.nn.dropout

下面列出的是源码部分:

tf.nn.dropout(
x,  #一个tensor
keep_prob,  #决定每个元素被保留的概率,(0,1]
noise_shape=None,  #暂留问题
seed=None, 
name=None){
    ......
    noise_shape = _get_noise_shape(x, noise_shape)#若noise_shape保留默认值,则返回x的形状
    # uniform [keep_prob, 1.0 + keep_prob)
    random_tensor = keep_prob #假设keep_prob为0.5
    random_tensor += random_ops.random_uniform ( noise_shape , seed=seed , dtype = x.dtype) #本来默认均匀分布返回值范围为[0,1),加上keep_prob后返回值范围为[0.5,1.5)
    # 0. if [keep_prob, 1.0) and 1. if [1.0, 1.0 + keep_prob)
    binary_tensor = math_ops.floor(random_tensor) #向下取整
    ret = math_ops.div(x, keep_prob) * binary_tensor #对binary_tensor中取值为0的直接丢弃,取值为1的扩大为原来的1/keep_prob倍
    return ret
}

总是有刨根问底的习惯,想要知道它到底是怎么实现的,所以去看了源码,并且在上面都做了注释,更好的方便理解。

下面看个简单的代码:

import tensorflow as tf
x=tf.constant([[1.0,2.0,3.0],[1.0,2.0,3.0]])
x_dropout = tf.nn.dropout(
   x,
   keep_prob=0.5,
)
with tf.Session() as sess:
    print(sess.run(x_dropout))

结果如下:[[ 2. 4. 0.]
                   [ 2. 0. 0.]]

可以看到这里有3个元素成为原来的2倍,有3个元素被丢弃,而对这个起到关键作用的就是源码里的random_uniform()和floor()

总结:
1、在保持noise_shape默认值的条件下,x中的元素独立的安排保留或丢弃,丢弃的直接等于0,保留的则扩大为原来的1/keep_prob倍;
2、Keep_prob=1时,random_tensor的范围为[1,2),通过向下取整后都为1,所以所有元素都被保留;
3、如果keep_prob在(0,1]范围外,则会引起ValueError。

遗留问题:noise_shape这个参数虽然很少使用,但还是想搞明白,等搞清楚了再补充!

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值