原因:
目前在學(xué)習(xí)階段,看到網(wǎng)上的資料使用的是tf1的代碼,我使用的是tf2的,所以需要直接將tf1轉(zhuǎn)換為tf2代碼以適應(yīng)tf2的開(kāi)發(fā)方式
遇到的情景:
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中,默認(rèn)開(kāi)啟了Eager Execution環(huán)境,不需要定義圖,也不需要使用Session,直接運(yùn)行,就可以得到結(jié)果。
Eager Execution 是用于研究和實(shí)驗(yàn)的靈活機(jī)器學(xué)習(xí)平臺(tái),具備以下特性:
- 直觀的界面 - 自然地組織代碼結(jié)構(gòu)并使用 Python 數(shù)據(jù)結(jié)構(gòu)??焖俚∧P秃托?shù)據(jù)。
- 更方便的調(diào)試功能 - 直接調(diào)用運(yùn)算以檢查正在運(yùn)行的模型并測(cè)試更改。使用標(biāo)準(zhǔn) Python 調(diào)試工具立即報(bào)告錯(cuò)誤。
- 自然的控制流 - 使用 Python 而非計(jì)算圖控制流,簡(jiǎn)化了動(dòng)態(tài)模型的規(guī)范。
Eager Execution 支持大部分 TensorFlow 運(yùn)算和 GPU 加速。
轉(zhuǎn)換后
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中,這是為將來(lái)需要計(jì)算的數(shù)據(jù)預(yù)留位置的。在session中執(zhí)行sigmoid時(shí)將數(shù)據(jù)傳入
tf2中直接計(jì)算即可:
print(tf.sigmoid(a)) # a需要是 bfloat16, half, float, double, complex64, complex128 格式的
3. tf.contrib.layers.xavier_initializer
此函數(shù)用于生成層中梯度值接近的隨機(jī)數(shù)
在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,并且您不應(yīng)直接調(diào)用它。要將使用 Graph 相關(guān)函數(shù)的代碼遷移到 TF2,請(qǐng)?jiān)跊](méi)有它們的情況下重寫代碼。有關(guān)Tensorflow 1 和 Tensorflow 2 之間的行為和語(yǔ)義變化的更多描述,請(qǐng)參閱 遷移指南。
在tf1中,reset_default_graph實(shí)際效果可以參考【TensorFlow】tf.reset_default_graph()函數(shù)-duanlianvip
在tf2中不存在這個(gè)問(wèn)題
5. tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
tf1中如下(這些代碼將在一個(gè)session中運(yùn)行):
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
使用tf2(直接運(yùn)行):
with tf.GradientTape() as tape:
optimizer = tf.keras.optimizers.Adam(learning_rate=learning_rate)
_ = optimizer.minimize(cost, var_list=parameters, tape=tape)