项目场景:
最近在学习Mooc上的Tensorflow入门实操课程,学到第4.4课优化模型参数,在自己环境中复现代码时,出现了一个错误,困扰我好几天,特此来记录一下
我的环境:
python3.6
tensorflow-gpu 2.2.0
问题描述:
该错误出现在人马图片识别模型的优化模型参数中,需要用到kerastuner包,目标是用tuners来实现对模型中参数的自动优化,但是在我将代码运行在自己环境中时,出现以下错误
我的代码:
from tensorflow.python import InteractiveSession, ConfigProto, os
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import tensorflow as tf
from kerastuner.tuners import Hyperband
from kerastuner.engine.hyperparameters import HyperParameters
from tensorflow.python.keras.optimizer_v2.rmsprop import RMSprop
config = ConfigProto()
# 配置GPU内存分配方式,按需增长,很关键
config.gpu_options.allow_growth = True
# 在创建session的时候把config作为参数传进去
session = InteractiveSession(config=config)
#创建两个数据生成器,指定scaling范围0-1
train_datagen = ImageDataGenerator(rescale=1/255)
validation_datagen = ImageDataGenerator(rescale=1/255)
#指向训练数据文件夹
train_generator = train_datagen.flow_from_directory(
'D://Tensorflow-data/horse-or-human',
target_size=(300,300), #指定输出尺寸
batch_size=32,
class_mode='binary') # 指定二分类器
#指向训练数据文件夹
validation_generator = train_datagen.flow_from_directory(
'D://Tensorflow-data/validation-horse-or-human',
target_size=(300,300), #指定输出尺寸
batch_size=32,
class_mode='binary') # 指定二分类器
# 通过kerastuner实现自动调整值
hp=HyperParameters()
# 将创造模型的代码作为函数
def buiil_model(hp):
model = tf.keras.models.Sequential([
# hp方法: ‘’内名称为自动优化后值保存的名称,values为测试的范围
tf.keras.layers.Conv2D(hp.Choice('num_filters_layer0',values=[16,64],default=16), (3,3), activation='relu',input_shape=(300,300,3)),
tf.keras.layers.MaxPool2D(2,2),
tf.keras.layers.Conv2D(16, (3,3), activation='relu'),
tf.keras.layers.MaxPool2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512, activation='relu'),
#输出一个神经元
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(loss='binary_crossentropy', optimizer=RMSprop(lr=0.001), metrics=['acc'])
return model
tuner=Hyperband(
# 函数名字,用哪个函数生成模型
buiil_model,
# 目标,测试集的acc为目标,貌似是精确
objective='val_acc',
max_epochs=15,
directory='D://Tensorflow-data/horse_human_params',
hyperparameters=hp,
project_name='D://Tensorflow-data/my_horse_human_project'
)
tuner.search(
train_generator,
epochs=5,
validation_data=validation_generator,
)
具体错误可以定位到该处:
tuner.search(
train_generator,
epochs=5,
validation_data=validation_generator,
)
错误信息:AttributeError: module ‘tensorflow._api.v2.distribute’ has no attribute ‘TPUStrategy’
就是说tensorflow._api.v2.distribute没有这个属性
原因分析:
在网上大量搜索后发现没有几篇文章讲的是这个错误,具体的解决方法只有几个模糊的相关问题的,于是我自己去官网上搜索了这个方法,发现该方法只出现在TensorFlow 2.4.1的目录中,而我的环境是TensorFlow 2.2.0的,所以没有该方法也就用不了tuners来自动调参了。
解决方案:
解决方法就是把TensorFlow升级到TensorFlow 2.4.1。我自己电脑cuda版本不够,不能适配2.4.1版本,而且主要是学习为主,就没有升级,只能先跳过这一节了。