- 场景:dropout和Dropout区别
- 问题描述:
- 结论:
- 深层次原因:dropout是底层API,Dropout是高层API
全网搜索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帮我们实现了这一个功能,不然,自己要去实现这套东西,还挺复杂。



