freelogic's blog

2018-01-28-TF源码做版本兼容的一个粗暴方法

TF源码做版本兼容的一个粗暴方法

说明:

正文:

  • 因为TF版本演进很快,不同版本间差别不小,github上的TF源码对应了0.10.0,0.11.0,1.0.1等不同TF版本,但一般你本地环境是一套TF,容易发现版本问题,非常累人。
  • 一个简单粗暴的解决办法是用try…except结构来做tf的版本兼容,这样不用到代码中修改每个函数,在开头做一些函数版本的判断和转换。
    • 比如: 下面示例代码,对“scalar_summary”和“concat_v2”函数的判断,新老TF如果不同,就可在这里做兼容,而保持程序主体逻辑不动。
  • 但这种try…except的结构在eclipse+pydev中会报错(红色波浪线),这是pydev编译器智能探测导致。解决如下:
    • 步骤1:只要进入菜单“windows–>Perferences–>PyDev–>Editor–>code anaylsis”后,调整右面的“undefined”和“import”的tab面板中的处理级别,将“error”改为“warning”。
    • 在eclipse中选中“abc.py”文件,右键菜单选择“pydev–>code analysis”来重新编译codes,则红色波浪线error不见了,整个程序可以run了。
from tensorflow.python.framework import ops
from utils import *
import tensorflow as tf
import math
import numpy as np

#如下这个try except,通过异常来处理TF的版本兼容性问题!!!
#这里提供了一个思路,来兼容TF的新老格式差异问题,简单但实用!
try:
    #import tensorflow as tf
    #较老的TF的格式;
    image_summary = tf.image_summary
    scalar_summary = tf.scalar_summary
    histogram_summary = tf.histogram_summary
    merge_summary = tf.merge_summary
    SummaryWriter = tf.train.SummaryWriter
except:
    #如下是较新的TF的新格式,如果TRY中OLD格式失败则用新格式;
    image_summary = tf.summary.image
    scalar_summary = tf.summary.scalar
    histogram_summary = tf.summary.histogram
    merge_summary = tf.summary.merge
    SummaryWriter = tf.summary.FileWriter

if "concat_v2" in dir(tf):
    def concat(tensors, axis, *args, **kwargs):
        return tf.concat_v2(tensors, axis, *args, **kwargs)
else:
    def concat(tensors, axis, *args, **kwargs):
        return tf.concat(tensors, axis, *args, **kwargs)



#....后续逻辑代码忽略,和本文主题无关...