系列教程:如何將代碼遷移至 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.reverse
tf.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.round
tf.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 | 人工智能 | 机器学习 |