迁移学习-transfer learning

本文介绍迁移学习的概念,利用预训练模型进行图像分类的两大应用场景。首先,直接使用成熟模型进行分类,例如VGG16识别杜宾狗。其次,替换模型的输出层,重新定义输出类别,如使用MobileNet进行特定的三分类任务。通过这种方式,可以大幅减少训练所需的数据量和计算资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://machinelearningmastery.com/how-to-use-transfer-learning-when-developing-convolutional-neural-network-models/

https://towardsdatascience.com/keras-transfer-learning-for-beginners-6c9b8b7143e

https://www.jianshu.com/p/763e48eaeebc

 

迁移学习:站在巨人的肩膀上,使用成熟的model(h5),只需要替换最后几层

好处

1:不需要一个非常大的训练数据集。
2:不需要太多的计算能力,因为我们使用的是预先训练好的权重,只需要学习最后几层的权重。

 

成熟的model有:

  • VGG (e.g. VGG16 or VGG19).
  • GoogLeNet (e.g. InceptionV3).
  • Residual Network (e.g. ResNet50).

层说明:
conv网络前几层的过滤器学习识别颜色和某些水平和垂直线。
接下来的几层慢慢地学习如何使用在前几层中学习到的线条和颜色来识别细小的形状。
然后,下一层学习识别纹理,然后部分对象,如腿、眼睛、鼻子等。
最后,最后一层中的过滤器被诸如狗、汽车等整个物体激活。

 

例子1:直接使用模型,判断出图像里是杜宾狗。(说明杜宾狗在既定的1000个分类中)


# example of using a pre-trained model as a classifier
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.applications.vgg16 import preprocess_input
from keras.applications.vgg16 import decode_predictions
from keras.applications.vgg16 import VGG16
# load an image from file
image = load_img('ai/dog.jpg', target_size=(224, 224))
# convert the image pixels to a numpy array
image = img_to_array(image)
# reshape data for the model
image = image.reshape((1, image.shape[0], image.shape[1], image.shape[2]))
# prepare the image for the VGG model
image = preprocess_input(image)

# load the model
model = VGG16()
# predict the probability across all output classes
yhat = model.predict(image)
# convert the probabilities to class labels
label = decode_predictions(yhat)
# retrieve the most likely result, e.g. highest probability
label = label[0][0]
# print the classification
print('%s (%.2f%%)' % (label[1], label[2]*100))

例子2,替换最后输出层,重新定义输出

import pandas as pd
import numpy as np
import os
import keras
import matplotlib.pyplot as plt
from keras.layers import Dense,GlobalAveragePooling2D
from keras.applications import MobileNet
from keras.preprocessing import image
from keras.applications.mobilenet import preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model
from keras.optimizers import Adam


 #imports the mobilenet model and discards the last 1000 neuron layer.
base_model=MobileNet(weights='imagenet',include_top=False)

# define output
x=base_model.output
x=GlobalAveragePooling2D()(x)
x=Dense(1024,activation='relu')(x) #we add dense layers so that the model can learn more complex functions and classify for better results.
x=Dense(1024,activation='relu')(x) #dense layer 2
x=Dense(512,activation='relu')(x) #dense layer 3
preds=Dense(3,activation='softmax')(x) #final layer with softmax activation


#now a model has been created based on our architecture
model=Model(inputs=base_model.input,outputs=preds)


# 前20层所有的权重设置为不可训练。我们将只训练20层以后的权重
for layer in model.layers[:20]:
    layer.trainable=False
for layer in model.layers[20:]:
    layer.trainable=True



# use ImageDataGenerator to get traning data
train_datagen=ImageDataGenerator(preprocessing_function=preprocess_input) #included in our dependencies
train_generator=train_datagen.flow_from_directory('./train/', # this is where you specify the path to the main data folder
                                                 target_size=(224,224),
                                                 color_mode='rgb',
                                                 batch_size=32,
                                                 class_mode='categorical',
                                                 shuffle=True)

# compile
# Adam optimizer
# loss function will be categorical cross entropy
# evaluation metric will be accuracy
model.compile(optimizer='Adam',loss='categorical_crossentropy',metrics=['accuracy'])

step_size_train=train_generator.n//train_generator.batch_size
model.fit_generator(generator=train_generator,
                   steps_per_epoch=step_size_train,
                   epochs=5)

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值