【发布时间】:2018-06-25 05:48:57
【问题描述】:
我想在 TensorFlow (Python 3) 中实现自定义 LSTM 或 GRU 单元。例如,我想在时间步 T+1 进入单元之前,在时间步 T 处缩放来自单元的单元状态信号。我尝试在 TensorFlow 文档中搜索但没有成功。 你能给我一个提示吗? 谢谢。
编辑
检查@vijay m 给出的答案后,我创建模型如下:
def dynamic_scale_RNN(x, timescale, seqlen, weights, biases, keep_prop):
batch_size = tf.shape(x)[0]
# Unstack to get a list of 'n_steps' tensors of shape (batch_size, n_input)
x = tf.unstack(x, max_seq_len, 1)
timescale_unstack = tf.unstack(timescale, max_seq_len, 1)
gru_cell = tf.contrib.rnn.GRUCell(n_hidden)
#init_state has to be set to zero
init_state = gru_cell.zero_state(batch_size, dtype=tf.float32)
outputs = []
# Create a loop of N LSTM cells, N = time_steps.
for i in range(len(x)):
output, state= tf.nn.static_rnn(gru_cell, [x[i]], dtype=tf.float32, initial_state= init_state)
# copy the init_state with the new state
mask = tf.tile(tf.expand_dims(timescale_unstack[i],axis=1),[1,state[0].get_shape()[-1]])
init_state = tf.multiply(state,mask)
# init_state = state
outputs.append(output)
# Transform the output to [batch_size, time_steps, vector_size]
outputs = tf.transpose(tf.squeeze(tf.stack(outputs)), [1, 0, 2])
在上面的代码中,timescale 是一个形状为[batch_size, sequence_length, 1] 的张量,我想使用这个张量来缩放细胞状态。即使代码可以运行,它也会返回 nan 作为成本函数。
如果我取消注释 init_state = state 行,它可以工作,但不会缩放单元格状态。
我现在的问题是:为什么我会得到 nan 的成本函数值?
【问题讨论】:
-
查看答案的第 3 部分:stackoverflow.com/questions/50262174/…
-
@vijaym 我采用了你的方法,但我得到了
nan的成本函数。为什么会这样? -
我的方法只是展开rnn,结果应该与上面链接中证明的TF中实现的展开方法相同。所以 nan 应该是引入缩放的结果,我猜。
标签: tensorflow machine-learning recurrent-neural-network