日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

迁移学习(基于ResNet18的蜜蜂和蚂蚁分类)

發布時間:2024/1/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 迁移学习(基于ResNet18的蜜蜂和蚂蚁分类) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#實踐中,受限于數據集規模的約束,我們很少從頭開始端到端的訓練一個神經網絡。通常情況下, # 我們會選擇在ImageNet數據集上預訓練好的網絡模型上進行適當的修改,使其適用于目標數據集。#首先,修改網絡模型的最后一個全連接層,使其適應于目標數據集, # 使用預訓練的網絡權重來初始化網絡模型的權重,用自己的圖像數據來微調訓練網絡。微調網絡主要有以下兩種做法:#1.只訓練最后一個全連接層,凍結除最后一個全連接層外的所有層的權重。 #2.所有網絡層都參與訓練,不過最后一個全連接層在訓練時使用更大的學習率,通常最后一個全連接層的學習率是前面層學習率的10倍。#下面基于遷移學習實現一個ResNet18來對蜜蜂和螞蟻分類,點擊這里下載數據集。螞蟻和蜜蜂大約均有120幅訓練圖像。每個類別有75幅驗證圖像。from __future__ import print_function, divisionimport torch import torch.nn as nn from torch.optim import lr_scheduler from torchvision import datasets, models, transforms import time import os import copy# 是否使用gpu運算 use_gpu = torch.cuda.is_available() # 數據預處理,Pytorch提供了一個數據預處理的操作對象。定義如下: data_transforms = {'train': transforms.Compose([# 隨機在圖像上裁剪出224*224大小的圖像transforms.RandomResizedCrop(224),# 將圖像隨機翻轉transforms.RandomHorizontalFlip(),# 將圖像數據,轉換為網絡訓練所需的tensor向量transforms.ToTensor(),# 圖像歸一化處理# 個人理解,前面是3個通道的均值,后面是3個通道的方差transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]),'val': transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]), }# 讀取數據 # 這種數據讀取方法,需要有train和val兩個文件夾, # 每個文件夾下一類圖像存在一個文件夾下 #在對分類的數據進行處理的時候,可以使用Pytorch提供的ImageFolder類來實現數據預處理。 #首先需要定義數據集的根目錄: data_dir = '../data/hymenoptera_data' #然后,對于train和val這兩個分別使用ImageFolder處理.這時,ImageFolder已經完成了照片數據的分類,并將這些圖片的分類信息放倒了image_datasets變量中, #可以看到,ImageFolder類已經將ants,bees做好了分類,并賦值為0和1。并且,訓練數據以及測試數據被很好的分開。 #data_transforms對象在ImageFolder進行數據處理的時候作為參數傳入,可以將上面數據處理的代碼改為如下形式: image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x),data_transforms[x])for x in ['train', 'val']}#有了ImageFolder獲取到的image_datasets,這里只是找到了數據的路徑以及相對應的類別, # Pytorch還提供了DataLoader類,用于在訓練時,實時獲取數據對應的訓練數據。代碼如下: dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=4,shuffle=True, num_workers=4)for x in ['train', 'val']} #DataLoader的第一個參數為上面獲取到的image_datasets,第二個參數為batch_size, #表示的是批訓練時每批樣本的數量。參數shuffle表示的是是否打亂數據的順序,True表示打亂。參數num_workers表示參與計算的CPU核心數。# 讀取數據集大小 train:244,val:153 dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']} # 數據類別 ['ants','bees'] class_names = image_datasets['train'].classes# 訓練與驗證網絡(所有層都參加訓練) def train_model(model, criterion, optimizer, scheduler, num_epochs):since = time.time() #返回的是毫秒# 保存網絡訓練最好的權重best_model_wts = copy.deepcopy(model.state_dict())best_acc = 0.0for epoch in range(num_epochs):print('Epoch {}/{}'.format(epoch, num_epochs - 1))print('-' * 10)# 每訓練一個epoch,測試一下網絡模型的準確率for phase in ['train', 'val']: #phase=='train'if phase == 'train':# 學習率更新方式scheduler.step()# 調用模型訓練model.train(True)else:# 調用模型測試model.train(False)running_loss = 0.0running_corrects = 0# 依次獲取所有圖像,參與模型訓練或測試for data in dataloaders[phase]:# 獲取輸入inputs, labels = data# 判斷是否使用gpuif use_gpu:inputs = inputs.cuda()labels = labels.cuda()# 梯度清零optimizer.zero_grad()# 網絡前向運行outputs = model(inputs)_, preds = torch.max(outputs.data, 1) #獲取最大值索引# 計算Loss值,交叉熵損失函數,其內部會自動加上Sofrmax層loss = criterion(outputs, labels)# 反傳梯度,更新權重if phase == 'train':# 反傳梯度loss.backward()# 更新權重optimizer.step()# 計算一個epoch的loss值和準確率,inputs.size(0)=4,running_loss += loss.item() * inputs.size(0)running_corrects += torch.sum(preds == labels.data)# 計算Loss和準確率的均值epoch_loss = running_loss / dataset_sizes[phase]epoch_acc = float(running_corrects) / dataset_sizes[phase]print('{} Loss: {:.4f} Acc: {:.4f}'.format(phase, epoch_loss, epoch_acc))# 保存測試階段,準確率最高的模型if phase == 'val' and epoch_acc > best_acc:best_acc = epoch_accbest_model_wts = copy.deepcopy(model.state_dict())time_elapsed = time.time() - sinceprint('Training complete in {:.0f}m {:.0f}s'.format(time_elapsed // 60, time_elapsed % 60))print('Best val Acc: {:4f}'.format(best_acc))# 網絡導入最好的網絡權重model.load_state_dict(best_model_wts)return model# 微調網絡 if __name__ == '__main__':# 導入Pytorch中自帶的resnet18網絡模型model_ft = models.resnet18(pretrained=True)# 將網絡模型的各層的梯度更新置為Falsefor param in model_ft.parameters():param.requires_grad = False# 修改網絡模型的最后一個全連接層# 獲取最后一個全連接層的輸入通道數num_ftrs = model_ft.fc.in_features# 修改最后一個全連接層的的輸出數為2model_ft.fc = nn.Linear(num_ftrs, 2)# 是否使用gpuif use_gpu:model_ft = model_ft.cuda()# 定義網絡模型的損失函數criterion = nn.CrossEntropyLoss()# 只訓練最后一個層# 采用隨機梯度下降的方式,來優化網絡模型optimizer_ft = torch.optim.SGD(model_ft.fc.parameters(), lr=0.001, momentum=0.9)# 定義學習率的更新方式,每5個epoch修改一次學習率exp_lr_scheduler = lr_scheduler.StepLR(optimizer_ft, step_size=5, gamma=0.1)# 訓練網絡模型model_ft = train_model(model_ft, criterion, optimizer_ft, exp_lr_scheduler, num_epochs=10)# 存儲網絡模型的權重torch.save(model_ft.state_dict(),"model_only_fc.pkl")

總結

以上是生活随笔為你收集整理的迁移学习(基于ResNet18的蜜蜂和蚂蚁分类)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。