项目场景:
一个简单识别英文0-9十个英文单词的语音识别项目
项目链接:cnn-asr
报错:AttributeError: module ‘tensorflow’ has no attribute ‘placeholder’
self.input_x = tf.placeholder(tf.compat.v1.float32, [None, width, height], name='input_x')
self.input_y = tf.placeholder(tf.compat.v1.float32, [None, num_classes], name='input_y')
self.keep_prob = tf.placeholder(tf.compat.v1.float32, name='keep_prob')
原因分析:
查看 tf 版本
在 tf2 下使用了 tf1 的 API
解决方案:
网上的解决方案:
使用
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
替换
import tensorflow as tf
实测会显示没有 compat 功能
故使用如下方法解决:
在每个 tf 和 placeholder 之间加上 .compat.v1
self.input_x = tf.compat.v1.placeholder(tf.compat.v1.float32, [None, width, height], name='input_x')
self.input_y = tf.compat.v1.placeholder(tf.compat.v1.float32, [None, num_classes], name='input_y')
self.keep_prob = tf.compat.v1.placeholder(tf.compat.v1.float32, name='keep_prob')
报错:RuntimeError: tf.placeholder() is not compatible with eager execution.
原因分析:
安装了TensoFlow2.0及以上的版本都会出现这个问题,这是因为在运行**tf.compat.v1.placeholder(dtype, shape = None, name = None)**的时候急切执行了这条语句,但是我们一般都是在一个Session前先去定义placeholder,但是不会去执行,然后再在Sesion上下文管理器中去传入我们的数据,然后执行。解决方案:
在代码中添加这样一句:
tf.compat.v1.disable_eager_execution()
改好后的代码如下:
tf.compat.v1.disable_eager_execution()
self.input_x = tf.compat.v1.placeholder(tf.compat.v1.float32, [None, width, height], name='input_x')
self.input_y = tf.compat.v1.placeholder(tf.compat.v1.float32, [None, num_classes], name='input_y')
self.keep_prob = tf.compat.v1.placeholder(tf.compat.v1.float32, name='keep_prob')
报错:AttributeError: module ‘tensorflow’ has no attribute ‘contrib’
原因分析:
TensoFlow版本问题解决方案:
原代码如下:
fc = tf.compat.v1.contrib.layers.dropout(fc, self.keep_prob)
把contrib去掉后的代码如下:
fc = tf.compat.v1.layers.dropout(fc, self.keep_prob)