迁移学习---inceptionV3
一.遷移學習的概述
遷移學習是指將一個在某領域完成學習任務的網絡應用到新的領域來進行學習任務。
基于卷積網絡實現遷移學習
對于已經訓練完畢的網絡模型來說,通常該網絡模型的前幾層學習到的是通用特征,隨著網絡層次的加深,更深次的網絡層更偏重于學習特定的特征,因此可將通用特征遷移到其他領域。對于深度卷積網絡來說,經過預訓練的網絡模型可以實現網絡結構與參數信息的分離,在保證網絡結構一致的前提下,便可以利用經過預訓練得到的權重參數初始化新的網絡,這種方式可以極大地減少訓練時間。
具體步驟如下:
①選定基于ImageNet訓練完畢的網絡模型
②用自己搭建的全連接層替換所選定網絡模型的全連接層,得到新網絡模型。
③新網絡模型中固定所需層數的參數,在新的小樣本下訓練余下參數。
④新網絡模型訓練完畢
這種方式又稱為微調,上述步驟的訓練避免了網絡模型針對新任務從頭開始訓練網絡的環節,可節省時間?;贗mageNet訓練完畢的網絡模型泛華能力非常強,無形中擴充了訓練數據,使得新網絡模型提升了訓練精度,泛化能力更好,魯棒性更好。
二.InceptionV3實現遷移學習
inceptionV3結構是從GoogleNet中的inception結構演變而來,相比傳統的inception結構,inceptionv3有如下改進:
①將大的卷積核分解為小的卷積核,如用兩個3*3的卷積核代替5*5的卷積核,卷積運算次數得到減少。
②在輔助分類器中增加BN層有助于提高精度,起到正則化的效果。
③將inception block 中最后一層中的stride 設置為2來實現feature map size 的衰減。
inceptionV3將基于微調的方式實現遷移學習,在獲取基于ImageNet預訓練完畢的inception v3模型后,用自己搭建的全連接層(包括輸出層)代替inception V3模型的全連接層和輸出層,得到一個新的網絡模型,進而固定新網絡模型的部分參數,使其不參與訓練,基于mnist數據集訓練余下未固定的參數。
代碼實現:
基于keras框架
from keras.datasets import mnist from keras.applications.inception_v3 import InceptionV3 from keras.utils import np_utils from keras.models import Model from keras.layers import Dense,Dropout,Conv2D,MaxPooling2D,GlobalAveragePooling2D,Input,UpSampling3D from matplotlib import pyplot as plt import numpy as np(X_train,Y_train),(X_test,Y_test)=mnist.load_data() X_test1=X_test Y_test1=Y_test X_train=X_train.reshape(-1,28,28,1).astype("float32")/255.0 X_test=X_test.reshape(-1,28,28,1).astype("float32")/255.0 Y_test=np_utils.to_categorical(Y_test,10) Y_train=np_utils.to_categorical(Y_train,10) print(X_train.shape) print(Y_train.shape)#采用keras中函數api模型搭建新型網絡即base_model #weight="imagenet",xcception權重使用基于imagenet訓練獲得的權重,include_to=false代表不包含頂層的全連接層 base_model=InceptionV3(weights="imagenet",include_top=False) input_inception=Input(shape=(28,28,1),dtype="float32",name="inceptionv3") #對輸入數據上采樣 x=UpSampling3D(size=(3,3,3),data_format="channels_last")(input_inception) #將數據送入model模型 x=base_model(x) #此時模型沒有全連接層,需要自己搭建全連接層 #通過GlobalAveragePooling2D對每張二維特征圖進行全局平均池化,輸出對應一維數值 x=GlobalAveragePooling2D()(x) #搭建全連接層 x=Dense(1024,activation="relu")(x) x=Dropout(0.5)(x) pre=Dense(10,activation="softmax")(x) #調用model模型,定義新的模型inceptionv3的輸入層,輸出層 inceptionv3_model=Model(inputs=input_inception,outputs=pre) #打印base_model模型的各層名稱和對應層數 for i,layer in enumerate(base_model.layers):print(i,layer.name) #固定base_model前64層的參數使其不參與訓練 for layer in base_model.layers[:64]:layer.trainable=False #查看網絡模型摘要 inceptionv3_model.summary()#編譯 inceptionv3_model.compile(loss="categorical_crossentropy",optimizer="adam",metrics=["accuracy"] ) #訓練 n_epoch=5 n_batches=64 training=inceptionv3_model.fit(X_train,Y_train,epochs=n_epoch,batch_size=n_batches,validation_split=0.2,verbose=1 ) #模型評估 test=inceptionv3_model.evaluate(X_test,Y_test,verbose=1) print("誤差:",test[0]) print("準確率:",test[1])#畫出inceptionv3_model模型的隨時期epochs變化曲線 def plot_history(training_history,train,validation):plt.plot(training.history[train],linestyle="--",color="b")plt.plot(training.history[validation],linestyle="-",color="r")plt.title("training history")plt.xlabel("epochs")plt.ylabel("accuracy")plt.legend(["train","validation"],loc="lower right")plt.show() plot_history(training,"accuracy","val_accuracy")def plot_history1(training_history,train,validation):plt.plot(training.history[train],linestyle="--",color="b")plt.plot(training.history[validation],linestyle="-",color="r")plt.title("training history")plt.xlabel("epochs")plt.ylabel("loss")plt.legend(["train","validation"],loc="upper right")plt.show() plot_history1(training,"loss","val_loss")#預測 prediction=inceptionv3_model.predict(X_test)#打印原圖像 def plot_image(image):fig=plt.gcf()fig.set_size_inches(2,2)plt.imshow(image,cmap="binary")plt.show() def pre_result(i):plot_image(X_test1[i])print("真實值:",Y_test[i])print("預測值:",np.argmax(prediction[i])) pre_result(0) pre_result(1) pre_result(2)?
?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的迁移学习---inceptionV3的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 经典卷积网络进阶--ResNet详解
- 下一篇: 迁移学习--Xception