當前位置: 首頁>>技術教程>>正文


遷移到TensorFlow 1.0版本

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.packtf.unpack,我們重命名TensorArray.packTensorArray.unpackTensorArray.stackTensorArray.unstack。然而,由於TensorArray.packTensorArray.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.dividenp.modtf.dividetf.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()

參考資料

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3622.html,未經允許,請勿轉載。