咱们紧接上一节Python 深度学习–学习笔记(八)讲到的用预训练模型进行学习。训练的结果是验证集的准确度达到 0.9 ,那咱们有没有办法让它的精确度更高呢?有,咱们让卷积层的顶层(最后一层)解冻,解冻 就是略微调整了所复用模型中更加抽象的表示,以便让这些表示与手头的问题更加相关。python
(图片来源《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")
能够看出训练集准确度有了提高,达到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)
输出:
训练集准确率也达到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