文章目录
- TensorFlow Python API 升级实用程序
- Report
- 注意事项
- 测试
没有在 API 文档查看到过关于 tensorflow 版本直接切换的内容,在 tensorflow git 上倒是有介绍
版本升级的工具。自己试了一下发现能解决比较多的问题,但是仍然有一些需要手动修改,比如被移出 tf 的模块。
TensorFlow Python API 升级实用程序
允许升级现有的 TensorFlow Python 脚本,特别是:
tf_upgrade_v2.py
:将代码从 TensorFlow 1.x 升级到 TensorFlow 2.0 预览版。
tf_upgrade.py
:将代码从 TensorFlow 0.11 升级到 TensorFlow 1.0。
在安装 tensorflow 的过程中,会随着附带安装本工具,不再说明。
升级脚本可以在单个Python文件上运行:
tf_upgrade_v2 --infile foo.py --outfile foo_upgraded.py
它将打印一个无法修复的错误列表。
也可以在目录树上运行:
# upgrade the .py files and copy all the other files to the outtree
tf_upgrade_v2 --intree coolcode --outtree coolcode-upgraded
# just upgrade the .py files
tf_upgrade_v2 --intree coolcode --outtree coolcode-upgraded --copyotherfiles False
*注意:TensorFlow 1.12 之后,由 pip 安装程序自动安装 tf_upgrade_v2 脚本。
Report
脚本运行之后还将转储一个报告 report.txt
,例如,该报告将详细说明更改的细节,例如:
'tensorflow/tools/compatibility/testdata/test_file_v1_12.py' Line 65
--------------------------------------------------------------------------------
Added keyword 'input' to reordered function 'tf.argmax'
Renamed keyword argument from 'dimension' to 'axis'
Old: tf.argmax([[1, 3, 2]], dimension=0)
~~~~~~~~~~
New: tf.argmax(input=[[1, 3, 2]], axis=0)
注意事项
在运行此脚本之前,不要手动更新部分代码。特别是,具有重新排序参数的函数,如 tf.argmax 文件或者 tf.batch_to_space 将导致脚本错误地添加与参数不匹配的关键字参数。(这一点后面例子会体现。)
这个脚本实际上不会重新排序参数。相反,脚本会将关键字参数添加到参数被重新排序的函数中。(后面也会体现)
脚本假定使用 import tensorflow as tf
导入tensorflow。
升级到 2.0 的注意事项:请查看 tf2up.ml 提供了一个方便的工具来升级 GitHub 存储库中的 Jupyter 和 Python文件。
关于升级到 1.0 的注意事项:有些语法不能用这个脚本处理,因为这个脚本被设计成只使用标准的 python 包。如果脚本因“插入必要的关键字参数失败”或“按字典顺序查找关键字失败,请手动修复”而失败。您可以尝试 @machrisaa 的这个脚本分支。@machrisaa 使用了 RedBaron Python 重构引擎,它能够比这个脚本所基于的内置 ast 模块更可靠地本地化语法元素。请注意,替代脚本不可用于 TensorFlow 2.0 升级。
测试
变量赋值并无实际意义,仅为测试自动升级。升级命令如下:
tf_upgrade_v2 --infile test.py --outfile test_v2.py
升级前 test.py
import tensorflow as tf
logits = 0
label_holder = 1
top_k_op = tf.nn.in_top_k(logits, label_holder, 1)
升级后 test_v2.py
import tensorflow as tf
logits = 0
label_holder = 1
top_k_op = tf.nn.in_top_k(predictions=logits, targets=label_holder, k=1)
可以看到,如文档说明并没有改变参数的顺序,logits 仍然在前,lable_holder 在后,只不过为其增加了关键字而已。但是查看该函数的 doc 是没有关键字相关内容的,仅仅是位置参数而已,所以只能理解为 tf 做了版本 1 和 2 之间的转换映射。
help(tf.nn.in_top_k)
in_top_k_v2(targets, predictions, k, name=None)
Says whether the targets are in the top `K` predictions.
This outputs a `batch_size` bool array, an entry `out[i]` is `true` if the
prediction for the target class is finite (not inf, -inf, or nan) and among
the top `k` predictions among all predictions for example `i`. Note that the
behavior of `InTopK` differs from the `TopK` op in its handling of ties; if
multiple classes have the same prediction value and straddle the top-`k`
boundary, all of those classes are considered to be in the top `k`.
之前说过这个函数在两个版本中是位置参数互换了的,所以如果你手动按照 tf 2 版本来改代码,就得互换位置参数。如果你手动升级了这部分,却没有完全完成手动升级整个代码文件,再借助这里这个升级脚本来升级,那么就会得到意外的错误/(ㄒoㄒ)/~~。再说详细点,手动改应为:
top_k_op = tf.nn.in_top_k(label_holder, logits, 1)# 这样在 tf2 才能运行,互换位置参数
然后你改完这句又调用升级脚本升级整个代码,其他代码不说,只说 in_top_k ,此时升级脚本不会看里面位置参数,而是直接按照位置分配关键字,得到:
top_k_op = tf.nn.in_top_k(predictions=label_holder, targets=logits, k=1) # 这就与本意错 liao~
说回来,运行上面升级代码终端打印输出为:
INFO line 5:11: Added keywords to args of function 'tf.nn.in_top_k'
TensorFlow 2.0 Upgrade Script
-----------------------------
Converted 1 files
Detected 0 issues that require attention
--------------------------------------------------------------------------------
Make sure to read the detailed log 'report.txt'
第一行就有写,为 tf.nn.in_top_k 增加了关键字参数,成功升级 1 个文件,未发现需要关注的问题。
生成的 report.txt 文件并没有像文档中说明得那么详尽,仍然没有说明具体增加了什么关键字,只能自己对比升级前后代码了。
TensorFlow 2.0 Upgrade Script
-----------------------------
Converted 1 files
Detected 0 issues that require attention
--------------------------------------------------------------------------------
================================================================================
Detailed log follows:
================================================================================
--------------------------------------------------------------------------------
Processing file 'test.py'
outputting to 'test_v2.py'
--------------------------------------------------------------------------------
5:11: INFO: Added keywords to args of function 'tf.nn.in_top_k'
--------------------------------------------------------------------------------