如何修复使用InceptionV4时出现的'tensorflow'无'get_default_graph'报错
问题背景
使用InceptionV4代码时出现上述错误,TensorFlow和Keras版本均为2.5.0。
错误信息
AttributeError
module 'tensorflow' has no attribute 'get_default_graph'
File "C:\Labbb\inception\InceptionV4-master\inceptionv4.py", line 219, in create_inception_v4
init = Input((299,299, 8))
File "C:\Labbb\inception\InceptionV4-master\inceptionv4.py", line 259, in
model = create_inception_v4(load_weights=check)
AttributeError: module 'tensorflow' has no attribute 'get_default_graph'
相关代码片段
def create_inception_v4(nb_classes=int(args["num_classes"]), load_weights=check): model = create_inception_v4(load_weights=check) model.compile(loss='categorical_crossentropy', optimizer=keras.optimizers.SGD(lr=float(args['learning_rate']), decay=1e-6, momentum=0.9, nesterov=True), metrics=["accuracy"]) hist = model.fit_generator(train_datagen,steps_per_epoch=int(args['50']),epochs=int(args['3']),verbose=True,validation_data=val_datagen,validation_steps=10,callbacks=[mc, tensorboard])
当前导入代码
from keras.layers import Input, merge, Dropout, Dense, Flatten, Activation from keras.layers.convolutional import MaxPooling2D, Convolution2D, AveragePooling2D from keras.layers.normalization import BatchNormalization from tensorflow.keras.models import Model from tensorflow.keras import backend as K from keras.utils.data_utils import get_file from keras.utils.training_utils import multi_gpu_model import tensorflow as tf import keras from tensorflow.keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img from tensorflow.keras.layers import concatenate from tensorflow.keras.callbacks import TensorBoard from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.utils import Sequence
解决方法
问题出在混用了独立Keras和TensorFlow内置Keras的导入,TensorFlow 2.x里已经删掉了tf.get_default_graph()的直接调用,但独立Keras的部分组件还会试图调用这个已废弃的API。
按下面的步骤修改即可:
统一所有导入为tensorflow.keras,删除所有直接从
keras.开头的导入,全部替换成tensorflow.keras.:# 替换所有keras.开头的导入 from tensorflow.keras.layers import Input, Dropout, Dense, Flatten, Activation, MaxPooling2D, Conv2D, AveragePooling2D, BatchNormalization, concatenate from tensorflow.keras.models import Model, Sequential from tensorflow.keras import backend as K from tensorflow.keras.utils import get_file, to_categorical, Sequence from tensorflow.keras.optimizers import SGD from tensorflow.keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img from tensorflow.keras.callbacks import TensorBoard import tensorflow as tf注意:
Convolution2D在tensorflow.keras中已更名为Conv2D,merge已被concatenate替代,代码中对应调用也要同步修改。调整代码中的API调用:
- 将
Convolution2D替换为Conv2D - 将
merge替换为concatenate(确保已从tensorflow.keras.layers导入该方法) - 将
keras.optimizers.SGD改为tensorflow.keras.optimizers.SGD
- 将
卸载独立Keras包:如果环境中安装了独立Keras,建议卸载避免版本冲突:
pip uninstall keras -y替换fit_generator为fit:TensorFlow 2.2+版本中
fit_generator已被弃用,直接使用model.fit()即可,它会自动处理生成器输入:hist = model.fit(train_datagen, steps_per_epoch=int(args['50']), epochs=int(args['3']), verbose=True, validation_data=val_datagen, validation_steps=10, callbacks=[mc, tensorboard])
这样修改后,就能彻底解决混用API导致的错误,适配TensorFlow 2.5.0的环境。
内容的提问来源于stack exchange,提问作者Syuuuu

