文档章节

过渡到TensorFlow 1.0

片刻
 片刻
发布于 2017/06/12 20:14
字数 2181
阅读 101
收藏 0

 

 

原文链接 : https://www.tensorflow.org/install/migration

译文链接 : http://www.apache.wiki/pages/viewpage.action?pageId=10029601

贡献者 : 片刻 ApacheCN Apache中文网

TensorFlow 1.0中的API已经改变了不是全部向后兼容的方式。也就是说,使用TensorFlow 0.n的TensorFlow程序不一定适用于TensorFlow 1.0。我们已经对此API进行了更改,以确保内部一致的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  OutputFile

例如,以下命令将名为test.py“1.0 TensorFlow” 的0.n 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

例如,以下命令转换目录中的所有0.n TensorFlow程序,在/home/user/cool目录中创建它们的1.0个等效/home/user/cool_1.0项:

$ python tf_upgrade.py --intree /home/user/cool --outtree /home/user/cool_1.0

限制

有几件事要注意。特别:

  • 您必须手动修复任何实例tf.reverse()。该tf_upgrade.py脚本将发出警告,tf.reverse()在标准输出和在report.txt文件中。
  • 在重新排序的参数中,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.stackTensorArray.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

总结功能

摘要功能已在命名空间下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现在使用地板语义。这是为了使结果np.dividenp.mod一致,tf.divide并 tf.mod分别。另外我们改变了用于tf.round匹配NumPy 的舍入算法。

  • tf.div

    •  tf.divide划分的语义已经完全改变为符合Python语义。也就是说,/在Python 3中,Python 2中的未来分区模式将始终产生浮点数,//将产生分区。然而,甚至tf.div会产生地板整数除法。要强制使用C风格的截断语义,你必须使用tf.truncatediv

    • 考虑改变你要使用的代码tf.divide,它遵循Python语义进行升级。

  • tf.mod

    • 的语义tf.mod已更改为符合Python的语义。特别地,地板语义用于整数。如果您想要使用C型截断模式(余数),可以使用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的操作。(见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张量来控制哪些尺寸被扭转。现在我们使用轴索引的张量。
    • 例如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
    • 应该改为函数调用ie tf.ones_initializer()
  • tf.pack
    • 应该改名 tf.stack
  • tf.round
    • tf.round现在的语义符合银行家的四舍五入。
  • tf.unpack
    • 应该改名 tf.unstack
  • tf.zeros_initializer
    • 应该改为函数调用ie tf.zeros_initializer()

 

© 著作权归作者所有

片刻
粉丝 107
博文 269
码字总数 306754
作品 0
海淀
高级程序员
私信 提问
TensorFlow 2.0 的核心功能将是“Eager Execution”

TensorFlow 2.0 是谷歌开源机器学习框架的下一个主要版本,将于 2018 年末推出其首个测试版。TensorFlow 是 Google 对机器学习和数据科学领域的贡献,是快速开发神经网络的一般框架。 尽管 ...

达尔文
2018/08/22
4.2K
5
TensorFlow 1.0 发布,更快、更灵活、更方便开发

在Mountain View举办的首届年度TensorFlow开发者峰会上,Google 发布了 TensorFlow 1.0,保证了 Google 的机器学习库的API稳定性。 发布会视频:https://youtu.be/LqLyrl-agOw (请自行搬梯子...

两味真火
2017/02/16
7.6K
13
TensorFlow 2.0 Alpha 版来了!吴恩达配套课程同步上线

雷锋网 AI 科技评论按:3 月 7 日凌晨,谷歌 TensorFlow 开发者峰会(TensorFlow Dev Summit 2019)在美国加州举行。自今年 1 月份谷歌放出 TensorFlow 2.0 开发者预览版,开发者们如今终于迎...

丛末
03/07
0
0
TensorFlow 2.0将把Eager Execution变为默认执行模式,你该转向动态计算图了

机器之心报道,作者:邱陆陆。 8 月中旬,谷歌大脑成员 Martin Wicke 在一封公开邮件中宣布,新版本开源框架——TensorFlow 2.0 预览版将在年底之前正式发布。今日,在上海谷歌开发者大会上,...

机器之心
2018/09/21
0
0
除了 TensorFlow 1.0,TensorFlow 峰会还说了这些

Google 于中国北京时间2月16日凌晨2点在加利福尼亚州山景城举行了首届 TensorFlow Dev 峰会,在会上,Google 宣布正式发布 TensorFlow 1.0 版本。 TensorFlow 是谷歌在2015年发布的第二代开源...

王练
2017/02/16
2.7K
3

没有更多内容

加载失败,请刷新页面

加载更多

总结

一、设计模式 简单工厂:一个简单而且比较杂的工厂,可以创建任何对象给你 复杂工厂:先创建一种基础类型的工厂接口,然后各自集成实现这个接口,但是每个工厂都是这个基础类的扩展分类,spr...

BobwithB
42分钟前
4
0
java内存模型

前言 Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模...

ls_cherish
45分钟前
4
0
友元函数强制转换

友元函数强制转换 p522

天王盖地虎626
昨天
5
0
js中实现页面跳转(返回前一页、后一页)

本文转载于:专业的前端网站➸js中实现页面跳转(返回前一页、后一页) 一:JS 重载页面,本地刷新,返回上一页 复制代码代码如下: <a href="javascript:history.go(-1)">返回上一页</a> <a h...

前端老手
昨天
5
0
JAVA 利用时间戳来判断TOKEN是否过期

import java.time.Instant;import java.time.LocalDateTime;import java.time.ZoneId;import java.time.ZoneOffset;import java.time.format.DateTimeFormatter;/** * @descri......

huangkejie
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部