场景: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帮我们实现了这一个功能,不然,自己要去实现这套东西,还挺复杂。