对预训练模型进行微调整
我们紧接上一节Python 深度学习–学习笔记(八)讲到的用预训练模型进行学习。训练的结果是验证集的准确度达到 0.9 ,那我们有没有办法让它的精确度更高呢?有,我们让卷积层的顶层(最后一层)解冻,解冻 就是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。
(图片来源《Python 深度学习》)
现在,我们运用以上思路进行代码的实现:
- 导入上一节学习得到的模型
from keras.models import load_model
model = load_model('cats_and_dogs_small_3.h5')
set_trainable = False #开关
for layer in model.layers[0].layers:
if layer.name == 'block5_conv1':
#最后一层卷积层的名字叫block5_conv1
set_trainable = True
if set_trainable:
layer.trainable = True
else:
layer.trainable = False
切记! model一定在冻结前训练过一次了才能解冻!!
- 接着,像前一节一样,定义图片生成器(数据增加版)
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
import os
base_dir = './cats_and_dogs_small'
train_dir = os.path.join(base_dir,'train')
validation_dir = os.path.join(base_dir,'validation')
test_dir = os.path.join(base_dir,'test')
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
test_datagen = ImageDataGenerator(rescale=1./255)
#测试集不能数据增强
train_generator = train_datagen.flow_from_directory(
train_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary'
)
validation_generator = test_datagen.flow_from_directory(
validation_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary')
如代码有疑问,可翻前几节查看解释。
- 编译,训练模型
model.compile(
loss='binary_crossentropy',
optimizer=optimizers.RMSprop(lr=1e-5),
metrics=['acc']
)
history = model.fit_generator(
train_generator,
steps_per_epoch=100,
epochs=100,
validation_data=validation_generator,
validation_steps=50
)
model.save("cats_and_dogs_small_4.h5")
可以看出训练集准确度有了提升,达到0.94.
- 最后我们用测试集来评估模型:
test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(150, 150),
batch_size=20,
class_mode='binary'
)
test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test acc:', test_acc)
输出:
训练集准确率也达到0.946,说明模型泛化能力不错。
运用训练模型对图片进行预测
from keras.models import load_model
from keras.preprocessing import image
import matplotlib.pyplot as plt
model = load_model("cats_and_dogs_small_4.h5")
img_path = "C:\\Users\\Administrator\\Desktop\\Keras_learn\\baiqingbao\\kkk.jpg"
IMG = image.load_img(img_path,target_size=(150,150))
plt.imshow(IMG)
plt.show() #显示图片
x = image.img_to_array(IMG)
x = (x.reshape((1,) + x.shape))/255.
pred = model.predict(x)
pred = round(float(pred))
if pred == 1.0:
print("Dog")
else:
print("Cats")
这里解释一下,输出的是一个[0,1]的数值,接近0表示预测的是猫,接近1表示预测的是狗。