系列教程:如何將代碼遷移至 TensorFlow 1.0
本文出自 掘金翻譯計劃 正在組織翻譯的 TensorFlow 官方文檔。如果您有興趣,歡迎 申請成為譯者,學習完譯者教程後,參與到文章和文檔的翻譯和及對當中。我們也正在招募 TensorFlow 譯者,歡迎積极參加。
TensorFlow 1.0 中 API 的改動不再完全向後兼容。因此,運行於 TensorFlow 0.n 版本的 TensorFlow 應用可能不能在 TensorFlow 1.0 版本中正常運行。在此版本中,我們對 API 進行了一些修改,確保了其內部一致性;在接下來的整個 1.N 版本周期中都不會進行任何斷代式變更。
本指南將引導您了解新版 API 的主要變更,以及如何將您的程序自動升級至 TensorFlow 1.0。除了幫助您完成程序的修改之外,本指南也解釋了我們為何要做出這些變更。
如何升級
如果您希望自動將代碼遷移至 1.0 版本,可以嘗試使用我們的 tf_upgrade.py 腳本。此腳本能處理大多數情況,但有時還是需要您進行手動修改。 您可以在我們的 GitHub 中獲取此腳本。
如要將單個的 0.n 版 TensorFlow 源文件轉換為 1.0 版本,請輸入如下格式的命令:
$ python tf_upgrade.py --infile InputFile --outfile OutputFilen
例如,以下命令會將一個名為 test.py 的 0.n 版 TensorFlow 程序轉換為名為 test_1.0.py 的 1.0 版 TensorFlow 程序:
$ python tf_upgrade.py --infile test.py --outfile test_1.0.pyn
tf_upgrade.py 腳本還會生成一個名為 report.txt 的文件,記錄了其在升級過程中做的所有修改,並給出了一些可能需要您手動修改的建議。
如要將整個目錄的 0.n 版 TensorFlow 程序升級為 1.0 版本,請輸入如下格式的命令:
$ python tf_upgrade.py --intree InputDir --outtree OutputDirn
例如,以下命令會將 /home/user/cool 中的所有 0.n 版 TensorFlow 程序轉換為 1.0 版並放入新建的 /home/user/cool_1.0 目錄中:
$ python tf_upgrade.py --intree /home/user/cool --outtree /home/user/cool_1.0n
限制
在使用腳本進行升級時,有幾點注意事項。尤其是:
- 你需要手動修復所有
tf.reverse()實例。tf_upgrade.py腳本也會在屏幕輸出以及report.txt文件中警告您關於tf.reverse()的信息。 - 如果遇上一些需要重排序的參數,
tf_upgrade.py將會試著最小化地格式化您的代碼,但不能自動地改變實際的參數順序。因此tf_upgrade.py將使用關鍵字參數,讓函數參數與順序無關。 tf.get_variable_scope().reuse_variables()之類的構造器將失效。我們建議刪除它們用以下方法代替:
with tf.variable_scope(tf.get_variable_scope(), reuse=True):
...- 與
tf.pack和tf.unpack類似,我們將TensorArray.pack以及TensorArray.unpack重命名為TensorArray.stack和TensorArray.unstack。但是,TensorArray.pack和TensorArray.unpack並不直接關聯tf命名空間,因而無法通過詞法直接檢測出來,例如foo = tf.TensorArray(); foo.unpack()。因此需要手動修改它們。
手動升級您的代碼
您也可以不使用 tf_upgrade.py,手動升級代碼。本文檔剩餘部分提供了完整的 TensorFlow 1.0 非向後兼容變更列表。
變數(Variables)
現在 Variable 函數更具一致性,減少了誤解。
tf.VARIABLES- 需要重命名為
tf.GLOBAL_VARIABLES
tf.all_variables- 需要重命名為
tf.global_variables
tf.initialize_all_variables- 需要重命名為
tf.global_variables_initializer
tf.initialize_local_variables- 需要重命名為
tf.local_variables_initializer
tf.initialize_variables- 需要重命名為
tf.variables_initializer
聚合函數
現在所有的聚合函數(Summary function)都被統一放置於 tf.summary 命名空間中。
tf.audio_summary- 需要重命名為
tf.summary.audio
tf.contrib.deprecated.histogram_summary- 需要重命名為
tf.summary.histogram
tf.contrib.deprecated.scalar_summary- 需要重命名為
tf.summary.scalar
tf.histogram_summary- 需要重命名為
tf.summary.histogram
tf.image_summary- 需要重命名為
tf.summary.image
tf.merge_all_summaries- 需要重命名為
tf.summary.merge_all
tf.merge_summary- 需要重命名為
tf.summary.merge
tf.scalar_summary- 需要重命名為
tf.summary.scalar
tf.train.SummaryWriter- 需要重命名為
tf.summary.FileWriter
數值差異
整數除法以及 tf.floordiv 將使用向下取整(floor)語義。這樣就能使 np.divide 和 np.mod 的結果與 tf.divide 和 tf.mod 的結果保持一致。另外,我們修改了 tf.round 使用的取整演算法,使其與 NumPy 保持一致。
tf.div- 除法
tf.divide的語義現在已經修改與 Python 語義保持一致,即 Python 3 中的/符號以及 Python 2 future 模塊的 division 將始終得到浮點數、//將進行求整除法。此外,tf.div將只進行求整除法。如需使用 C 語言強制截斷風格的除法運算,可以使用tf.truncatediv。 - 請盡量將你的代碼
tf.div改為tf.divide,它將遵循 Python 的語義。
tf.mod- 求余
tf.mod的語義現在已經修改與 Python 語義保持一致。另外,對於整數的運算將使用向下取整(floor)語義。如需使用 C 語言強制截斷風格的求余運算,可以使用tf.truncatemod。
新版和舊版的除法操作對比總結如下表所示:
表達式TF 0.11 (py2)TF 0.11 (py3)TF 1.0 (py2)TF 1.0 (py3)tf.div(3,4)0000tf.div(-3,4)00-1-1tf.mod(-3,4)-3-311-3/40-0.75-1-0.75-3/4tf.divide(-3,4)N/AN/A-0.75-1
新版和舊版的取整操作對比總結如下表所示:
輸入PythonNumPyC++ round()TensorFlow 0.11(floor(x+.5))TensorFlow 1.0-3.5-4-4-4-3-4-2.5-2-2-3-2-2-1.5-2-2-2-1-2-0.500-1000.5001101.5222222.5223323.544444
匹配 NumPy 命名
新版本對許多函數進行了重命名以匹配 NumPy。這麼做旨在使得 NumPy 與 TensorFlow 之間的轉換盡量簡便。雖然我們已經排除了一些常見的不一致情況,但現在還有一些函數未能完全匹配。
tf.inv- 需要重命名為
tf.reciprocal - 這麼做是為了防止其與 NumPy 的矩陣求逆函數
np.inv混淆
tf.list_diff- 需要重命名為
tf.setdiff1d
tf.listdiff- 需要重命名為
tf.setdiff1d
tf.mul- 需要重命名為
tf.multiply
tf.neg- 需要重命名為
tf.negative
tf.select- 需要重命名為
tf.where tf.where現在與np.where一樣,需要傳入 3 個或 1 個參數
tf.sub- 需要重命名為
tf.subtract
匹配 NumPy 參數
一些 TensorFlow 1.0 方法的參數現在與 NumPy 的方法相匹配了。為了實現這一點,TensorFlow 1.0 對一些關鍵字參數進行了修改,並對一些參數進行了重排序。需要注意的是,TensorFlow 1.0 現在不再使用 dimension 而轉為使用 axis。TensorFlow 1.0 在修改張量的操作中將保持張量參數始終在第一位。(參見 tf.concat 的改動)。
tf.argmax- 關鍵字參數
dimension需要重命名為axis
tf.argmin- 關鍵字參數
dimension需要重命名為axis
tf.concat- 關鍵字參數
concat_dim需要重命名為axis - 輸入參數重排序為
tf.concat(values, axis, name=concat).
tf.count_nonzero- 關鍵字參數
reduction_indices需要重命名為axis
tf.expand_dims- 關鍵字參數
dim需要重命名為axis
tf.reduce_all- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_any- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_join- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_logsumexp- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_max- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_mean- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_min- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_prod- 關鍵字參數
reduction_indices需要重命名為axis
tf.reduce_sum- 關鍵字參數
reduction_indices需要重命名為axis
tf.reversetf.reverse之前需要傳入 1 維bool型張量用以控制維度的順序調換,現在使用一組軸的索引進行控制。- 例如
tf.reverse(a, [True, False, True])現在需改為tf.reverse(a, [0, 2])
tf.reverse_sequence- 關鍵字參數
batch_dim需要重命名為batch_axis - 關鍵字參數
seq_dim需要重命名為seq_axis
tf.sparse_concat- 關鍵字參數
concat_dim需要重命名為axis
tf.sparse_reduce_sum- 關鍵字參數
reduction_axes需要重命名為axis
tf.sparse_reduce_sum_sparse- 關鍵字參數
reduction_axes需要重命名為axis
tf.sparse_split- 關鍵字參數
split_dim需要重命名為axis - 輸入參數重排序為
tf.sparse_split(keyword_required=KeywordRequired(), sp_input=None, num_split=None, axis=None, name=None, split_dim=None).
tf.split- 關鍵字參數
split_dim需要重命名為axis - 關鍵字參數
num_split需要重命名為num_or_size_splits - 輸入參數重排序為
tf.split(value, num_or_size_splits, axis=0, num=None, name=split).
tf.squeeze- 關鍵字參數
squeeze_dims需要重命名為axis
tf.svd- 輸入參數重排序為
tf.svd(tensor, full_matrices=False, compute_uv=True, name=None).
簡化數學變換
批量版數學運算操作已被移除。現在非批量版的函數已經包含了批量運算的功能。例如,tf.complex_abs 的功能已遷移至 tf.abs
tf.batch_band_part- 需要重命名為
tf.band_part
tf.batch_cholesky- 需要重命名為
tf.cholesky
tf.batch_cholesky_solve- 需要重命名為
tf.cholesky_solve
tf.batch_fft- 需要重命名為
tf.fft
tf.batch_fft3d- 需要重命名為
tf.fft3d
tf.batch_ifft- 需要重命名為
tf.ifft
tf.batch_ifft2d- 需要重命名為
tf.ifft2d
tf.batch_ifft3d- 需要重命名為
tf.ifft3d
tf.batch_matmul- 需要重命名為
tf.matmul
tf.batch_matrix_determinant- 需要重命名為
tf.matrix_determinant
tf.batch_matrix_diag- 需要重命名為
tf.matrix_diag
tf.batch_matrix_inverse- 需要重命名為
tf.matrix_inverse
tf.batch_matrix_solve- 需要重命名為
tf.matrix_solve
tf.batch_matrix_solve_ls- 需要重命名為
tf.matrix_solve_ls
tf.batch_matrix_transpose- 需要重命名為
tf.matrix_transpose
tf.batch_matrix_triangular_solve- 需要重命名為
tf.matrix_triangular_solve
tf.batch_self_adjoint_eig- 需要重命名為
tf.self_adjoint_eig
tf.batch_self_adjoint_eigvals- 需要重命名為
tf.self_adjoint_eigvals
tf.batch_set_diag- 需要重命名為
tf.set_diag
tf.batch_svd- 需要重命名為
tf.svd
tf.complex_abs- 需要重命名為
tf.abs
其它改動
除上文所述的改動外,還有以下一些變化:
tf.image.per_image_whitening- 需要重命名為
tf.image.per_image_standardization
tf.nn.sigmoid_cross_entropy_with_logits- 輸入參數重排序為
tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None).
tf.nn.softmax_cross_entropy_with_logits- 輸入參數重排序為
tf.nn.softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, dim=-1, name=None).
tf.nn.sparse_softmax_cross_entropy_with_logits- 輸入參數重排序為
tf.nn.sparse_softmax_cross_entropy_with_logits(_sentinel=None, labels=None, logits=None, name=None).
tf.ones_initializer- 需要修改成函數調用,例如
tf.ones_initializer()
tf.pack- 需要重命名為
tf.stack
tf.roundtf.round的語義現在與銀行家舍入法(Bankers rounding)相同。
tf.unpack- 需要重命名為
tf.unstack
tf.zeros_initializer- 需要修改成函數調用,例如
tf.zeros_initializer()
掘金翻譯計劃 是一個翻譯優質互聯網技術文章的社區,文章來源為 掘金 上的英文分享文章。內容覆蓋 Android、iOS、前端、後端、區塊鏈、產品、設計、人工智慧等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃、官方微博、知乎專欄。
推薦閱讀:
※卷積神經網路模型(2)-AlexNet解讀
※深度學習框架TensorFlow學習筆記(1)
※Google開源模塊化多任務訓練庫Tensor2Tensor
※在Docker中部署使用Tensorflow && Docker基本用法介紹
TAG:TensorFlow | 人工智能 | 机器学习 |
