0. 引言
平时经常在github上使用一些别人的代码,基本上就是直接扒拉过来就开始跑了。不过,经常遇见那种版本不兼容的问题,提示就是没有某个模块,或者没有某个API。本质上是因为tensorflow在发展过程中,很多api已经被取消了。其实在日常的编码过程中,也会遇到这种提示,某个模块或者某个函数将在未来中被取消,请更换某个api的提示。
1. 问题描述
本次实验是基于开源的char-rnn
来进行,一开始选择了star比较高的版本[1],但是这个版本太老了,连contrib.rnn
都不能满足,其要求tensorflow 1.0。所以,更换了另外一个版本[2],这个版本要求tensorflow >=1.2,但即使是这样,依然不能完全兼容。报错如下:
Traceback (most recent call last):
File "train.py", line 7, in <module>
FLAGS = tf.flags.FLAGS
AttributeError: module 'tensorflow' has no attribute 'flags'
通过在官网[3]的解释中,可以通过tf.compat.v1.flags.Flag
来使用,但是虽然这里不报错了,其他的地方还是会报错,例如tf.reset_default_graph()
等。
2. 解决方案
在搜索这个问题之后,发现有很多人有这种问题。在[4]中,提供了解决方案;
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
但是这种方案依然有人说并不好使,不过在我的测试版本,tensorflow==2.3.1,python 3.6.9
上是可以执行的。其他的一些报错也都消失了,能够成功运行。
3.问题思考
其实本质上,这是一个开源库在发展过程中,一些老旧的api逐渐替代,甚至被取消。但是在平时的研究中,经常参考别人的代码,这些代码很多都已经不再维护,直接运行会有很多错误。针对这种情况,如果是完全重新写,怕是工作量太大了。上面提供的解决方案算是一种,但是没有测试更多的代码,在[2]上是能够成功运行的。
**另外一种方式是使用低版本的tensorflow,也就是将tensorflow进行降级,**但是这样的话,每次都进行重装,最后环境就越来越乱了。不过,可以使用docker的形式,例如在dockerhub上搜索tensorflow1.3[5],可以看到之前版本。
注意拉取镜像的时候,一定要选择GPU的版本,不然使用CPU可能会很慢。
关于如果docker安装深度学习环境,可以参考本博客的另外一篇文章《Centos8安装英伟达显卡驱动并通过docker部署深度学习环境》。
参考
[1]sherjilozair/char-rnn-tensorflow
[2]hzy46/Char-RNN-TensorFlow
[3]tf.compat.v1.flags.Flag
[4]AttributeError: module ‘tensorflow’ has no attribute ‘placeholder’ #14
[5]tensorflow/tensorflow