TensorFlow 1.0中的API相對於之前版本有一些改變,不是全部向後兼容。也就是說,使用TensorFlow 0.n的TensorFlow程序不一定適用於TensorFlow 1.0。
本指南將引導您:了解API的主要更改以及如何自動升級到TensorFlow 1.0,並解釋為什麽我們做出這些更改。
如何升級
如果你想自動將你的代碼移植到1.0,你可以試試我們的tf_upgrade.py
腳本。雖然此腳本處理許多情況,但有時也需要手動更改。從這裏GitHub樹獲取上述腳本。
要將單個0.n TensorFlow源文件轉換為1.0,請輸入以下命令:
$ python tf_upgrade.py --infile InputFile --outfile OutputFile
例如,以下命令轉換名為test.py
的0.n TensorFlow程序到1.0 TensorFlow程序,並命名為test_1.0.py
:
$ python tf_upgrade.py --infile test.py --outfile test_1.0.py
該tf_upgrade.py
腳本還會生成一個名為report.txt
的文件,其中詳細介紹了所做的更改,並提出了可能需要手動進行更改的建議。
要將0.n TensorFlow程序的整個目錄升級到1.0,請輸入以下命令:
$ python tf_upgrade.py --intree InputDir --outtree OutputDir
例如,以下命令將轉換/home/user/cool
目錄中所有0.n TensorFlow程序轉為1.0版本:
$ python tf_upgrade.py --intree /home/user/cool --outtree /home/user/cool_1.0
限製
有幾件事要注意,特別是:
- 您必須手動修複任何
tf.reverse()
實例。該tf_upgrade.py
腳本會在stdout和在report.txt
文件輸出關於tf.reverse()
的警告。 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中所有向後不兼容更改的列表。
變量
變量函數已經變得更加一致,更不容易混淆。
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函數
Summary函數已經合並到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
現在使用flooring
語義。這是為了讓np.divide
和np.mod
跟tf.divide
和tf.mod
分別保持一致。另外我們改變了使用的舍入算法tf.round
,以便匹配NumPy。
-
tf.div
-
tf.divide
除法的語義已經完全改變為符合Python語義。也就是說,/
這個除法在Python 3中,以及Python 2的未來模式中,都會產生浮點數,而//
向下取整。例如:3.0 / 2 = 1.5 3.0 // 2 = 1.0
但是,即使
tf.div
將產生向下取整除法,要強製C-style截斷語義,您必須使用tf.truncatediv
。 -
可以考慮更改您的代碼以使用
tf.divide
,它遵循Python語義進行推廣。
-
-
tf.mod
tf.mod
的語義已經改變為匹配Python語義。如果您想要使用C-style截斷模式(餘數),可以使用tf.truncatemod
可以用這個表來總結除法的新舊行為:
EXPR | TF 0.11(py2) | TF 0.11(py3) | TF 1.0(py2) | TF 1.0(py3) |
---|---|---|---|---|
tf.div(3,4) | 0 | 0 | 0 | 0 |
tf.div(-3,4) | 0 | 0 | -1 | -1 |
tf.mod(-3,4) | -3 | -3 | 1 | 1 |
-3/4 | 0 | -0.75 | -1 | -0.75 |
-3 /4tf.divide(-3,4) | N /A | N /A | -0.75 | -1 |
四舍五入的新舊行為可以概括如下:
輸入 | Python | NumPy | C++ 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.5 | 0 | 0 | -1 | 0 | 0 |
0.5 | 0 | 0 | 1 | 1 | 0 |
1.5 | 2 | 2 | 2 | 2 | 2 |
2.5 | 2 | 2 | 3 | 3 | 2 |
3.5 | 4 | 4 | 4 | 4 | 4 |
匹配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
現在有3個參數或1個參數,就像np.where
- 應該改名
tf.sub
- 應該改名
tf.subtract
- 應該改名
匹配NumPy參數
某些TensorFlow 1.0方法的參數現在可以匹配某些NumPy方法中的參數。為了實現這一點,TensorFlow 1.0已經改變了關鍵字參數並重新排序了一些參數。值得注意的是,TensorFlow 1.0現在使用axis
而不是dimension
。 TensorFlow 1.0在修改Tensors的操作中會保持tensor參數排在前麵。 (見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
之前使用1D的bool
張量來控製哪些維度被reverse。現在我們使用axis索引的張量。- 例如
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
的語義現在是四舍五入。
tf.unpack
- 應該改名
tf.unstack
- 應該改名
tf.zeros_initializer
- 應該改為函數調用,即
tf.zeros_initializer()
- 應該改為函數調用,即