什麼是遷移學習?什麼時候使用遷移學習?

qwer1030274531發表於2020-12-30

遷移學習是一種深度學習策略,它透過將解決一個問題所獲得的知識應用於另一個不同但相關的問題來重用這些知識。例如,有3種型別的花:玫瑰、向日葵和鬱金香。可以使用標準的預訓練模型,如VGG16/19、ResNet50或Inception v3模型(在ImageNet上預訓練了1000個輸出類)對花卉影像進行分類,但是由於模型沒有學習這些花卉類別,因此這樣的模型無法正確識別它們。換句話說,它們是模型不知道的類。

圖11-13所示的是預先訓練的VGG16模型錯誤地對花卉影像進行了分類(程式碼留給讀者作為練習)。其中flamingo(火鶴花)的可信度為0.83,daisy(雛菊)的可信度為0.43,artichoke(菊芋)的可信度為0.33。

圖11-13 預先訓練的VGG16模型對花卉影像的誤分類

用Keras實現遷移學習

許多綜合影像分類問題進行了預處理模型的訓練。在使用卷積網路對貓與狗影像分類的語境中,以卷積層作為特徵提取器,以全連線層作為分類器,如圖11-14所示。

圖11-14 卷積神經網路體系構架

由於標準模型(如VGG-16/19)相當龐大,並且針對許多影像進行了訓練,因此它們能夠為不同的類學習許多不同的特性。讀者可以簡單地重用卷積層作為特徵提取器,學習低階和高階影像特徵,並只訓練全連線層權重(引數),這就是遷移學習。

當有一個簡潔的訓練集時,可以使用遷移學習,所處理的問題與之前訓練的模型是一樣的。如果有足夠的資料,則可以調整卷積層,從頭開始學習所有的模型引數,以便訓練模型來學習與問題相關的更健壯的特性。

現在,用遷移學習對玫瑰、向日葵和鬱金香花的影像。這些影像是從TensorFlow示例影像資料集中獲得的3個類各用550張圖片,總共1650張,這是小數量的圖片,但也是使用遷移學習的好地方。使用每個類中的500個影像進行訓練,保留每個類中的其餘50個影像進行驗證。另外,建立一個名為flower_photos的資料夾,其中包含兩個子資料夾train和valid,並將訓練影像和驗證影像分別儲存在這些資料夾中。資料夾結構應該如圖11-15所示。

圖11-15 資料夾結構圖

載入卷積層的權重,只針對預先訓練好的VGG16模型(設定include_top=False,不載入最後兩個全連線層),將它當作分類器。注意,最後一層的形狀尺寸為7×7×512。

使用ImageDataGenerator類來載入影像,並使用flow_from_directory()函式來生成成批的影像和標籤。還將使用model.predict()函式來透過網路傳遞影像,得到一個7×7×512維的張量,然後將張量重新塑造成一個向量,並以同樣的方式找到validation_features。

也就是說,用Keras實現遷移學習對VGG16模型進行部分訓練,即它只會根據所擁有的訓練影像來學習全連線層的權重,然後用它來預測類,如下面的程式碼所示。

from keras.applications import VGG16
from keras.preprocessing.image import ImageDataGenerator
from keras import models, layers, optimizers
from keras.layers.normalization import BatchNormalization
from keras.preprocessing.image import load_img
# train only the top FC layers of VGG16, use weights learnt with ImageNet for the   
convolution layers
vgg_model = VGG16(weights='imagenet', include_top=False, input_shape=(224,224, 3))
# the directory flower_photos is assumed to be on the current path
train_dir = './flower_photos/train'
validation_dir = './flower_photos/valid'
n_train = 500*3
n_val = 50*3
datagen = ImageDataGenerator(rescale=1./255)
batch_size = 25
train_features = np.zeros(shape=(n_train, 7, 7, 512))
train_labels = np.zeros(shape=(n_train,3))
train_generator = datagen.flow_from_directory(train_dir, target_size=(224,224),
batch_size=batch_size, class_mode='categorical', shuffle=True)
i = 0
for inputs_batch, labels_batch in train_generator:
features_batch = vgg_model.predict(inputs_batch)
train_features[i * batch_size : (i + 1) * batch_size] = features_batch
train_labels[i * batch_size : (i + 1) * batch_size] = labels_batch
i += 1
if i * batch_size >= n_train: break
train_features = np.reshape(train_features, (n_train, 7 * 7 * 512))
validation_features = np.zeros(shape=(n_val, 7, 7, 512))
validation_labels = np.zeros(shape=(n_val,3))
validation_generator = datagen.flow_from_directory(validation_dir,
target_size=(224, 224),
batch_size=batch_size, class_mode='categorical', shuffle=False)
i = 0
for inputs_batch, labels_batch in validation_generator:
features_batch = vgg_model.predict(inputs_batch)
validation_features[i * batch_size : (i + 1) * batch_size] =features_batch
validation_labels[i * batch_size : (i + 1) * batch_size] = labels_batch
i += 1
if i * batch_size >= n_val: break
validation_features = np.reshape(validation_features, (n_val, 7 * 7 * 512))

接下來,使用帶有3個類的softmax輸出層的簡單前饋網路建立模型。然後必須對模型進行訓練,如下面的程式碼所示。可以看到,在Keras中訓練一個網路就像呼叫model.fit()函式一樣簡單。為了檢驗模型的效能,先看看哪些圖片被錯誤分類。

# now learn the FC layer parameters by training with the images we have
model = models.Sequential()
model.add(layers.Dense(512, activation='relu', input_dim=7 * 7 * 512))
model.add(BatchNormalization())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(3, activation='softmax'))
model.compile(optimizer=optimizers.Adam(lr=1e-5),
loss='categorical_crossentropy', metrics=['acc'])
history = model.fit(train_features, train_labels, epochs=20,batch_size=batch_size,
validation_data=(validation_features,validation_labels))
filenames = validation_generator.filenames
ground_truth = validation_generator.classes
label2index = validation_generator.class_indices
# Getting the mapping from class index to class label
idx2label = dict((v,k) for k,v in label2index.items())
predictions = model.predict_classes(validation_features)
prob = model.predict(validation_features)
errors = np.where(predictions != ground_truth)[0]
print("No of errors = {}/{}".format(len(errors),n_val))
# No of errors = 13/150
pylab.figure(figsize=(20,12))
for i in range(len(errors)):
pred_class = np.argmax(prob[errors[i]])
pred_label = idx2label[pred_class]
original =load_img('{}/{}'.format(validation_dir,filenames[errors[i]]))
pylab.subplot(3,5,i+1), pylab.imshow(original), pylab.axis('off')
pylab.title('Original
label:{}\nPrediction:{}\nconfidence:{:.3f}'.format(
filenames[errors[i]].split('\\')[0], pred_label,
prob[errors[i]][pred_class]), size=15)
pylab.show()

執行上述程式碼,輸出結果如圖11-16所示。可以看到,在遷移學習模型的150幅影像中,驗證資料集中有13幅影像被錯誤分類。

圖11-16 遷移學習模型對驗證資料集部分影像分類出錯

最初使用的花卉影像(它們是驗證資料集的一部分,沒有用於訓練遷移學習模型)現在被正確分類,如圖11-17所示(程式碼實現作為練習留給讀者)。

圖11-17 利用遷移學習模型對之前錯誤分類影像的正確分類

本文摘自《Python影像處理實戰》

[印度] 桑迪潘·戴伊(Sandipan Dey) 著,陳盈,鄧軍 譯

  • 影像處理,計算機視覺人臉識別影像修復
  • 程式設計入門教程書籍零基礎,深度學習爬蟲
  • 用流行的Python影像處理庫、機器學習庫和深度學習庫解決影像處理問題。


本書介紹如何用流行的Python 影像處理庫、機器學習庫和深度學習庫解決影像處理問題。先介紹經典的影像處理技術,然後探索影像處理演算法的演變歷程,始終緊扣影像處理以及計算機視覺與深度學習方面的最新進展。全書共12 章,涵蓋影像處理入門基礎知識、應用導數方法實現影像增強、形態學影像處理、影像特徵提取與描述符、影像分割,以及影像處理中的經典機器學習方法等內容。

本書適合Python 工程師和相關研究人員閱讀,也適合對計算機視覺、影像處理、機器學習和深度學習感興趣的軟體工程師參考。

如果想進一步學習遷移學習,推薦《Python遷移學習》迪潘簡·撒卡爾(Dipanjan Sarkar) 著,張浩然 譯

  • 使用TensorFlow和Keras實現高階深度學習和神經網路模型

遷移學習是機器學習技術的一種,它可以從一系列機器學習問題的訓練中獲得知識,並將這些知識用於訓練其他相似型別的問題。

本書分為3個部分:第1部分是深度學習基礎,介紹了機器學習的基礎知識、深度學習的基礎知識和深度學習的架構;第2部分是遷移學習精要,介紹了遷移學習的基礎知識和遷移學習的威力;第3部分是遷移學習案例研究,介紹了影像識別和分類、文字文件分類、音訊事件識別和分類、DeepDream演算法、風格遷移、自動影像掃描生成器、影像著色等內容。

本書適合資料科學家、機器學習工程師和資料分析師閱讀,也適合對機器學習和遷移學習感興趣的讀者閱讀。在閱讀本書之前,希望讀者對機器學習和Python程式設計有基本的掌握。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2746516/,如需轉載,請註明出處,否則將追究法律責任。

相關文章