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

对预训练模型进行微调整

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

1
(图片来源《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")

2
可以看出训练集准确度有了提升,达到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)

输出:
3
训练集准确率也达到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表示预测的是狗。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值