gpt4 book ai didi

python - Keras 中的 GaussianDropout 与 Dropout 与 GaussianNoise

转载 作者:行者123 更新时间:2023-12-04 08:21:01 26 4
gpt4 key购买 nike

谁能解释一下不同 dropout 样式之间的区别?来自documentation ,我假设 GaussianDropout 不是将一些单位降为零(dropout),而是将这些单位乘以某个分布。但是在实际测试的时候,所有的单元都会被触动。结果看起来更像经典的 GaussianNoise。

tf.random.set_seed(0)
layer = tf.keras.layers.GaussianDropout(.05, input_shape=(2,))
data = np.arange(10).reshape(5, 2).astype(np.float32)
print(data)

outputs = layer(data, training=True)
print(outputs)

结果:

[[0. 1.]
[2. 3.]
[4. 5.]
[6. 7.]
[8. 9.]]
tf.Tensor(
[[0. 1.399]
[1.771 2.533]
[4.759 3.973]
[5.562 5.94 ]
[8.882 9.891]], shape=(5, 2), dtype=float32)

编辑:

显然,这就是我一直想要的:

def RealGaussianDropout(x, rate, stddev):

keep_prob = 1 - rate
random_tensor = tf.random.uniform(tf.shape(x))
keep_mask = tf.cast(random_tensor >= rate, tf.float32)
noised = x + K.random_normal(tf.shape(x), mean=.0, stddev=stddev)
ret = tf.multiply(x, keep_mask) + tf.multiply(noised, (1-keep_mask))

return ret


outputs = RealGaussianDropout(data,0.2,0.1)
print(outputs)

最佳答案

你是对的……GaussianDropout 和 GaussianNoise 非常相似。你可以自己复制它们来测试所有的相似性

def dropout(x, rate):

keep_prob = 1 - rate
scale = 1 / keep_prob
ret = tf.multiply(x, scale)
random_tensor = tf.random.uniform(tf.shape(x))
keep_mask = random_tensor >= rate
ret = tf.multiply(ret, tf.cast(keep_mask, tf.float32))

return ret

def gaussian_dropout(x, rate):

stddev = np.sqrt(rate / (1.0 - rate))
ret = x * K.random_normal(tf.shape(x), mean=1.0, stddev=stddev)

return ret

def gaussian_noise(x, stddev):

ret = x + K.random_normal(tf.shape(x), mean=.0, stddev=stddev)

return ret

高斯噪声只是将随机正态值与 0 均值相加,而高斯丢弃只是将随机正态值与 1 均值相乘。这些操作涉及输入的所有元素。经典的 dropout 将一些输入元素变为 0,对其他输入元素进行缩放

辍学

data = np.arange(10).reshape(5, 2).astype(np.float32)

set_seed(0)
layer = tf.keras.layers.Dropout(.4)
out1 = layer(data, training=True)
set_seed(0)
out2 = dropout(data, .4)
print(tf.reduce_all(out1 == out2).numpy()) # TRUE

高斯下降

data = np.arange(10).reshape(5, 2).astype(np.float32)

set_seed(0)
layer = tf.keras.layers.GaussianDropout(.05)
out1 = layer(data, training=True)
set_seed(0)
out2 = gaussian_dropout(data, .05)
print(tf.reduce_all(out1 == out2).numpy()) # TRUE

高斯噪声

data = np.arange(10).reshape(5, 2).astype(np.float32)

set_seed(0)
layer = tf.keras.layers.GaussianNoise(.3)
out1 = layer(data, training=True)
set_seed(0)
out2 = gaussian_noise(data, .3)
print(tf.reduce_all(out1 == out2).numpy()) # TRUE

为了保证可重复性,我们使用了 (TF2):

def set_seed(seed):

tf.random.set_seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
random.seed(seed)

关于python - Keras 中的 GaussianDropout 与 Dropout 与 GaussianNoise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65501878/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com