- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用以下代码来实现标准 GRU:
def BiRNN_deep_dynamic_FAST_FULL_autolength(x,batch_size,dropout,hidden_dim):
seq_len=length_rnn(x)
with tf.variable_scope('forward'):
lstm_cell_fwd =tf.contrib.rnn.GRUCell(hidden_dim,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())
lstm_cell_fwd = tf.contrib.rnn.DropoutWrapper(lstm_cell_fwd, output_keep_prob=dropout)
with tf.variable_scope('backward'):
lstm_cell_back =tf.contrib.rnn.GRUCell(hidden_dim,kernel_initializer=tf.contrib.layers.xavier_initializer(),bias_initializer=tf.contrib.layers.xavier_initializer())
lstm_cell_back = tf.contrib.rnn.DropoutWrapper(lstm_cell_back, output_keep_prob=dropout)
outputs,_= tf.nn.bidirectional_dynamic_rnn(cell_fw=lstm_cell_fwd,cell_bw= lstm_cell_back,inputs=x,sequence_length=seq_len,dtype=tf.float32,time_major=False)
outputs_fwd,outputs_bck=outputs
### fwd matrix is the matrix that keeps all the last [-1] vectors
fwd_matrix=tf.gather_nd(outputs_fwd, tf.stack([tf.range(batch_size), seq_len-1], axis=1)) ### 99,64
outputs_fwd=tf.transpose(outputs_fwd,[1,0,2])
outputs_bck=tf.transpose(outputs_bck,[1,0,2])
return outputs_fwd,outputs_bck,fwd_matrix
任何人都可以提供一个简单的示例来说明如何以类似的方式使用 tf.contrib.cudnn_rnn.CudnnGRU Cell 吗?仅更换电池是行不通的。
第一个问题是 CuDnnGRU 单元没有 dropout 包装器,这很好。其次,它似乎不适用于 tf.nn.bi Direction_dynamic_rnn。任何帮助表示赞赏。
最佳答案
CudnnGRU
不是 RNNCell
实例。它更类似于dynamic_rnn
。
下面的张量操作是等效的,其中input_tensor
是时间主张量,即形状[max_sequence_length, batch_size, embedding_size]
。 CudnnGRU 期望输入张量是时间主要的(与更标准的批量主要格式相反,即形状 [batch_size, max_sequence_length, embedding_size]
),并且使用时间主要是一个很好的实践无论如何,使用 RNN 操作的张量因为它们更快。
CudnnGRU:
rnn = tf.contrib.cudnn_rnn.CudnnGRU(
num_rnn_layers, hidden_size, direction='bidirectional')
rnn_output = rnn(input_tensor)
CudnnCompatibleGRUCell:
rnn_output = input_tensor
sequence_length = tf.reduce_sum(
tf.sign(inputs),
reduction_indices=0) # 1 if `input_tensor` is batch-major.
for _ in range(num_rnn_layers):
fw_cell = tf.contrib.cudnn_rnn.CudnnCompatibleGRUCell(hidden_size)
bw_cell = tf.contrib.cudnn_rnn.CudnnCompatibleGRUCell(hidden_size)
rnn_output = tf.nn.bidirectional_dynamic_rnn(
fw_cell, bw_cell, rnn_output, sequence_length=sequence_length,
dtype=tf.float32, time_major=True)[1] # Set `time_major` accordingly
注意以下几点:
CudnnCompatibleLSTMCell
;您可以使用标准的LSTMCell
。但对于 GRU,Cudnn 实现本质上具有不同的数学运算,特别是更多的权重 ( see the documentation )。dynamic_rnn
不同,CudnnGRU
不允许您指定序列长度。尽管如此,它还是快了一个数量级,但是您必须小心如何提取输出(例如,如果您对每个填充且长度不同的序列的最终隐藏状态感兴趣,您将需要每个序列的长度)。rnn_output
可能是一个包含大量(不同)内容的元组。请参阅文档,或者直接打印出来,以检查您需要输出的哪些部分。关于tensorflow - Tensorflow 中基于 CuDnnGRU 的 RNN 实现的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49183538/
我正在使用 CudnnGRU来自 tensorflow.contrib.cudnn_rnn 的类(class),训练速度要快得多。但是,在训练后,我需要将模型移至不基于 CUDA 的系统。那么我该如何
我使用以下代码来实现标准 GRU: def BiRNN_deep_dynamic_FAST_FULL_autolength(x,batch_size,dropout,hidden_dim): seq_
我有一个在 TensorFlow 1.14 中使用(现已弃用)tf.keras.layers.CuDNNGRU 构建的经过训练的模型层(在 tf.compat.v1 中的 TensorFlow 2.0
通过将其值作为层的参数传递,可以将循环丢失应用于 Keras 中的基本 LSTM 或 GRU 层。 CuDNNLSTM 和 CuDNNGRU 是与 CUDA 兼容的 LSTM 和 GRU 层。主要优势
CuDNNGRU在 TensorFlow 1.0真的很快。但是当我转到 TensorFlow 2.0 时我找不到 CuDNNGRU .简单 GRU TensorFlow 2.0真的很慢. 有什么办法可
我是一名优秀的程序员,十分优秀!