代码之家  ›  专栏  ›  技术社区  ›  Karnivaurus

在递归循环期间分配给TensorFlow变量

  •  2
  • Karnivaurus  · 技术社区  · 6 年前

    在Tensorflow 1.9中,我想创建一个网络,然后递归地将网络的输出(预测)反馈回网络的输入。在这个循环中,我想将网络所做的预测存储在一个列表中。

    以下是我的尝试:

        # Define the number of steps over which to loop the network
        num_steps = 5
    
        # Define the network weights
        weights_1 = np.random.uniform(0, 1, [1, 10]).astype(np.float32)
        weights_2 = np.random.uniform(0, 1, [10, 1]).astype(np.float32)
    
        # Create a variable to store the predictions, one for each loop
        predictions = tf.Variable(np.zeros([num_steps, 1]), dtype=np.float32)
    
        # Define the initial prediction to feed into the loop
        initial_prediction = np.array([[0.1]], dtype=np.float32)
        x = initial_prediction
    
        # Loop through the predictions
        for step_num in range(num_steps):
            x = tf.matmul(x, weights_1)
            x = tf.matmul(x, weights_2)
            predictions[step_num-1].assign(x)
    
        # Define the final prediction
        final_prediction = x
    
        # Start a session
        sess = tf.Session()
        sess.run(tf.global_variables_initializer())
    
        # Make the predictions
        last_pred, all_preds = sess.run([final_prediction, predictions])
        print(last_pred)
        print(all_preds)
    

    打印出来:

    [[48.8769]]
    
    [[0.]
     [0.]
     [0.]
     [0.]
     [0.]]
    

    final_prediction 显示正确,值为 predictions 不是我想的那样。看来 从未实际分配到,尽管行 predictions[step_num-1].assign(x) .

    1 回复  |  直到 6 年前
        1
  •  2
  •   xdurch0    6 年前

    这是因为 assign 它只是一个TF操作,和其他任何操作一样,只有在需要时才执行。因为在通往 final_prediction predictions 只是一个变量,赋值永远不会执行。

    我认为最直接的解决办法是更换线路

    predictions[step_num-1].assign(x)
    

    通过

    x = predictions[step_num-1].assign(x)
    

    分配 最终预测 TF实际上需要通过 分配 所以任务应该完成。

    另一种选择是 tf.control_dependencies 分配 )取决于循环中计算的值,我不确定TF在这种情况下执行操作的顺序。以下方法应该有效:

    for step_num in range(num_steps):
        x = tf.matmul(x, weights_1)
        x = tf.matmul(x, weights_2)
        with tf.control_dependencies([predictions[step_num-1].assign(x)]):
            x = tf.identity(x)
    

    我们用 tf.identity 作为一个角落只是有一些东西要包装 control_dependencies . 我认为这是两者之间比较灵活的选择。但是,它附带了一些在 the docs .