出现KeyError: ‘accuracy’、KeyError: ‘acc’、KeyError: 'val_acc’等报错信息,是由于keras库(一个开源人工神经网络库,用于构建和训练深度学习模型的高级 API)版本不同所造成的;
train_loss = history.history[‘accuracy’]
valid_loss = history.history[‘val_accuracy’]
为keras库老版本中的参数不是accuracy,而是acc,将参数accuracy替换为acc,修改过的代码如下:
train_loss = history.history[‘acc’]
valid_loss = history.history[‘val_acc’]
p107
代码清单5-6 配置模型用于训练
model.compile(
loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-4),
metrics=['acc']
)
这个警告是由于使用了lr参数而不是learning_rate参数,lr参数已经过时。建议使用learning_rate参数来设置学习率。’
p109
代码清单5-8 利用批量生成器拟合模型
history = model.fit_gengerator(
train_generator, # 第一个参数是一个python 生成器
steps_per_epoch=100, # 抽取 100个批量
epochs=30, # 迭代次数
validation_data=validation_generator,
validation_steps=50, # 从验证生成器中抽取50个批次用于评估
)
此警告:130: UserWarning: Model.fit_generator
is deprecated and will be removed in a future version. Please use Model.fit
, which supports generators.
history = model.fit_generator(
代码中的model.fit_generator
方法即将在未来版本中被移除,要使用model.fit
方法来替代。
p112
代码清单5-12 显示几个随机增强后的训练图像
# 显示几个随机增强后的训练图像
from keras.preprocessing import image
fnames = [os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]
img_path = fnames[3] # 选择一张图像进行增强
img = image.load_img(img_path, target_size=(150, 150))# 读取图像并调整大小
x = image.img_to_array(img) # 将其转换为形状(150, 150, 3)的 Numpy数组
x = x.reshape((1,)+x.shape) # 将其转换为形状(1,150, 150, 3)的 Numpy数组
i =0
for batch in datagen.flow(x, batch_size=1):
plt.figure(i)
imgplot = plt.imshow(image.array_to_img(batch[0]))
i+=1
if i%4 == 0:
break
plt.show()
AttributeError: module ‘keras.preprocessing.image’ has no attribute ‘load_img’
原因: keras版本更新
即: 将from keras.preprocessing import image 换成 from keras.utils import image_utils
使用img = image_utils.load_img(img_path, target_size=(150, 150))
可换成下面的代码
from keras.utils import image_utils
fnames = [os.path.join(train_cats_dir, fname) for fname in os.listdir(train_cats_dir)]
img_path = fnames[3] # 选择一张图像进行增强
img = image_utils.load_img(img_path, target_size=(150, 150))# 读取图像并调整大小
x = image_utils.img_to_array(img) # 将其转换为形状(150, 150, 3)的 Numpy数组
x = x.reshape((1,)+x.shape) # 将其转换为形状(1,150, 150, 3)的 Numpy数组
i =0
for batch in datagen.flow(x, batch_size=1):
plt.figure(i)
imgplot = plt.imshow(image_utils.array_to_img(batch[0]))
i+=1
if i%4 == 0:
break
plt.show()
参考链接:
已解决module ‘keras.preprocessing.image‘ has no attribute ‘load_img‘
P114
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50)
WARNING:tensorflow:Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least steps_per_epoch * epochs
batches (in this case, 50 batches). You may need to use the repeat() function when building your dataset.
翻译:您的输入数据不足;中断训练。确保您的数据集或生成器至少可以生成“steps_per_epoch*epochs”批。在构建数据集时,可能需要使用repeat()函数。
报错产生原因:
我们训练图像有2000张,验证图像1000张,和1000张测试图像。
steps_per_epoch=100,batch_size=32,如此数据应该是3200张,很明显输入训练数据不够。
validation_steps=50,batch_size=32,如此数据应该是1600张,很明显验证数据不够。
len(train_data)/batch_size = steps_per_epoch
因此,改为steps_per_epoch=2000/32≈63,validation_steps=1000/32≈32。
history = model.fit(
train_generator, # 第一个参数是一个python 生成器
steps_per_epoch=63, # 抽取 63个批量
epochs=30, # 迭代次数
validation_data=validation_generator,
validation_steps=32, # 从验证生成器中抽取50个批次用于评估
)
参考链接:
Your input ran out of data; interrupting training. Make sure that your dataset or generator can …