张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)
Posted
技术标签:
【中文标题】张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)【英文标题】:what exactly does 'tf.contrib.rnn.DropoutWrapper'' in tensorflow do? ( three citical questions)张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做什么的? (三题) 【发布时间】:2018-01-12 10:08:34 【问题描述】:据我所知,DropoutWrapper 的使用方法如下
__init__(
cell,
input_keep_prob=1.0,
output_keep_prob=1.0,
state_keep_prob=1.0,
variational_recurrent=False,
input_size=None,
dtype=None,
seed=None
)
.
cell = tf.nn.rnn_cell.LSTMCell(state_size, state_is_tuple=True)
cell = tf.nn.rnn_cell.DropoutWrapper(cell, output_keep_prob=0.5)
cell = tf.nn.rnn_cell.MultiRNNCell([cell] * num_layers, state_is_tuple=True)
我唯一知道的是它用于训练时的辍学。 这是我的三个问题
input_keep_prob、output_keep_prob 和 state_keep_prob 分别是什么? (我猜他们定义了 RNN 的每个部分的 dropout 概率,但确切地说 在哪里?)
这种情况下的 dropout 是否不仅适用于 RNN 训练,还适用于预测过程?如果是真的,有什么方法可以决定我在预测过程中是否使用 dropout?
作为tensorflow网页中的API文档,如果variational_recurrent=True dropout按照论文上的方法工作 “Y. Gal, Z Ghahramani。“递归神经网络中 Dropout 的理论基础应用”。https://arxiv.org/abs/1512.05287“我大致理解了这篇论文。当我训练 RNN 时,我使用“批处理”而不是单个时间序列。在这种情况下,tensorflow 会自动为批次中的不同时间序列分配不同的 dropout 掩码?【问题讨论】:
在预测期间,您希望使用 1.0 的 keep_prob。这就是为什么通常通过占位符而不是常量来提供该值更容易。 【参考方案1】:-
input_keep_prob 用于拟合特征权重时添加的 dropout 级别(包含概率)。 output_keep_prob 是为每个 RNN 单元输出添加的 dropout 级别。 state_keep_prob 用于输入到下一层的隐藏状态。
您可以按如下方式初始化上述每个参数:
import tensorflow as tf dropout_placeholder = tf.placeholder_with_default(tf.cast(1.0, tf.float32)) tf.nn.rnn_cell.DropoutWrapper(tf.nn.rnn_cell.BasicRNNCell(n_hidden_rnn), input_keep_prob = dropout_placeholder, output_keep_prob = dropout_placeholder, state_keep_prob = dropout_placeholder)
预测期间的默认 dropout 级别将是 1,或者我们可以在训练期间提供的任何其他值。
-
屏蔽是针对拟合的权重进行的,而不是针对批次中包含的序列。据我所知,它是为整个批次完成的。
【讨论】:
【参考方案2】:keep_prob = tf.cond(dropOut,lambda:tf.constant(0.9), lambda:tf.constant(1.0))
cells = rnn.DropoutWrapper(cells, output_keep_prob=keep_prob)
【讨论】:
以上是关于张量流中的“tf.contrib.rnn.DropoutWrapper”到底是做啥的? (三题)的主要内容,如果未能解决你的问题,请参考以下文章