【问题标题】:Why the difference before and after dropout is not equal to the dropout proportion?为什么dropout前后的差异不等于dropout的比例?
【发布时间】:2021-05-12 08:26:21
【问题描述】:

我正在指定一个从 dropout 进行正则化的网络。但是我无法理解这里是如何处理辍学的。具体来说,为什么应用 dropout 前后的零个数之差不完全等于 dropout 比例?

class DropoutDenseNetwork(tf.Module):
    def __init__(self, name=None):
        super(DropoutDenseNetwork, self).__init__(name=name)
        self.dense_layer1 = Dense(32)
        self.dropout = tf.keras.layers.Dropout(0.2)
        self.dense_layer2 = Dense(10, activation=tf.identity)

    @tf.function
    def __call__(self, x, is_training):
        embed = self.dense_layer1(x)
        propn_zero_before = tf.reduce_mean(tf.cast(tf.equal(embed, 0.), tf.float32))
        embed = self.dropout(embed, is_training)
        propn_zero_after = tf.reduce_mean(tf.cast(tf.equal(embed, 0.), tf.float32))
        tf.print('Zeros before and after:', propn_zero_before, "and", propn_zero_after)
        output = self.dense_layer2(embed)
        return output

if 'drop_dense_net' not in locals():
    drop_dense_net = DropoutDenseNetwork()
drop_dense_net(tf.ones([1, 100]), tf.constant(True))

【问题讨论】:

标签: python tensorflow keras deep-learning dropout


【解决方案1】:

因为rate 只是任何神经元在训练期间被丢弃的概率。它不会总是准确地落在 0.2 个数据上,尤其是只有 32 个单位。如果增加单位数(例如 100,000),您会发现它更接近于 0.2 的 rate:

import tensorflow as tf
from tensorflow.keras.layers import *

class DropoutDenseNetwork(tf.Module):
    def __init__(self, name=None):
        super(DropoutDenseNetwork, self).__init__(name=name)
        self.dense_layer1 = Dense(100000)
        self.dropout = tf.keras.layers.Dropout(0.2)
        self.dense_layer2 = Dense(1)

    @tf.function
    def __call__(self, x, is_training):
        embed = self.dense_layer1(x)
        propn_zero_before = tf.reduce_mean(tf.cast(tf.equal(embed, 0.), tf.float32))
        embed = self.dropout(embed, is_training)
        propn_zero_after = tf.reduce_mean(tf.cast(tf.equal(embed, 0.), tf.float32))
        tf.print('Zeros before and after:', propn_zero_before, "and", propn_zero_after)

drop_dense_net = DropoutDenseNetwork()
drop_dense_net(tf.ones([1, 10]), tf.constant(True))
Zeros before and after: 0 and 0.19954

在后台,tf.keras.layers.Dropout 使用 tf.nn.dropout。后面解释的文档:

rate:每个元素被丢弃的概率

在source code 中,您可以看到它创建了一个与输入形状相同的随机值掩码,并选择高于速率的值。当然,并非正好有 0.2 个值会高于rate:

 random_tensor = random_ops.random_uniform(
        noise_shape, seed=seed, dtype=x_dtype)

keep_mask = random_tensor >= rate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-04
    • 2019-08-09
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 2021-08-02
    • 2017-12-09
    • 2018-11-23
    相关资源
    最近更新 更多