【问题标题】:Backpropagation (through time) code in TensorflowTensorflow 中的反向传播(通过时间)代码
【发布时间】:2016-04-20 13:23:59
【问题描述】:

在哪里可以找到 Tensorflow (python API) 中的反向传播(通过时间)代码?还是使用了其他算法?

例如,当我创建一个 LSTM 网络时。

【问题讨论】:

    标签: python tensorflow backpropagation


    【解决方案1】:

    TensorFlow 中的所有反向传播都是通过自动区分网络前向传递中的操作,并添加显式操作来计算网络中每个点的梯度来实现的。通用实现可以在tf.gradients() 中找到,但使用的特定版本取决于您的 LSTM 是如何实现的:

    • 如果将 LSTM 实现为有限数量时间步的展开循环,则通常的方法是通过时间截断反向传播,它使用tf.gradients() 中的算法在相反方向构建展开的反向传播循环。
    • 如果 LSTM 被实现为 tf.while_loop(),它使用额外的支持来区分 control_flow_grad.py 中的循环。

    【讨论】:

    • 请看看这个stackoverflow.com/q/66185202/14337775,给你意见
    • 有没有简单的方法让tensorflow做截断的BPTT并确定步数?还是我必须手动构建展开的网络?
    【解决方案2】:

    我不确定,但这可能有效:

    由于可以像前馈网络一样训练 RNN,因此代码非常相似。 这就是你训练前馈网络的方式:(X 是输入)

    train = tf.train.GradientDescentOptimizer(learning_rate).minimize(error)
    
    # Session
    sess = tf.Session()
    sess.run(tf.initialize_all_variables())
    
    for i in range(epochs):
        sess.run(train, feed_dict={X: [[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]], labels: [[0], [1], [1], [0]]})
    

    通过时间反向传播的唯一区别是现在每个时期都有一个嵌套的时间循环

    这是训练简单 rnn 的代码:

    train = tf.train.GradientDescentOptimizer(learning_rate).minimize(error)
    
    time_series = [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
    for i in range(number_of_epochs):
        for j in range(len(time_series) - 1):
            curr_X = time_series[j+1]
            curr_prev = time_series[j]
            lbs = curr_prev
            sess.run(train, feed_dict={X: [[curr_X]], prev_val: [[curr_prev]], labels: [[lbs]]})
    

    在这段代码中,rnn 学习了一个具有交替 1 和 0 的时间序列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-05
      • 2020-11-23
      • 2011-08-25
      • 1970-01-01
      • 2016-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多