Tensorflow使用(一)—— Session,placeholder,以及新旧版本的配置

本文分享了使用TensorFlow 1.0版本进行强化学习的经验,介绍了如何在新版本中兼容旧版函数,如使用Session进行变量初始化和运行,以及通过placeholder传递外部数据。还探讨了tf.assign、tf.get_variable等关键函数的用法。

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

关于Tensorflow

说实话这到底是个啥我还没明白(明白了再删这句话)。

也并不准备了解的多么详细,还是老办法,只看看用过的用到的,其他那些慢慢来,又不是准备考试,也没必要一口吃成大胖子。

不废话了。

因为是在学强化学习的过程中使用到了tensorflow,所以找到的代码是movan几年前提供的,他用的tensorflow版本是1.0大概。虽然现在2020年已经更新到了2.0版本,但是为了方便,又考虑到自己是个菜鸡, 就先看1.0版本吧,2.0里做的那些改动等日后若是需要进阶学习 tf 再了解也不迟。
所以导入的时候使用

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

这样,就可以继续使用1.0中的一些函数。第二句的作用是屏蔽一些紧急操作而出现的错误,比如在调用placeholder的时候,如果没有这一句,依然会因为eager execution而出错。(感谢大佬们的细致研究,佩服佩服,啥都会处理)
附一个大佬链接 https://blog.youkuaiyun.com/qq_39777550/article/details/104224296

一些用过的函数

Session

小助教说,可以把session看成是一张白纸,可以在上面写东西。

在tf中,必须先定义变量,并且必须进行 initialize变量,通过下面给出的方法(直接run(initializer) 或者 定义init函数之后run(init))

tf.assign(a, b) 是将b的值赋给a,然后返回的值是a赋值之后的值。

在tf的变量中,要想进行print或者赋值assign等一系列操作,在定义这些操作的时候是并没有执行的,只有在sess.run()这些操作才是真正的执行。也就是说,所有的操作都要通过sess.run()来执行。

import tensorflow as tf

state = tf.Variable(0)  #这时变量state赋予初始值0
one = tf.constant(1)    #one赋值常量1
update = tf.assign(state, one)

init = tf.global_variables_initializer()  #变量初始化的函数

with tf.Session() as sess:
	sess.run(init)  #必须先初始化所有变量,并且要以这种方式
	# 也可以
	# sess.run(tf.global_variables_initializer())
	print(sess.run(update))  # 通过这种方式打印结果
	

还有,小助教给的创建变量的方法是这样的,使用的是tf.get_variable() 函数:

var_init_value = [[2.0, 4.0, 6.0]]
var = tf.get_variavle( name = 'myvar',
		       shape = [1, 3],
		       dtype = tf.float32,
		       initializer = tf.constant_initializer(var_init_value)
		     )
print(var)

别忘了变量需要 initializer 激活!

placeholder

这个函数在新版本中被移除了,但是movan的代码里就是靠这个函数在运作。且不管这么多了。

placeholder是tf中的占位符,暂时储存变量。Tensorflow如果想要从外部传入data,就要用到 tf.placeholder() ,然后进行下面操作:

#需要定义placeholder的type,一般是float32
input1 = tf.placeholder(dtype = tf.float32, shape = [None], name = "a_placeholder") 
input2 = tf.placeholder(dtype = tf.float32, shape = [None], name = "b_placeholder")

output = tf.multiply(input1, input2)

# 需要传入的值放在feed_dict中,并且一一对应
with tf.Session() as sess:
	print(sess.run(output, feed_dict = {input1 : [7.], input2 : [2.]}))
	# 结果是14

还要注意的是,tf的运算非常高级,当你进行矩阵的运算,就算两个相运算的矩阵维度不一样,他也会自动匹配成一样的矩阵。虽然可以利用这种性质(叫做broadcasting),但是在当你无意识犯错的时候,他是不会报错的……一定小心。

Tips

  • 可以用 tf.global_variables() 打印出所有的变量,以检查自己在优化的变量是哪些,有没有错误。
  • 可以用help(tf.reduce_mean) 来看看这个函数的用法。
<think>嗯,用户问的是如何在较高版本TensorFlow中兼容低版本Session方法。我记得TensorFlow 2.x之后移除了默认的Session,改用即时执行(Eager Execution)。这可能会导致旧代码在升级后出现错误。我需要先确认版本变化带来的具体差异。 首先,用户可能需要运行旧版的代码,比如使用tf.Session.run()的地方。在TF2中,直接使用Session会报错,所以需要找到替代方法。可能的解决方法包括启用兼容模式,或者修改代码结构。 我记得TensorFlow 2.x有个兼容模块,叫做tf.compat.v1,可以保留些1.x的API。比如,可以通过导入disable_eager_execution来禁用即时执行,恢复Session的行为。不过这样做可能会牺牲些TF2的新特性。 另外,用户可能不想大规模修改原有代码,所以使用tf_upgrade_v2工具来自动转换代码也是个办法。不过自动转换可能不完美,需要手动调整。 还有种情况是混合使用高低版本的代码。比如在TF2中,仍然可以通过tf.compat.v1.Session()来创建Session,但需要注意变量初始化的方式可能不同,比如使用global_variables_initializer()。 另外,可能用户的需求是部分迁移,逐步替换Session为函数式写法。比如将计算图代码改为使用tf.function装饰器,利用AutoGraph特性。这需要定的代码重构,但长远来看更符合TF2的设计理念。 需要提醒用户注意,虽然兼容方法可行,但最好还是逐步迁移到新API,以充分利用TF2的性能优化和新功能。同时,检查是否有废弃的API被移除,确保所有使用的函数在兼容模式下仍然有效。 总结可能的步骤:1.使用tf.compat.v1模块;2.禁用Eager Execution;3.利用转换工具;4.逐步重构代码。需要给出具体的代码示例,比如如何导入兼容模块,创建Session,运行计算等。同时要指出潜在的问题,比如某些API可能不再支持,或者性能差异。</think>在 TensorFlow 2.x 中兼容低版本 Session 的步骤如下: $\boxed{\text{解决方案分步说明}}$ 1. **启用兼容模式** ```python import tensorflow.compat.v1 as tf tf.disable_eager_execution() # 关闭即时执行模式 ``` 2. **显式创建会话** ```python # 保持原有代码结构 x = tf.constant(5) y = tf.constant(3) z = x + y with tf.Session() as sess: # 通过 tf.compat.v1 调用 print(sess.run(z)) # 输出 8 ``` 3. **处理变量初始化** ```python # 旧版代码需要显式初始化 init = tf.global_variables_initializer() # 注意是 tf.compat.v1 下的方法 with tf.Session() as sess: sess.run(init) # 其他操作... ``` 4. **混合使用新旧 API(过渡方案)** ```python import tensorflow as tf from tensorflow.compat.v1 import Session # 选择性导入 @tf.function # 新版本装饰器 def new_api_method(): # 使用即时执行特性 ... def legacy_code(): with Session() as sess: # 旧版会话 # 原有计算图逻辑 ... ``` $\boxed{\text{注意事项}}$ - 使用 `tf_upgrade_v2` 工具自动转换脚本 ```shell tf_upgrade_v2 --infile=old_script.py --outfile=new_script.py ``` - 逐步替换弃用 API(如 `tf.placeholder` 改为 `tf.compat.v1.placeholder`) - 检查 `tf.contrib` 模块的替代方案(该模块已在 TF2 中移除) $\boxed{\text{完整示例}}$ ```python import tensorflow.compat.v1 as tf tf.disable_eager_execution() # 构建计算图 a = tf.placeholder(tf.float32, name="input_a") b = tf.placeholder(tf.float32, name="input_b") c = tf.add(a, b, name="output_c") with tf.Session() as sess: sess.run(tf.global_variables_initializer()) result = sess.run(c, feed_dict={a: 3.0, b: 4.5}) print(result) # 输出 7.5 ``` 建议最终迁移到 TF2 原生模式,使用 `@tf.function` 替代 Session: ```python @tf.function def add_fn(a, b): return a + b print(add_fn(tf.constant(3.0), tf.constant(4.5))) # 输出 7.5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值