iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 29
0

最近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樣式的功能。

使代碼2.0原生化

本指南將介紹將TensorFlow 1.x代碼轉換為TensorFlow 2.0的幾個示例。這些更改將使您的代碼利用性能優化和簡化的API調用。
在每一種情況下,模式是:

  1. 替換tf.Session.run調用
    每個tf.Session.run調用都應該被Python函數替換。

feed_dict和`tf.placeholder’成為函數參數。
fetches成為函數的返回值。
您可以使用標準Python工具(如pdb)逐步調試和調試函數

如果您對它的工作感到滿意,可以添加一個tf.function裝飾器,使其在圖形模式下高效運行。有關其工作原理的更多信息,請參閱Autograph Guide。

  1. 使用Python對象來跟蹤變量和損失
    使用tf.Variable而不是tf.get_variable。
    每個variable_scope都可以轉換為Python對象。通常這將是以下之一:
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符號隱式使用全局集合。

  1. 升級您的訓練循環
    使用適用於您的用例的最高級API。首選tf.keras.Model.fit構建自己的訓練循環。

如果您編寫自己的訓練循環,這些高級函數可以管理很多可能容易遺漏的低級細節。例如,它們會自動收集正則化損失,並在調用模型時設置training = True參數。

  1. 升級數據輸入管道
    使用tf.data數據集進行數據輸入。這些對象是高效的,富有表現力的,並且與張量流很好地集成。

它們可以直接傳遞給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來定義和重用變量的層函數。


上一篇
數據集
下一篇
機器學習資源
系列文
30天鍊成機器學習30

尚未有邦友留言

立即登入留言