【问题标题】:Using dropout with CudnnLSTM for training and validation使用带有 CudnnLSTM 的 dropout 进行训练和验证
【发布时间】:2021-01-10 15:35:35
【问题描述】:

我正在尝试将 dropout 与 CudnnLSTM (tf.contrib.cudnn_rnn.python.layers.CudnnLSTM) 一起使用,我希望能够只构建一个图并将 dropout 设置为某个非零小数值进行训练,然后将 dropout 设置为 0测量验证错误指标。使用通常的 Tensorflow LSTM 单元 (tf.contrib.rnn.LSTMCell),这并不太难,因为 keep_prob 参数接受 Tensor,但我发现这不是 CudnnLSTM 的选项。

为了能够设置 dropout,我尝试使用全局变量来设置 dropout,然后在训练和验证之间更改该全局变量的值,但我认为这不起作用(无法证明但这是我最好的猜测)。特别是我的训练和验证错误大致相同,而在过去,当我在 RNN 中使用 dropout 进行训练时(在同一数据集上),验证往往会很快优于训练(因为验证将 dropout % 设置为 0 )。我已经使用了通常的 LSTM 来获得这样的结果(在相同的数据集上),所以我希望看到与 Cudnn 类似的东西。

所以我有两个问题。

  1. 当我更改用于设置它的全局变量的值时,我如何才能确定 dropout 是否正在改变?(我的猜测不是,但如果有人告诉我我错了......我怎样才能验证这一点?)。我注意到 git 提交历史记录,至少对我而言,对于 dropout 是否在层实现中实际起作用有点令人困惑。
  2. 如果通过全局设置 dropout 不起作用,并且我不能使用 Tensor,如何将 dropout 设置为不同的训练和验证?我想一种方法这是为了构建两个共享权重的图,但是考虑到CudnnLSTM 自己制作权重而不是让它们传入,我该怎么做?有人能提供一个我找不到的代码示例吗?

感谢您的帮助。

【问题讨论】:

  • 你试过DropoutWrapper可以应用于任何rnn单元格吗?
  • @Maxim 我会试一试,但我的工作假设是 DropoutWrapper 不像 CudnnLSTM 那样直接使用 CUDA RNN API

标签: python tensorflow validation lstm


【解决方案1】:

模型调用方法中的训练参数部分控制dropout是否生效。如果 training = true,则应用 dropout;如果 training = false,则忽略 dropout。

### testing out dropout with cudnn_rnn to see how it works
layers       = 5
hidden_units = 3
dropout      = 1.0
model        = cudnn_rnn.CudnnGRU(layers, hidden_units, dropout = dropout)

data = tf.ones([128, 100, 3])
model.build(data.shape)

training_output,  training_state  = model(data, training = True)
inference_output, inference_state = model(data, training = False)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
x, y = sess.run([training_output,  training_state])
w, v = sess.run([inference_output, inference_state])

我们可以看到 x 和 y 都是 0,因为 dropout 设置为 1.0。但是 w 和 v 不为零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-11
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 2011-12-16
    • 2014-05-01
    相关资源
    最近更新 更多