五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

37 微調(diào)【動手學(xué)深度學(xué)習(xí)v2】

2023-07-31 17:45 作者:月蕪SA  | 我要投稿

微調(diào):深度學(xué)習(xí)中最重要的一個技術(shù)

通常情況下,要獲得一個足夠數(shù)量的數(shù)據(jù)集的成本是很大的。我們希望只需要教給人工智能不多的東西,它就能自動聯(lián)想并達(dá)到較好的效果。

對于一個已經(jīng)被某數(shù)據(jù)集進(jìn)行良好訓(xùn)練過的網(wǎng)絡(luò)來說,用它來識別新數(shù)據(jù)集也是可行的。

但是線性回歸層要根據(jù)需要區(qū)別的類別數(shù)進(jìn)行一定的更改。

微調(diào)初始化:

特征提取層初始化:照搬源網(wǎng)絡(luò)

線性分類層:隨機(jī)初始化

在微調(diào)中,主要的目的是訓(xùn)練出符合新功能需求的線性分類層,所以只要較小的學(xué)習(xí)率和較少的數(shù)據(jù)迭代就可以了。

在源數(shù)據(jù)集復(fù)雜度遠(yuǎn)大于目標(biāo)數(shù)據(jù)集時,微調(diào)效果更好,若兩數(shù)據(jù)集復(fù)雜度相近,則建議重新訓(xùn)練新的網(wǎng)絡(luò)。

微調(diào)常用技術(shù):

·若源數(shù)據(jù)集里已經(jīng)包含目標(biāo)數(shù)據(jù)集中的部分分類類別,可以將源數(shù)據(jù)集的線性分類層中的對應(yīng)標(biāo)號參數(shù)作為目標(biāo)數(shù)據(jù)集線性分類層的對應(yīng)標(biāo)號初始化值。

·固定層法



代碼實現(xiàn)


import os
import torch
import torchvision
from torch import nn
from d2l import torch as d2l

d2l.DATA_HUB['hotdog'] = (d2l.DATA_URL + 'hotdog.zip',
                         'fba480ffa8aa7e0febbb511d181409f899b9baa5')

data_dir = d2l.download_extract('hotdog')


創(chuàng)建兩個實例來分別讀取訓(xùn)練和測試數(shù)據(jù)集中的所有圖像文件。


train_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'train'))
test_imgs = torchvision.datasets.ImageFolder(os.path.join(data_dir, 'test'))


下面顯示了前8個正類樣本圖片和最后8張負(fù)類樣本圖片。正如所看到的,圖像的大小和縱橫比各有不同。


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);


在訓(xùn)練期間,我們首先從圖像中裁切隨機(jī)大小和隨機(jī)長寬比的區(qū)域,然后將該區(qū)域縮放為224×224輸入圖像。 在測試過程中,我們將圖像的高度和寬度都縮放到256像素,然后裁剪中央224×224區(qū)域作為輸入。 此外,對于RGB(紅、綠和藍(lán))顏色通道,我們分別標(biāo)準(zhǔn)化每個通道。 具體而言,該通道的每個值減去該通道的平均值,然后將結(jié)果除以該通道的標(biāo)準(zhǔn)差。


# 使用RGB通道的均值和標(biāo)準(zhǔn)差,以標(biāo)準(zhǔn)化每個通道左邊是RGB通道的mean,右邊是RGB通道的std(因為imagenet做了這樣的標(biāo)準(zhǔn)化,)
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),
    torchvision.transforms.RandomHorizontalFlip(),
    torchvision.transforms.ToTensor(),
    normalize])

test_augs = torchvision.transforms.Compose([
    torchvision.transforms.Resize([256, 256]),
    torchvision.transforms.CenterCrop(224),
    torchvision.transforms.ToTensor(),
    normalize])


使用在ImageNet數(shù)據(jù)集上預(yù)訓(xùn)練的ResNet-18作為源模型。 在這里,我們指定pretrained=True以自動下載預(yù)訓(xùn)練的模型參數(shù)。 如果首次使用此模型,則需要連接互聯(lián)網(wǎng)才能下載。

pretrained_net = torchvision.models.resnet18(pretrained=True)

預(yù)訓(xùn)練的源模型實例包含許多特征層和一個輸出層fc。 此劃分的主要目的是促進(jìn)對除輸出層以外所有層的模型參數(shù)進(jìn)行微調(diào)。 下面給出了源模型的成員變量fc,。

pretrained_net.fc


這個輸出展示了源網(wǎng)絡(luò)中分類層的結(jié)構(gòu)

Linear(in_features=512, out_features=1000, bias=True)

在ResNet的全局平均匯聚層后,全連接層轉(zhuǎn)換為ImageNet數(shù)據(jù)集的1000個類輸出。 之后,我們構(gòu)建一個新的神經(jīng)網(wǎng)絡(luò)作為目標(biāo)模型。 它的定義方式與預(yù)訓(xùn)練源模型的定義方式相同,只是最終層中的輸出數(shù)量被設(shè)置為目標(biāo)數(shù)據(jù)集中的類數(shù)(而不是1000個)。

在下面的代碼中,目標(biāo)模型finetune_net中成員變量features的參數(shù)被初始化為源模型相應(yīng)層的模型參數(shù)。 由于模型參數(shù)是在ImageNet數(shù)據(jù)集上預(yù)訓(xùn)練的,并且足夠好,因此通常只需要較小的學(xué)習(xí)率即可微調(diào)這些參數(shù)。

成員變量output的參數(shù)是隨機(jī)初始化的,通常需要更高的學(xué)習(xí)率才能從頭開始訓(xùn)練。 假設(shè)Trainer實例中的學(xué)習(xí)率為r,我們將成員變量output中參數(shù)的學(xué)習(xí)率設(shè)置為10r。


finetune_net = torchvision.models.resnet18(pretrained=True)
finetune_net.fc = nn.Linear(finetune_net.fc.in_features, 2)
nn.init.xavier_uniform_(finetune_net.fc.weight);

定義了一個訓(xùn)練函數(shù)train_fine_tuning,該函數(shù)使用微調(diào),因此可以多次調(diào)用。


# 如果param_group=True,輸出層中的模型參數(shù)將使用十倍的學(xué)習(xí)率,
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)


使用較小的學(xué)習(xí)率,通過微調(diào)預(yù)訓(xùn)練獲得的模型參數(shù)。


train_fine_tuning(finetune_net, 5e-5)


loss 0.177, train acc 0.932, test acc 0.943
968.4 examples/sec on [device(type='cuda', index=0), device(type='cuda', index=1)]


知識補(bǔ)充:

微調(diào)意味著神經(jīng)網(wǎng)絡(luò)在進(jìn)行不同的目標(biāo)檢測時,前面層的網(wǎng)絡(luò)進(jìn)行的特征提取是通用的,且越前層越通用。

當(dāng)目標(biāo)數(shù)據(jù)集和源數(shù)據(jù)集的內(nèi)容種類相差過大(比如識別癌細(xì)胞圖片,與日常圖片的imagenet差別較大)時,微調(diào)的效果可能不好

目標(biāo)與源數(shù)據(jù)集差不多,并且可能出現(xiàn)交集或包含,微調(diào) 效果可能好很多


微調(diào)屬于一種遷移學(xué)習(xí)算法。


基于大規(guī)模數(shù)據(jù)集訓(xùn)練出的源模型是一種財產(chǎn),被大公司所保密。但基于imgnet訓(xùn)練的模型用于學(xué)術(shù)研究還是夠用的。


在微調(diào)中,為了歸一化保持一致非常重要。在本節(jié)代碼中的normalize里的參數(shù)是根據(jù)imgnet計算出來的


常用的CV預(yù)訓(xùn)練模型:ResNet18







37 微調(diào)【動手學(xué)深度學(xué)習(xí)v2】的評論 (共 條)

分享到微博請遵守國家法律
桦南县| 绥江县| 滦平县| 晋州市| 思茅市| 佛山市| 翁源县| 文成县| 怀来县| 称多县| 岳阳县| 天长市| 西畴县| 金塔县| 赤壁市| 彩票| 乐安县| 墨脱县| 丹阳市| 罗平县| 大洼县| 湘乡市| 邹平县| 晴隆县| 嘉兴市| 通州市| 无为县| 射阳县| 南丰县| 临城县| 开原市| 北辰区| 赤城县| 双桥区| 昂仁县| 清涧县| 合作市| 蚌埠市| 温州市| 曲松县| 布拖县|