摘要:在該數據集中,圖片被分為類,每個類別的圖片超過張。這樣做是為了減小圖片的范圍,使得圖片的特征更易于學習。為了在數據集上獲得更高的準確率,讀者可嘗試取消凍結參數的設置,使得卷積層也參與訓練。
Caltech 256是什么?
Caltech 256數據集是加利福尼亞理工學院收集整理的數據集,該數據集選自Google Image數據集,并手工去除了不符合其類別的圖片。在該數據集中,圖片被分為256類,每個類別的圖片超過80張。
為什么要用Densenet121模型?
本項目使用在PyTorch框架下搭建的神經網絡來完成圖片分類的任務。由于網絡輸出的類別數量很大,簡單的網絡模型無法達到很好的分類效果,因此,本項目使用了預訓練的Densenet121模型,并僅訓練全連接層的參數。
項目流程:1、數據處理1.數據處理
2.Densenet模型解讀
3.加載預訓練網絡模型
4.訓練神經網絡
首先從指定路徑讀取圖像,將圖像大小更改為224*224,并將圖片范圍從0-255改為0-1:
from PIL import Image image= Image.open(path) image=image.resize((224,224)) x_data= x_data.astype(numpy.float32) x_data= numpy.multiply(x_data, 1.0/255.0) ## scale to [0,1] from [0,255]
由于此數據集中有少量圖片的色彩是單通道的,而神經網絡的輸入需要為三個通道,因此,將該通道的數據復制到三個通道上:
if len(x_data.shape)!=3: temp=numpy.zeros ((x_data.shape[0],x_data.shape[1],3)) temp[:,:,0] = x_data temp[:,:,1] = x_data temp[:,:,2] = x_data x_data= temp x_data=numpy.transpose(x_data,(2,0,1)) ## reshape
在上述步驟之后,對圖片進行白化,即讓像素點的平均值為0,方差為1。這樣做是為了減小圖片的范圍,使得圖片的特征更易于學習。白化的過程如下所示:
if x_train is not None: x_train[:,0,:,:] = (x_train[:,0,:,:]-0.485)/0.229 x_train[:,1,:,:] = (x_train[:,1,:,:]-0.456)/0.224 x_train[:,2,:,:] = (x_train[:,2,:,:]-0.406)/0.225 if x_test is not None: x_test[:,0,:,:] = (x_test[:,0,:,:] -0.485) /0.229 x_test[:,1,:,:] = (x_test[:,1,:,:] -0.456) /0.224 x_test[:,2,:,:] = (x_test[:,2,:,:] -0.406) /0.2252、DenseNet模型解讀
DenseNet的網絡結構如下圖所示。在傳統的CNN中,每個卷積層只與其相鄰的卷積層相連接,這就造成了位于網絡淺層的參數在反向傳播中獲取的梯度非常小,也就是梯度消失問題。
DenseNet設計了名為Dense Block的特殊的網絡結構,在一個Dense Block中,每個層的輸入為前面所有層的輸出,這也正是Dense的含義。通過這種方法,在反向傳播中,網絡淺層的參數可以從后面所有層中獲得梯度,在很大程度上減弱了梯度消失的問題。值得注意的是,每個層只與同位于一個Dense Block中的多個層有連接,而與Dense Block外的層是沒有連接的。
3、加載預訓練網絡模型torchvision是服務于PyTorch框架的,用于進行圖片處理和生成一些主流模型的庫。使用該庫可以方便的加載PyTorch的預訓練模型。首先使用pip安裝torchvision庫:
pip install torchvision
創建densenet121模型實例,并加載預訓練參數:
cnn = torchvision.models.densenet121 (pretrained = True) #pretrained =True即為加載預訓練參數,默認不加載。
凍結所有模型參數,使其值在反向傳播中不改變:
for param in cnn.parameters(): param.requires_grad= False
改變模型全連接層輸出的個數為256:
num_features= cnn.classifier.in_features cnn.classifier= nn.Linear(num_features, 256)
此處不需要擔心新建的全連接層參數會被凍結,因為新建的層參數是默認獲取梯度的。
4、訓練神經網絡損失函數選擇CrossEntropy,優化器選擇Adam:
optimizer= Adam(cnn.parameters(), lr=0.001, betas=(0.9, 0.999)) # 選用AdamOptimizer loss_fn= nn.CrossEntropyLoss() # 定義損失函數
下面是完整的訓練過程:
# 訓練并評估模型 data= Dataset() model= Model(data) best_accuracy= 0 foriinrange(args.EPOCHS): cnn.train() x_train, y_train, x_test, y_test= data.next_batch(args.BATCH) # 讀取數據 x_train= torch.from_numpy(x_train) y_train= torch.from_numpy(y_train) x_train= x_train.float() x_test= torch.from_numpy(x_test) y_test= torch.from_numpy(y_test) x_test= x_test.float() ifcuda_avail: x_train= Variable(x_train.cuda()) y_train= Variable(y_train.cuda()) x_test= Variable(x_test.cuda()) y_test= Variable(y_test.cuda()) outputs= cnn(x_train) _, prediction= torch.max(outputs.data, 1) optimizer.zero_grad() # calculate the loss according to labels loss= loss_fn(outputs, y_train) # backward transmit loss loss.backward() # adjust parameters using Adam optimizer.step() # 若測試準確率高于當前最高準確率,則保存模型 train_accuracy= eval(model, x_test, y_test) iftrain_accuracy>best_accuracy: best_accuracy= train_accuracy model.save_model(cnn, MODEL_PATH, overwrite=True) print("step %d, best accuracy %g"%(i, best_accuracy)) print(str(i) +"/"+str(args.EPOCHS))總結:
本文主要講解了DenseNet的網絡結構,以及在PyTorch框架下如何加載預訓練模型并進行fine-tuning。為了在數據集上獲得更高的準確率,讀者可嘗試取消凍結參數的設置,使得卷積層也參與訓練。
獲取相關項目代碼 請訪問:https://www.flyai.com/d/Calte...
— END —
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/19914.html
摘要:地址為什么使用遷移學習根據聯合創始人斯坦福副教授吳恩達介紹,遷移學習將會成為機器學習商業成就的下一驅動力。遷移學習是一種機器學習技術,允許在特定的數據集上再利用已訓練的卷積神經網絡,并將其調整或遷移到其他數據集。 GitHub 地址:https://github.com/miguelgfierro/sciblog_support/blob/master/A_Gentle_Introducti...
摘要:在本次競賽中,南京信息工程大學和帝國理工學院的團隊獲得了目標檢測的最優成績,最優檢測目標數量為平均較精確率為。最后在視頻目標檢測任務中,帝國理工大學和悉尼大學所組成的團隊取得了較佳表現。 在本次 ImageNet 競賽中,南京信息工程大學和帝國理工學院的團隊 BDAT 獲得了目標檢測的最優成績,最優檢測目標數量為 85、平均較精確率為 0.732227。而在目標定位任務中Momenta和牛津...
摘要:年月日,將標志著一個時代的終結。數據集最初由斯坦福大學李飛飛等人在的一篇論文中推出,并被用于替代數據集后者在數據規模和多樣性上都不如和數據集在標準化上不如。從年一個專注于圖像分類的數據集,也是李飛飛開創的。 2017 年 7 月 26 日,將標志著一個時代的終結。那一天,與計算機視覺頂會 CVPR 2017 同期舉行的 Workshop——超越 ILSVRC(Beyond ImageNet ...
摘要:深度神經網絡能夠煥發新春,大數據功不可沒,然而大數據的版權是否應當延伸到深度學習產生的知識,這是一個現實的問題。要獲得有用的學習效果,大型多層深度神經網絡又名深度學習系統需要大量的標簽數據。 深度神經網絡能夠煥發新春,大數據功不可沒,然而大數據的版權是否應當延伸到深度學習產生的知識,這是一個現實的問題。本文通過ImageNet可視化大數據、Caffe共享深度學習模型和家中訓練三個場景審查了深...
閱讀 2202·2021-10-18 13:28
閱讀 2511·2021-10-11 10:59
閱讀 2340·2019-08-29 15:06
閱讀 1131·2019-08-26 13:54
閱讀 807·2019-08-26 13:52
閱讀 3148·2019-08-26 12:02
閱讀 2998·2019-08-26 11:44
閱讀 2511·2019-08-26 10:56