首页 > 解决方案 > 如何实现随机深度,并随机丢弃整个卷积层?

问题描述

我正在尝试实现这个想法:https ://arxiv.org/abs/1603.09382 。基本思想是在基于“保持概率”的训练期间丢弃 Conv2D 层,例如 Dropout。我想我可以用这样的自定义层来做到这一点:

class StochasticConv2D(layers.Layer):
    def __init__(self, **kwargs):
        super(StochasticConv2D, self).__init__()
        self.conv2D = layers.Conv2D(**kwargs)

    def call(self, inputs, training, keep_prob):
        if training and (np.random.uniform() > keep_prob):
            return inputs
        return self.conv2D(inputs)

当我尝试使用 training = True 时,我收到此错误:

ValueError: tf.function-decorated function tried to create variables on non-first call.

如果我让它工作,我不太确定如何实现非训练模式。我是否使用 training = false 再次定义模型并加载训练中保存的权重?如果我将validation_data 传递给model.fit(),如何在运行验证时将“training”设置为false?

标签: pythontensorflowkeras

解决方案


这似乎可以做到(先前解决方案的修改版本):

class StochasticConv2D(layers.Layer):
    def __init__(self, keep_prob, **kwargs):
        super(StochasticConv2D, self).__init__()
        self.keep_prob = keep_prob
        self.conv2D = layers.Conv2D(**kwargs)

    def call(self, inputs):
        if keras.backend.learning_phase():
            coin_toss = tf.random.uniform(())
            return tf.cond(tf.greater(coin_toss, self.keep_prob), lambda: inputs, lambda: self.conv2D(inputs))
            
        return self.conv2D(inputs)

推荐阅读