tf.nn.dropout和tf.keras.layers.Dropout的区别(TensorFlow2.3)与实验

19 篇文章 2 订阅
9 篇文章 2 订阅

场景:dropout和Dropout区别

全网搜索tf.nn.dropout和tf.keras.layers.Dropout区别,发现好多都是错误的讲解,因此有必要进行一次实验和纠错。
tf.nn.dropout和tf.keras.layers.Dropout的区别,看本文就足够了。


问题描述:

tf.nn.dropout和tf.keras.layers.Dropout的区别。

先实验一下,再出结论,代码如下:

import tensorflow as tf

x = tf.ones((10,10))
print("the orginal x is x_numpy() : ")
print(x.numpy())
x_after_nn_dropout = tf.nn.dropout(x=x,rate=0.2)  # 每个元素以rate的概率丢弃,随机丢弃一些特征,在训练和预测时都生效
print("x_after_nn_dropout.numpy()")
print(x_after_nn_dropout.numpy())

x_after_nn_dropout2 = tf.nn.dropout(x=x,rate=0.9999)  # 每个元素以rate的概率丢弃,随机丢弃一些特征,在训练和预测时都生效
print("x_after_nn_dropout2.numpy()")
print(x_after_nn_dropout2.numpy())

print("tf.nn.dropout(x, rate = 0.0) == x : ")
print(tf.nn.dropout(x, rate = 0.0) == x)
print("tf.nn.dropout(x, rate = 1) == x : ")
print(tf.nn.dropout(x, rate = 0.999) == x)

x_after_dropout1 = tf.keras.layers.Dropout(0.2)(x)
print("x_after_dropout1.numpy(): ")
print(x_after_dropout1.numpy())  #tf.keras.layers.Dropout只会在训练fit时才会起作用,随机设定输入的值x=0,这个概率为输入的百分数
                                 #在模型预测(predict)时,不生效,所有神经元均保留也就是不进行dropout。所以我们常用的应该是这个。

运行结果如下:

the orginal x is x_numpy() : 
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]
x_after_nn_dropout.numpy()
[[1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25]
 [1.25 1.25 0.   1.25 1.25 1.25 1.25 1.25 0.   1.25]
 [1.25 1.25 0.   1.25 1.25 1.25 1.25 1.25 1.25 1.25]
 [1.25 1.25 1.25 1.25 0.   1.25 0.   0.   1.25 1.25]
 [0.   0.   1.25 1.25 1.25 1.25 1.25 1.25 1.25 0.  ]
 [1.25 0.   1.25 1.25 1.25 1.25 1.25 0.   1.25 1.25]
 [1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 0.   1.25]
 [1.25 1.25 1.25 0.   0.   1.25 1.25 1.25 0.   1.25]
 [1.25 1.25 1.25 1.25 1.25 1.25 1.25 1.25 0.   0.  ]
 [1.25 1.25 1.25 1.25 0.   1.25 1.25 1.25 1.25 1.25]]
x_after_nn_dropout2.numpy()
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
tf.nn.dropout(x, rate = 0.0) == x : 
tf.Tensor(
[[ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]
 [ True  True  True  True  True  True  True  True  True  True]], shape=(10, 10), dtype=bool)
tf.nn.dropout(x, rate = 1) == x : 
tf.Tensor(
[[False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]
 [False False False False False False False False False False]], shape=(10, 10), dtype=bool)
 x_after_dropout1.numpy(): 
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]

结论:

综合实验结果,得到如下结论。

  • 1.tf.nn.dropout(x=x,rate=0.2) # 每个元素以rate的概率丢弃,也就是变成了0,在训练和预测时都生效
  • 2.tf.nn.dropout(x=x,rate=0.9999) # rate增大时,基本上全部元素都只为了0
  • 3.tf.keras.layers.Dropout(0.2)(x) #只会在训练fit时才会起作用,随机设定输入的值x的某一维=0,这个概率为输入的百分数 ,训练fit才有效。在模型预测(predict)时,不生效,所有神经元均保留也就是不进行dropout。

所以我们常用的应该是这个tf.keras.layers.Dropout,里面数值就是我们需要丢弃掉神经元的比例,0.2就表示随机丢掉20%的神经元不激活。


深层次原因:dropout是底层API,Dropout是高层API

产生这种结果的原因

  • 1.tf.nn.dropout是底层API,功能很简单,没有其他额外的附加功能。因此,dropout就真的是在dropout,一个单一的函数。
  • 2.tf.keras.layers.Dropout是个高层API,功能完善,他会区分当前状态是fit还是predict,如果是fit,他会把is_training = True,dropout生效;当遇到是predict、evalue时,is_training = False,dropout不生效。

也正是因为tf.keras.layers.Dropout帮我们实现了这一个功能,不然,自己要去实现这套东西,还挺复杂。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值