最近Google已經正式發佈TensorFlow 2.0,雖然我們仍然可以運行未經修改的1.x代碼(contrib除外):
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
但是,這並不能讓你利用TensorFlow2.0中的許多改進。很多開源的機器學習Model仍是tensorflow<1.14的版本,所以讓我們來學習一下怎麼將Tensorflow model遷移到2.0吧。
第一步是嘗試運行升級腳本.
這將在將您的代碼升級到TensorFlow 2.0時執行初始步驟。但是它不能使您的代碼適合TensorFlowF 2.0。您的代碼仍然可以使用tf.compat.v1 接口來訪問占位符,會話,集合和其他1.x樣式的功能。
本指南將介紹將TensorFlow 1.x代碼轉換為TensorFlow 2.0的幾個示例。這些更改將使您的代碼利用性能優化和簡化的API調用。
在每一種情況下,模式是:
feed_dict和`tf.placeholder’成為函數參數。
fetches成為函數的返回值。
您可以使用標準Python工具(如pdb)逐步調試和調試函數
如果您對它的工作感到滿意,可以添加一個tf.function裝飾器,使其在圖形模式下高效運行。有關其工作原理的更多信息,請參閱Autograph Guide。
tf.keras.layers.Layer
tf.keras.Model
tf.Module
如果需要聚合變量列表(如 tf.Graph.get_collection(tf.GraphKeys.VARIABLES) ),請使用Layer和Model對象的.variables和.trainable_variables屬性。
這些Layer和Model類實現了幾個不需要全局集合的其他屬性。他們的.losses屬性可以替代使用tf.GraphKeys.LOSSES集合。
有關詳細信息,請參閱keras指南。
警告:許多tf.compat.v1符號隱式使用全局集合。
如果您編寫自己的訓練循環,這些高級函數可以管理很多可能容易遺漏的低級細節。例如,它們會自動收集正則化損失,並在調用模型時設置training = True參數。
它們可以直接傳遞給tf.keras.Model.fit方法。
model.fit(dataset, epochs=5)
1
它們可以直接在標準Python上叠代:
for example_batch, label_batch in dataset:
break
轉換模型
設置
from __future__ import absolute_import, division, print_function, unicode_literals
import tensorflow as tf
import tensorflow_datasets as tfds
低階變量和操作執行
低級API使用的示例包括:
使用變量範圍來控制重用
用tf.get_variable創建變量。
顯式訪問集合
使用以下方法隱式訪問集合:
tf.global_variables
tf.losses.get_regularization_loss
使用tf.placeholder設置圖輸入
用session.run執行圖形
手動初始化變量
轉換前
以下是使用TensorFlow 1.x在代碼中看起來像這些模式的內容:
in_a = tf.placeholder(dtype=tf.float32, shape=(2))
in_b = tf.placeholder(dtype=tf.float32, shape=(2))
def forward(x):
with tf.variable_scope("matmul", reuse=tf.AUTO_REUSE):
W = tf.get_variable("W", initializer=tf.ones(shape=(2,2)),
regularizer=tf.contrib.layers.l2_regularizer(0.04))
b = tf.get_variable("b", initializer=tf.zeros(shape=(2)))
return W * x + b
out_a = forward(in_a)
out_b = forward(in_b)
reg_loss = tf.losses.get_regularization_loss(scope="matmul")
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
outs = sess.run([out_a, out_b, reg_loss],
feed_dict={in_a: [1, 0], in_b: [0, 1]})
轉換後
在轉換後的代碼中:
變量是本地Python對象.
forward函數仍定義計算。
sess.run調用被替換為對’forward`的調用
可以添加可選的tf.function裝飾器以提高性能。
正則化是手動計算的,不涉及任何全局集合。
沒有會話或占位符
W = tf.Variable(tf.ones(shape=(2,2)), name="W")
b = tf.Variable(tf.zeros(shape=(2)), name="b")
@tf.function
def forward(x):
return W * x + b
out_a = forward([1,0])
print(out_a)
out_b = forward([0,1])
regularizer = tf.keras.regularizers.l2(0.04)
reg_loss = regularizer(W)
基於tf.layers的模型
tf.layers模塊用於包含依賴於tf.variable_scope來定義和重用變量的層函數。