tensorflow学习笔记(1):sess.run()

本文通过实例详细解析了TensorFlow中session.run()的工作原理,包括如何计算图中的操作节点、如何处理feed_dict中的数据喂入及如何正确理解并行运算对结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

session.run()

session.run([fetch1, fetch2])

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one)
update = tf.assign(state, new_val)
init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(10):
        u,s = sess.run([update,state])
        print s

在我的电脑上输出是 0.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 8.0, 9.0, 10.0
是不是很奇怪为什么输出的不是0.0–9.0, 或1.0–10.0
我的猜测是:底层在fectch这两个值的时候,是并行运算的,第一次:程序先fetch “state”的值,然后fetch “update”(导致了assign op)。 第二次,程序先fetch “update”(导致了 assign op),然后fetch “state” . 所以导致了第一次输出是0.0, 第二次输出是2.0.
注:(update op 更新state的值, 而我在fetch update 的同时也fetch 了state, 只有在这种情况下才会出现上述的问题。 如果我不fetch state ,而去fetch add1的话, 就不会出现上述问题,可见底层是先更新了state的值,才去计算add1。这样的话我们经常使用的代码sess.run([train_op, loss]),获取的loss就是train_op执行完之后的loss了)

执行sess.run()时,tensorflow是否计算了整个图

我们在编写代码的时候,总是要先定义好整个图,然后才调用sess.run()。那么调用sess.run()的时候,程序是否执行了整个图

1
2
3
4
5
6
7
8
9
10
11
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one)
update = tf.assign(state, new_val) #返回tensor, 值为new_val
update2 = tf.assign(state, 10000)  #没有fetch,便没有执行
init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    for _ in range(3):
        print sess.run(update)

和上个程序差不多,但我们这次仅仅是fetch “update”,输出是1.0 , 2.0, 3.0,可以看出,tensorflow并没有计算整个图,只是计算了与想要fetch 的值相关的部分

sess.run() 中的feed_dict

我们都知道feed_dict的作用是给使用placeholder创建出来的tensor赋值。其实,他的作用更加广泛:feed 使用一个 值(不能是tensor,可以是tensor.eval())临时替换一个 op 的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失.

1
2
3
4
5
y = tf.Variable(1)
with tf.Session() as sess:
    tf.initialize_all_variables().run()
    print sess.run(y,feed_dict={y:3}) #使用3 替换掉tf.Variable(1)的输出结果,所以打印出来3
    print sess.run(y)  #由于feed只在调用他的方法范围内有效,所以这个打印的结果是 1
<think>好的,我现在需要帮助用户解决如何修改TensorFlow中的sess.run相关代码,特别是关于global_variables_initializer和train_init_op的问题。首先,我需要回顾用户提供的引用内容,确保回答准确。 用户提到了引用[1]、[3]和[4],这些引用都涉及将旧的初始化方法替换为tf.global_variables_initializer。用户可能在使用旧版本的TensorFlow代码,需要升级到新版本,但遇到了sess.run的问题。例如,旧的tf.initialize_all_variables已经被弃用,必须替换为新方法。 接下来,我需要整理修改步骤。首先,初始化变量的部分,旧的代码可能使用了tf.initialize_all_variables(),需要改为tf.global_variables_initializer(),并将返回的初始化操作在会话中运行。例如,像引用[1]中的示例代码那样,创建init_op并运行sess.run(init_op)。 然后,关于sess.run本身的修改,用户可能在运行train_op或其他操作时遇到了问题。比如,在引用[4]中的错误代码,可能在升级后需要确保所有变量已经正确初始化。可能需要检查是否有未初始化的变量,或者是否正确处理了初始化操作和训练操作的关系。例如,是否在运行训练操作之前先运行了初始化操作。 另外,用户提到了train_init_op,这可能是指训练过程中的初始化操作,比如在每轮训练前重新初始化某些局部变量或数据。这时候需要区分全局变量初始化和局部初始化。如果用户使用了tf.local_variables_initializer(),那么需要将全局和局部初始化结合起来,使用tf.group或者分别运行两个初始化操作。 同时,还需要注意TensorFlow的会话创建方式。引用[2]提到使用InteractiveSession,这可能影响sess.run的使用方式。需要确认用户是否正确地创建了会话,并在其中运行初始化操作。 可能的错误点包括:未正确替换初始化方法,未在正确的位置运行初始化操作,或者在运行多个操作时顺序不对。例如,在引用[4]的错误示例中,可能在运行train_op之前没有正确初始化变量,或者merged_summary_op需要依赖已初始化的变量。 总结步骤应该是: 1. 替换初始化方法为tf.global_variables_initializer。 2. 确保在会话中首先运行初始化操作。 3. 检查是否需要局部变量的初始化,结合使用local_variables_initializer。 4. 调整sess.run的调用顺序,确保初始化后再运行训练操作。 同时,需要向用户解释每个步骤的原因,比如为什么旧方法被弃用,新方法的作用是什么,以及如何正确组织代码结构。此外,提供示例代码会帮助用户更好地理解修改方法,比如展示修改前后的代码对比。 最后,生成相关问题需要考虑用户可能遇到的后续问题,比如初始化不彻底、变量作用域的问题,或者如何在分布式环境中处理初始化等。这样可以帮助用户深入理解并解决其他潜在的问题。</think>### TensorFlow中`sess.run`相关代码修改方法 #### 一、`global_variables_initializer`的修改 1. **替换初始化方法** TensorFlow 1.x版本中,旧方法`tf.initialize_all_variables()`已弃用,需替换为`tf.global_variables_initializer()`。新方法功能相同,但符合API命名规范[^1][^3]。 **旧代码示例**: ```python init_op = tf.initialize_all_variables() ``` **修改后代码**: ```python init_op = tf.global_variables_initializer() ``` 2. **初始化操作执行顺序** 在会话中需先运行全局变量初始化操作,再执行其他计算: ```python with tf.Session() as sess: sess.run(init_op) # 优先初始化全局变量 sess.run(train_op) # 再执行训练操作 ``` #### 二、`train_init_op`的调整 若涉及训练时局部变量(如动态更新的临时变量),需结合`tf.local_variables_initializer()`: ```python init_op = tf.group( tf.global_variables_initializer(), tf.local_variables_initializer() ) with tf.Session() as sess: sess.run(init_op) # 后续训练循环中使用 train_init_op ``` #### 三、`sess.run`的常见问题修复 1. **多操作并行执行** 若需同时获取多个操作的输出(如训练和日志记录),需将操作合并到同一`run`调用: ```python _, summary = sess.run([train_op, merged_summary_op], feed_dict=feed_data) ``` 此写法避免多次调用`run`导致计算图重复执行[^4]。 2. **占位符与变量依赖** 确保`feed_dict`中所有占位符(如学习率`lr`、输入数据`X`)均已正确传入: ```python feed_dict = { model.X: batch_xs, model.lr: learning_rate, model.phase: 1 # 示例中的训练模式标识 } ``` #### 四、完整示例代码 ```python import tensorflow as tf # 定义模型(示例:简单线性回归) X = tf.placeholder(tf.float32, shape=[None, 1]) W = tf.Variable(tf.random_normal([1, 1])) b = tf.Variable(tf.zeros([1])) y_pred = tf.matmul(X, W) + b # 定义损失函数和优化器 y_true = tf.placeholder(tf.float32, [None, 1]) loss = tf.reduce_mean(tf.square(y_pred - y_true)) optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01) train_op = optimizer.minimize(loss) # 初始化操作 init_op = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init_op) # 初始化所有全局变量 # 训练循环 for epoch in range(100): batch_x, batch_y = load_batch_data() # 假设数据加载函数 sess.run(train_op, feed_dict={X: batch_x, y_true: batch_y}) ``` #### 五、常见错误排查 - **错误提示`Attempting to use uninitialized value`**: 检查是否漏掉`tf.global_variables_initializer()`的执行,或变量未正确加入计算图。 - **版本兼容性问题**: 若从TensorFlow 1.x迁移到2.x,需注意`tf.Session`已被移除,需改用`tf.function`和即时执行模式。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值