Python 将辍学学生与CudnnLSTM一起用于培训和验证

Python 将辍学学生与CudnnLSTM一起用于培训和验证,python,tensorflow,validation,lstm,Python,Tensorflow,Validation,Lstm,我正在尝试使用CudnnLSTM(tf.contrib.cudnn_rnn.python.layers.CudnnLSTM)中的dropout,我希望能够构建一个图,将dropout设置为非零的分数值进行训练,然后将dropout设置为0以测量验证错误度量。对于通常的Tensorflow LSTM单元(tf.contrib.rnn.LSTMCell),这并不太困难,因为keep_prob参数接受一个Tensor,但我发现这不是CudnnLSTM的选项 为了能够设置辍学率,我尝试使用一个全局变量来

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

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

所以我有两个问题

  • 当我更改用于设置辍学的全局变量的值时,我如何确定辍学是否在更改?(我猜不是,但如果有人告诉我我错了……我如何验证?)。我注意到git提交历史(至少对我来说)有点让人困惑,即使在层实现中,退出是否真的起作用
  • 如果通过全局设置辍学不起作用,并且我不能使用
    张量,我如何将辍学设置为与培训和验证不同?我想一种方法是构建两个共享权重的图,但是,如果
    CudnnLSTM
    生成自己的权重,而不是让它们传入,我该怎么做呢?有人能够提供一个代码示例,因为我没有找到一个

  • 感谢您的帮助。

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

    ### 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不是零。

    您是否尝试过可以应用于任何rnn单元的DropOutrapper
    ?@Maxim我将尝试一下,但我的工作假设是DropOutrapper不像CudnnLSTM那样直接与CUDA rnn API一起工作