Tensorflow2.0与Tensorflow1.x不兼容问题

tensorflow2.0简化了代码,但是之前依赖tensorflow1.0实现的代码,在tensorflow2.0版本下会出现不兼容的问题,全部重写工作量又很大,记录一下各种问题与解决方法~~~

后面根据使用情况继续更新啦!---如果没记错的话,神经网络的方法引用都要通过keras??回去找找之前改的代码再来更新~~~

1. 使用2.0中的v1兼容包来沿用1.x代码

TensorFlow 2.0中提供了tensorflow.compat.v1代码包来兼容原有1.x的代码,可以做到几乎不加修改的运行。社区的contrib库因为涉及大量直接的TensorFlow引用代码或者自己写的Python扩展包,所以无法使用这种模式。TensorFlow 2.0中也已经移除了contrib库,这让人很有点小遗憾的。
使用这种方式升级原有代码,只需要把原有程序开始的TensorFlow引用,

将:

import tensorflow as tf

 替换为:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

其它代码无需修改。如果是稳定使用中、并且没有重构意愿的代码,这种方式算的上首选。

2. 使用迁移工具来自动迁移1.x代码到2.0

TensorFlow 2.0中提供了命令行迁移工具,来自动的把1.x的代码转换为2.0的代码。工具使用方法如下(假设我们的程序文件名称为first-tf.py):

tf_upgrade_v2 --infile first-tf.py --outfile first-tf-v2.py

迁移工具还可以对整个文件夹的程序做升级,请参考工具自身的帮助文档。

使用迁移工具升级的代码,实质上也是使用了tensorflow.compat.v1兼容包来提供在TensorFlow 2.0环境中执行1.x的代码。 

3. 编写原生的Tensorflow2.0程序

推荐的演进方式,当然还是学习TensorFlow 2.0的相关特征,重构原有代码为新版本代码才是正路。平心而论,毕竟绝大多数系统的升级都是为了提供更多功能和降低使用门槛。TensorFlow 2.0也是大幅的降低了使用门槛的。大多数的工作比起1.x版本来,都能使用更少的代码量来完成。
首先了解一下TensorFlow 2.0同1.x之间的重要区别:

  • 在API层面的类、方法有了较大的变化,这个需要在使用中慢慢熟悉
  • 取消了Session机制,每一条命令直接执行,而不需要等到Session.run
  • 因为取消了Session机制,原有的数学模型定义,改为使用Python函数编写。原来的feed_dict和tf.placeholder,成为了函数的输入部分;原来的fetches,则成为了函数的返回值。
  • 使用keras的模型体系对原有的TensorFlow API进行高度的抽象,使用更容易
  • 使用tf.keras.Model.fit来替代原有的训练循环。

正常情况下,最后一项tf.keras.Model.fit能够大大的降低训练循环的代码量。但在本例中,我们模拟了一个现实中并不适用的例子,keras中并未对这种情形进行优化。所以在本例中反而无法使用tf.keras.Model.fit(实际上一定要使用也是可以的,不过要自定义模型,工作量更不划算)。因此本例中仍然要自己编写训练循环。并且因为2.0中API的变化,代码更复杂了。不过相信我,等到比较正式应用中,使用神经网络、卷积等常用算法,代码就极大的简化了。

使用TensorFlow 2.0原生代码的程序代码如下:

4.关于 AttributeError: module 'tensorflow.compat.v1' has no attribute 'contrib'

对于解决“No module named ‘tensorflow.contrib.rnn’No module named’tensorflow.contrib’”问题,大多数帖子给的建议是回滚到TF1.x的版本。 在沿用的代码中,有很多调用到tf.contrib,这里列出tf.contrib包含的模块。

4.1 tensorflow.contrib.layers模块

建立神经网络层的高级操作 此包提供了一些操作,它们负责在内部创建以一致方式使用的变量,并为许多常见的机器学习算法提供构建块。

tf.contrib.layers.avg_pool2d

tf.contrib.layers.batch_norm

tf.contrib.layers.convolution2d

tf.contrib.layers.conv2d_in_plane

tf.contrib.layers.convolution2d_in_plane

tf.nn.conv2d_transpose

tf.contrib.layers.convolution2d_transpose

tf.nn.dropout tf.contrib.layers.flatten

tf.contrib.layers.fully_connected

tf.contrib.layers.layer_norm

tf.contrib.layers.linear

tf.contrib.layers.max_pool2d

tf.contrib.layers.one_hot_encoding

tf.nn.relu tf.nn.relu6

tf.contrib.layers.repeat

tf.contrib.layers.safe_embedding_lookup_sparse

tf.nn.separable_conv2d

tf.contrib.layers.separable_convolution2d

tf.nn.softmax tf.stack

tf.contrib.layers.unit_norm

tf.contrib.layers.embed_sequence

设置默认激活功能的 fully_connected 的别名可用:relu,relu6 和 linear. 

stack 操作也可用,它通过重复应用层来构建一叠层。
 

4.2 初始化

将: 

initializer = tf.contrib.layers.xavier_initializer(seed = 1)

替换为: 

initializer = tf.truncated_normal_initializer(stddev=0.1)

4.3  flatten() 方法

将:

P1 = tf.contrib.layers.flatten(P)

替换为:

P1 = tf.layers.flatten(P)

 4.4 tf2.0没有fully_connected()全连接层函数

tf2.0已经去除了contrib的库,因为该库比较繁琐,不容易维护,所以已经逐渐去除了,contrib库中的layers但是还是保存的,所以有些函数还是存在的,直接调用 tf.compat.v1.layers.有些函数还是存在的,但是fully_connected()已经去除。

解决方案

(1)用tf2.0 新的全连接层dense来代替 下面文章 Tensorflow2.0 全连接层;

(2)直接用 tf.compat.v1.layers.dense() 参数还是和fully_connected中的差不多,这样可以代替fully_connected;

(3)其实在contrib库去除时,将其中的函数整合到了tf_slim库中,这个库是tf的瘦身版,所以叫tf_slim 它直接包含了tf的一些函数,可以直接调用,其中也就包括fully_connected。

安装tf.slim

cmd执行:

pip install --upgrade tf_slim

引用方法:

import tf_slim
tf_slim.fully_connected()

本文参考:

https://www.cnblogs.com/jfdwd/p/11446358.html

https://blog.csdn.net/weixin_44560088/article/details/103830352

https://blog.csdn.net/qq_43767511/article/details/115534114

 

你可能感兴趣的:(python笔记,tensorflow,python,深度学习)