【问题标题】:How to customize a RNN cell如何自定义一个 RNN 单元
【发布时间】: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


【解决方案1】:

我在这里留下我的答案,以防它可以帮助某人。 'nan' 成本值的原因是 init_state 设置得太高。虽然我不知道这个值的适当范围,但我可以观察到,如果我将它缩放一个像 0.1 这样的小因子,我就再也看不到“nan”了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2021-10-13
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多