python中tf1代码到tf2代码的转换

原因:

目前在学习阶段,看到网上的资料使用的是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)

你可能感兴趣的:(python中tf1代码到tf2代码的转换)