迁移学习-transfer learning

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)

 


 

你可能感兴趣的:(AI)