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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

模型微调技术

發布時間:2023/12/18 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模型微调技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模型微調

  • 一、遷移學習中的常見技巧:微調(fine-tuning)
    • 1.1 概念
    • 1.2 步驟
    • 1.3 訓練
    • 1.4 實現

一、遷移學習中的常見技巧:微調(fine-tuning)

1.1 概念

  • 將在大數據集上訓練得到的weights作為特定任務(小數據集)的初始化權重,重新訓練該網絡(根據需要,修改全連接層輸出);至于訓練的方式可以是:
    1.微調所有層;
    2.固定網絡前面幾層權重,只微調網絡的后面幾層,這樣做有兩個原因:A. 避免因數據量小造成過擬合現象;B.CNN前幾層的特征中包含更多的一般特征(比如,邊緣信息,色彩信息等),這對許多任務來說是非常通用的,但是CNN后面幾層的特征學習注重高層特征,也就是語義特征,這是針對于數據集而言的,不同的數據集后面幾層學習的語義特征也是完全不同的;
  • 1.2 步驟

  • 在源數據集上訓練神經網絡模型或將已經在大數據集上訓練好的模型保存的模型,即源模型;
  • 創建新的神經網絡模型,即目標模型。這將復制源模型上的所有模型設計(即模型層數設計)及其參數(輸出層除外)。假定模型參數包含從源數據集中學到的知識,這些知識也將適用于目標數據集;
  • 想目標模型中添加輸出層,其輸出類別數目是目標數據集中的類別數, 然后隨機初始化該層的模型參數;
  • 在目標數據集上訓練目標模型,輸出層從頭開始訓練,其他所有層的參數將根據源模型的參數進行微調。
  • 1.3 訓練

    • 源數據集遠復雜于目標數據,通常微調效果更好;
    • 通常使用更小的學習率和更少的數據迭代;

    1.4 實現

    #熱狗識別 #導入所需包 from d2l import torch as d2l from torch import nn import torchvision import torch import os %matplotlib inline #獲取數據集 """ 我們使用的熱狗數據集來源于網絡。 該數據集包含1400張熱狗的“正類”圖像,以及包含盡可能多的其他食物的“負類”圖像。 含著兩個類別的1000張圖片用于訓練,其余的則用于測試。 """ d2l.DATA_HUB['hotdog'] = (d2l.DATA_URL + 'hotdog.zip','fba480ffa8aa7e0febbb511d181409f899b9baa5')data_dir = d2l.download_extract('hotdog') print(data_dir) #輸出..\data\hotdog train_imgs=torchvision.datasets.ImageFolder(os.path.join(data_dir,'train')) test_imgs=torchvision.datasets.ImageFolder(os.path.join(data_dir,'test')) hotdogs=[train_imgs[i][0] for i in range(8)] not_hotdogs=[train_imgs[-i-1][0] for i in range(8)] d2l.show_images(hotdogs+not_hotdogs,2,8,scale=1.4)

    # 使用RGB通道的均值和標準差,以標準化每個通道 """ 在訓練期間,我們首先從圖像中裁切隨機大小和隨機長寬比的區域,然后將該區域縮放為\(224*224\)輸入圖像。 在測試過程中,我們將圖像的高度和寬度都縮放到256像素,然后裁剪中央\(224*224\)區域作為輸入。 此外,對于RGB(紅、綠和藍)顏色通道,我們分別標準化每個通道。 具體而言,該通道的每個值減去該通道的平均值,然后將結果除以該通道的標準差。 """ normalize=torchvision.transforms.Normalize([0.485,0.456,0.406],[0.229,0.224,0.225]) train_augs=torchvision.transforms.Compose([torchvision.transforms.RandomResizedCrop(224),#隨機裁剪,并resize成224torchvision.transforms.RandomHorizontalFlip(),torchvision.transforms.ToTensor(),normalize]) test_augs=torchvision.transforms.Compose([torchvision.transforms.Resize(256),torchvision.transforms.CenterCrop(224),#將圖片從中心裁剪成224*224torchvision.transforms.ToTensor(),normalize]) #我們使用在ImageNet數據集上預訓練的ResNet-18作為源模型。 在這里,我們指定pretrained=True以自動下載預訓練的模型參數。 #如果你首次使用此模型,則需要連接互聯網才能下載。 pretrained_net=torchvision.models.resnet18(pretrained=True) """ 預訓練的源模型實例包含許多特征層和一個輸出層fc(全連接層)。 此劃分的主要目的是促進對除輸出層以外所有層的模型參數進行微調。 下面給出了源模型的成員變量fc。 """ pretrained_net.fc #輸出 #Linear(in_features=512, out_features=1000, bias=True) finetune_net=torchvision.models.resnet18(pretrained=True) finetune_net.fc=nn.Linear(finetune_net.fc.in_features,2)#全連接層的輸入神經元數量是特征數量,因為是2分類,所以輸出是2 nn.init.xavier_uniform_(finetune_net.fc.weight)#隨機初始化全連接層權重 #Parameter containing: tensor([[ 0.0378, 0.0630, -0.0080, ..., -0.0220, -0.0511, 0.0959],[ 0.0556, 0.0227, -0.0262, ..., -0.1059, -0.0171, 0.0051]],requires_grad=True) #微調模型 # 如果param_group=True,輸出層中的模型參數將使用十倍的學習率 def train_fine_tuning(net, learning_rate, batch_size=128, num_epochs=5,param_group=True):train_iter = torch.utils.data.DataLoader(torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'), transform=train_augs),batch_size=batch_size, shuffle=True)test_iter = torch.utils.data.DataLoader(torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'), transform=test_augs),batch_size=batch_size)devices = d2l.try_all_gpus()loss = nn.CrossEntropyLoss(reduction="none")if param_group:params_1x = [param for name, param in net.named_parameters()if name not in ["fc.weight", "fc.bias"]]trainer = torch.optim.SGD([{'params': params_1x},{'params': net.fc.parameters(),'lr': learning_rate * 10}],lr=learning_rate, weight_decay=0.001)else:trainer = torch.optim.SGD(net.parameters(), lr=learning_rate,weight_decay=0.001)d2l.train_ch13(net, train_iter, test_iter, loss, trainer, num_epochs,devices) train_fine_tuning(finetune_net, 5e-5)

    #為了進行比較,我們定義了一個相同的模型,但是將其所有模型參數初始化為隨機值。 #由于整個模型需要從頭開始訓練,因此我們需要使用更大的學習率。 scratch_net = torchvision.models.resnet18() scratch_net.fc = nn.Linear(scratch_net.fc.in_features, 2) train_fine_tuning(scratch_net, 5e-4, param_group=False)

    • 參考網址:https://zh-v2.d2l.ai/chapter_computer-vision/fine-tuning.html

    總結

    以上是生活随笔為你收集整理的模型微调技术的全部內容,希望文章能夠幫你解決所遇到的問題。

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