Python 深度学习--学习笔记(九)

对预训练模型进行微调整

咱们紧接上一节Python 深度学习–学习笔记(八)讲到的用预训练模型进行学习。训练的结果是验证集的准确度达到 0.9 ,那咱们有没有办法让它的精确度更高呢?有,咱们让卷积层的顶层(最后一层)解冻,解冻 就是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。python

1
(图片来源《Python 深度学习》)web

如今,咱们运用以上思路进行代码的实现:svg

  • 导入上一节学习获得的模型
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")

2
能够看出训练集准确度有了提高,达到0.94.ui

  • 最后咱们用测试集来评估模型
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)

输出:
3
训练集准确率也达到0.946,说明模型泛化能力不错。lua

运用训练模型对图片进行预测
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表示预测的是狗。spa