原因:
目前在学习阶段,看到网上的资料使用的是tf1的代码,我使用的是tf2的,所以需要直接将tf1转换为tf2代码以适应tf2的开发方式
遇到的情景:
1. 使用Session 的情景:
y = tf.constant(3, name='y_hat'); y_hat = tf.constant(5, name='y')
init = tf.global_variables_initializer()
loss = tf.Variable((y - y_hat)**2, name='loss')
with tf.Session() as session:
session.run(init)
print(session.run(loss))
在tf2中,默认开启了Eager Execution环境,不需要定义图,也不需要使用Session,直接运行,就可以得到结果。
Eager Execution 是用于研究和实验的灵活机器学习平台,具备以下特性:
- 直观的界面 - 自然地组织代码结构并使用 Python 数据结构。快速迭代小模型和小数据。
- 更方便的调试功能 - 直接调用运算以检查正在运行的模型并测试更改。使用标准 Python 调试工具立即报告错误。
- 自然的控制流 - 使用 Python 而非计算图控制流,简化了动态模型的规范。
Eager Execution 支持大部分 TensorFlow 运算和 GPU 加速。
转换后
y_hat = tf.constant(3, name='y_hat');y = tf.constant(5, name='y')
loss = (y_hat - y)**2
print(loss)
2. placeholder
a = tf.placeholder(tf.float32, name="a")
sigmoid = tf.sigmoid(a)
在tf1中,这是为将来需要计算的数据预留位置的。在session中执行sigmoid时将数据传入
tf2中直接计算即可:
print(tf.sigmoid(a)) # a需要是 bfloat16, half, float, double, complex64, complex128 格式的
3. tf.contrib.layers.xavier_initializer
此函数用于生成层中梯度值接近的随机数
在tf2中,可以使用tf.initializers.GlorotUniform替代,例如:
gu = tf.initializers.GlorotUniform()
W1 = tf.Variable(name='W1', initial_value=gu(shape=[25, 12288]))
4. reset_default_graph
reset_default_graph
不适用于 Eager Execution 或tf.function
,并且您不应直接调用它。要将使用 Graph 相关函数的代码迁移到 TF2,请在没有它们的情况下重写代码。有关Tensorflow 1 和 Tensorflow 2 之间的行为和语义变化的更多描述,请参阅 迁移指南。
在tf1中,reset_default_graph实际效果可以参考【TensorFlow】tf.reset_default_graph()函数-duanlianvip
在tf2中不存在这个问题
5. tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
tf1中如下(这些代码将在一个session中运行):
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
使用tf2(直接运行):
with tf.GradientTape() as tape:
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
_ = optimizer.minimize(cost, var_list=parameters, tape=tape)
网友评论