文章目录

  • 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'
--------------------------------------------------------------------------------