tensorflow2.0简化了代码,但是之前依赖tensorflow1.0实现的代码,在tensorflow2.0版本下会出现不兼容的问题,全部重写工作量又很大,记录一下各种问题与解决方法~~~
后面根据使用情况继续更新啦!---如果没记错的话,神经网络的方法引用都要通过keras??回去找找之前改的代码再来更新~~~
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()
其它代码无需修改。如果是稳定使用中、并且没有重构意愿的代码,这种方式算的上首选。
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的代码。
推荐的演进方式,当然还是学习TensorFlow 2.0的相关特征,重构原有代码为新版本代码才是正路。平心而论,毕竟绝大多数系统的升级都是为了提供更多功能和降低使用门槛。TensorFlow 2.0也是大幅的降低了使用门槛的。大多数的工作比起1.x版本来,都能使用更少的代码量来完成。
首先了解一下TensorFlow 2.0同1.x之间的重要区别:
正常情况下,最后一项tf.keras.Model.fit能够大大的降低训练循环的代码量。但在本例中,我们模拟了一个现实中并不适用的例子,keras中并未对这种情形进行优化。所以在本例中反而无法使用tf.keras.Model.fit(实际上一定要使用也是可以的,不过要自定义模型,工作量更不划算)。因此本例中仍然要自己编写训练循环。并且因为2.0中API的变化,代码更复杂了。不过相信我,等到比较正式应用中,使用神经网络、卷积等常用算法,代码就极大的简化了。
使用TensorFlow 2.0原生代码的程序代码如下:
对于解决“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