婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)

PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)

熱門(mén)標(biāo)簽:工廠智能電話機(jī)器人 江蘇客服外呼系統(tǒng)廠家 400電話申請(qǐng)服務(wù)商選什么 在哪里辦理400電話號(hào)碼 千陽(yáng)自動(dòng)外呼系統(tǒng) 平頂山外呼系統(tǒng)免費(fèi) 西藏智能外呼系統(tǒng)五星服務(wù) 清遠(yuǎn)360地圖標(biāo)注方法 原裝電話機(jī)器人

前言

如果你認(rèn)為深度學(xué)習(xí)非常的吃GPU,或者說(shuō)非常的耗時(shí)間,訓(xùn)練一個(gè)模型要非常久,但是你如果了解了遷移學(xué)習(xí)那你的模型可能只需要幾分鐘,而且準(zhǔn)確率不比你自己訓(xùn)練的模型準(zhǔn)確率低,本節(jié)我們將會(huì)介紹兩種方法來(lái)實(shí)現(xiàn)遷移學(xué)習(xí)

遷移學(xué)習(xí)方法介紹

  • 微調(diào)網(wǎng)絡(luò)的方法實(shí)現(xiàn)遷移學(xué)習(xí),更改最后一層全連接,并且微調(diào)訓(xùn)練網(wǎng)絡(luò)
  • 將模型看成特征提取器,如果一個(gè)模型的預(yù)訓(xùn)練模型非常的好,那完全就把前面的層看成特征提取器,凍結(jié)所有層并且更改最后一層,只訓(xùn)練最后一層,這樣我們只訓(xùn)練了最后一層,訓(xùn)練會(huì)非常的快速

 

遷移基本步驟

  •  數(shù)據(jù)的準(zhǔn)備
  • 選擇數(shù)據(jù)增廣的方式
  • 選擇合適的模型
  • 更換最后一層全連接
  • 凍結(jié)層,開(kāi)始訓(xùn)練
  • 選擇預(yù)測(cè)結(jié)果最好的模型保存

需要導(dǎo)入的包

import zipfile # 解壓文件
import torchvision
from torchvision import datasets, transforms, models
import torch
from torch.utils.data import DataLoader, Dataset
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
import copy

數(shù)據(jù)準(zhǔn)備

本次實(shí)驗(yàn)的數(shù)據(jù)到這里下載
首先按照上一章節(jié)講的數(shù)據(jù)讀取方法來(lái)準(zhǔn)備數(shù)據(jù)

# 解壓數(shù)據(jù)到指定文件
def unzip(filename, dst_dir):
  z = zipfile.ZipFile(filename)
  z.extractall(dst_dir)
unzip('./data/hymenoptera_data.zip', './data/')
# 實(shí)現(xiàn)自己的Dataset方法,主要實(shí)現(xiàn)兩個(gè)方法__len__和__getitem__
class MyDataset(Dataset):
  def __init__(self, dirname, transform=None):
    super(MyDataset, self).__init__()
    self.classes = os.listdir(dirname)
    self.images = []
    self.transform = transform
    for i, classes in enumerate(self.classes):
      classes_path = os.path.join(dirname, classes)
      for image_name in os.listdir(classes_path):
        self.images.append((os.path.join(classes_path, image_name), i))
  def __len__(self):
    return len(self.images)
  def __getitem__(self, idx):
    image_name, classes = self.images[idx]
    image = Image.open(image_name)
    if self.transform:
      image = self.transform(image)
    return image, classes
  def get_claesses(self):
    return self.classes
# 分布實(shí)現(xiàn)訓(xùn)練和預(yù)測(cè)的transform
train_transform = transforms.Compose([
  transforms.Grayscale(3),
  transforms.RandomResizedCrop(224), #隨機(jī)裁剪一個(gè)area然后再resize
  transforms.RandomHorizontalFlip(), #隨機(jī)水平翻轉(zhuǎn)
  transforms.Resize(size=(256, 256)),
  transforms.ToTensor(),
  transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
val_transform = transforms.Compose([
  transforms.Grayscale(3),
  transforms.Resize(size=(256, 256)),
  transforms.CenterCrop(224),
  transforms.ToTensor(),
  transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
])
# 分別實(shí)現(xiàn)loader
train_dataset = MyDataset('./data/hymenoptera_data/train/', train_transform)
train_loader = DataLoader(train_dataset, shuffle=True, batch_size=32)
val_dataset = MyDataset('./data/hymenoptera_data/val/', val_transform)
val_loader = DataLoader(val_dataset, shuffle=True, batch_size=32)

選擇預(yù)訓(xùn)練的模型

這里我們選擇了resnet18在ImageNet 1000類(lèi)上進(jìn)行了預(yù)訓(xùn)練的

model = models.resnet18(pretrained=True) # 使用預(yù)訓(xùn)練

使用model.buffers查看網(wǎng)絡(luò)基本結(jié)構(gòu)

bound method Module.buffers of ResNet(
 (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
 (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
 (relu): ReLU(inplace=True)
 (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
 (layer1): Sequential(
  (0): BasicBlock(
   (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
  (1): BasicBlock(
   (conv1): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
 )
 (layer2): Sequential(
  (0): BasicBlock(
   (conv1): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (downsample): Sequential(
    (0): Conv2d(64, 128, kernel_size=(1, 1), stride=(2, 2), bias=False)
    (1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   )
  )
  (1): BasicBlock(
   (conv1): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
 )
 (layer3): Sequential(
  (0): BasicBlock(
   (conv1): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (downsample): Sequential(
    (0): Conv2d(128, 256, kernel_size=(1, 1), stride=(2, 2), bias=False)
    (1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   )
  )
  (1): BasicBlock(
   (conv1): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
 )
 (layer4): Sequential(
  (0): BasicBlock(
   (conv1): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (downsample): Sequential(
    (0): Conv2d(256, 512, kernel_size=(1, 1), stride=(2, 2), bias=False)
    (1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   )
  )
  (1): BasicBlock(
   (conv1): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn1): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
   (relu): ReLU(inplace=True)
   (conv2): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
   (bn2): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )
 )
 (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
 (fc): Linear(in_features=512, out_features=1000, bias=True)
)>

我們現(xiàn)在需要做的就是將最后一層進(jìn)行替換

only_train_fc = True
if only_train_fc:
  for param in model.parameters():
    param.requires_grad_(False)
fc_in_features = model.fc.in_features
model.fc = torch.nn.Linear(fc_in_features, 2, bias=True)

注釋:only_train_fc如果我們?cè)O(shè)置為T(mén)rue那么就只訓(xùn)練最后的fc層
現(xiàn)在觀察一下可導(dǎo)的參數(shù)有那些(在只訓(xùn)練最后一層的情況下)

for i in model.parameters():
  if i.requires_grad:
    print(i)
Parameter containing:
tensor([[ 0.0342, -0.0336, 0.0279, ..., -0.0428, 0.0421, 0.0366],
    [-0.0162, 0.0286, -0.0379, ..., -0.0203, -0.0016, -0.0440]],
    requires_grad=True)
Parameter containing:
tensor([-0.0120, -0.0086], requires_grad=True)

注釋:由于最后一層使用了bias因此我們會(huì)多加兩個(gè)參數(shù)

訓(xùn)練主體的實(shí)現(xiàn)

epochs = 50
loss_fn = torch.nn.CrossEntropyLoss()
opt = torch.optim.SGD(lr=0.01, params=model.parameters())
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
# device = torch.device('cpu')
model.to(device)
opt_step = torch.optim.lr_scheduler.StepLR(opt, step_size=20, gamma=0.1)
max_acc = 0
epoch_acc = []
epoch_loss = []
for epoch in range(epochs):
  for type_id, loader in enumerate([train_loader, val_loader]):
    mean_loss = []
    mean_acc = []
    for images, labels in loader:
      if type_id == 0:
        # opt_step.step()
        model.train()
      else:
        model.eval()
      images = images.to(device)
      labels = labels.to(device).long()
      opt.zero_grad()
      with torch.set_grad_enabled(type_id==0):
        outputs = model(images)
        _, pre_labels = torch.max(outputs, 1)
        loss = loss_fn(outputs, labels)
      if type_id == 0:
        loss.backward()
        opt.step()
      acc = torch.sum(pre_labels==labels) / torch.tensor(labels.shape[0], dtype=torch.float32)    
      mean_loss.append(loss.cpu().detach().numpy())
      mean_acc.append(acc.cpu().detach().numpy())
    if type_id == 1:
      epoch_acc.append(np.mean(mean_acc))
      epoch_loss.append(np.mean(mean_loss))
      if max_acc  np.mean(mean_acc):
        max_acc = np.mean(mean_acc)
    print(type_id, np.mean(mean_loss),np.mean(mean_acc))
print(max_acc)

在使用cpu訓(xùn)練的情況,也能快速得到較好的結(jié)果,這里訓(xùn)練了50次,其實(shí)很快的就已經(jīng)得到了很好的結(jié)果了

總結(jié)

本節(jié)我們使用了預(yù)訓(xùn)練模型,發(fā)現(xiàn)大概10個(gè)epoch就可以很快的得到較好的結(jié)果了,即使在使用cpu情況下訓(xùn)練,這也是遷移學(xué)習(xí)為什么這么受歡迎的原因之一了,如果讀者有興趣可以自己試一試在不凍結(jié)層的情況下,使用方法一能否得到更好的結(jié)果

到此這篇關(guān)于PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)的文章就介紹到這了,更多相關(guān)PyTorch 遷移內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Pytorch模型遷移和遷移學(xué)習(xí),導(dǎo)入部分模型參數(shù)的操作
  • PyTorch一小時(shí)掌握之遷移學(xué)習(xí)篇

標(biāo)簽:股票 西安 日照 白城 安慶 隨州 天水 錦州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)》,本文關(guān)鍵詞  PyTorch,遷移,學(xué)習(xí),實(shí)踐,幾分鐘,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于PyTorch 遷移學(xué)習(xí)實(shí)踐(幾分鐘即可訓(xùn)練好自己的模型)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人欧美一区二区三区小说| 久久精品国产亚洲5555| 18欧美亚洲精品| 日本精品一区二区三区高清| 免播放器亚洲一区| 国产91丝袜在线播放0| 91精品国产综合久久久久| 久久综合久久99| 青青青伊人色综合久久| 精品视频资源站| 岛国av在线一区| 国产福利一区在线| 精品一区二区三区不卡 | 久久蜜桃一区二区| 欧洲一区二区三区在线| 国产精品1区二区.| 琪琪久久久久日韩精品| 狠狠色丁香久久婷婷综| 91香蕉国产在线观看软件| 午夜精品123| 国产激情偷乱视频一区二区三区| 日韩欧美国产午夜精品| 毛片基地黄久久久久久天堂| 成人免费在线播放视频| 91无套直看片红桃| heyzo一本久久综合| 亚洲综合在线第一页| 欧美欧美午夜aⅴ在线观看| 久久精品国产在热久久| 亚洲天堂成人在线观看| 欧美视频一区在线| 丁香婷婷深情五月亚洲| 三级一区在线视频先锋 | 欧美自拍偷拍一区| 精品视频一区二区三区免费| 91在线国产福利| 国产三级欧美三级日产三级99| 日韩欧美亚洲一区二区| 国产精品灌醉下药二区| 中文字幕在线不卡一区 | 日韩免费电影网站| 欧美mv日韩mv国产网站app| 国产精品色哟哟| 91啦中文在线观看| 国产成人在线网站| 久久精品99国产精品| 色88888久久久久久影院按摩| 奇米色777欧美一区二区| 亚洲欧美日韩系列| 国产精品国产自产拍高清av| 亚洲第一在线综合网站| 国产精品理伦片| 亚洲欧洲另类国产综合| 中文字幕免费不卡| 亚洲免费在线电影| 爽爽淫人综合网网站| 偷拍自拍另类欧美| 国产乱子伦视频一区二区三区| 国产麻豆视频一区二区| 国产乱码精品一区二区三区五月婷| 久久成人综合网| 日韩美女主播在线视频一区二区三区 | 91麻豆免费视频| 91福利区一区二区三区| 日本韩国视频一区二区| 日韩精品中文字幕在线不卡尤物| 日韩欧美一区二区在线视频| 亚洲视频一区在线| 国产精品私人自拍| 亚洲午夜视频在线观看| 久久99国产精品麻豆| 在线一区二区视频| 国产精品超碰97尤物18| 老鸭窝一区二区久久精品| 成人免费精品视频| 欧美日韩高清不卡| 综合激情网...| 成人免费va视频| 欧美成人一区二区| 国产伦精品一区二区三区免费迷 | 欧美一区二区三区日韩| 国产河南妇女毛片精品久久久| 色综合夜色一区| 国产精品久久国产精麻豆99网站| 亚洲v精品v日韩v欧美v专区| 99综合电影在线视频| 国产精品免费观看视频| 日本高清免费不卡视频| 亚洲六月丁香色婷婷综合久久| 成人午夜视频在线| 一区二区三区中文字幕精品精品| 欧美日韩国产一级片| 精品国产乱码久久久久久久| 欧美高清视频不卡网| 天天操天天综合网| 日韩精品一区二区三区视频在线观看| 日韩极品在线观看| 国产欧美日产一区| 色综合天天在线| 日本vs亚洲vs韩国一区三区 | 国产精品久久午夜| a亚洲天堂av| 蜜桃视频一区二区| 亚洲激情六月丁香| 欧美国产精品劲爆| 欧美一区二区三区播放老司机| 国产sm精品调教视频网站| 午夜欧美一区二区三区在线播放| 欧美精品一区二区蜜臀亚洲| 色哟哟精品一区| 成人av免费在线观看| 久久se这里有精品| 亚洲成人激情av| 亚洲激情成人在线| 亚洲免费伊人电影| 国产亚洲一二三区| 欧美成人a∨高清免费观看| 欧美精品粉嫩高潮一区二区| 色吧成人激情小说| 日本高清无吗v一区| 91在线视频免费91| 欧美影院一区二区三区| 欧美日韩亚洲综合在线 | 久久久美女毛片| 在线成人高清不卡| 欧美无乱码久久久免费午夜一区| 一本久久精品一区二区| 日本黄色一区二区| 日韩视频一区二区三区| 日韩精品一区二区三区在线| 精品日韩欧美一区二区| 欧美精品一区二区三区四区| 久久网站最新地址| 日韩理论片在线| 色诱亚洲精品久久久久久| 麻豆国产欧美一区二区三区| 黄网站免费久久| 91久久精品网| 欧美国产一区二区在线观看| 欧美国产禁国产网站cc| 五月天网站亚洲| 国产v日产∨综合v精品视频| 色婷婷香蕉在线一区二区| 欧美日韩一区二区三区在线| 欧美成人激情免费网| 亚洲国产视频一区| 97久久人人超碰| 国产亚洲欧美日韩俺去了| 亚洲成人精品在线观看| 成人性生交大片免费| 国产精品乱码人人做人人爱| 天堂久久久久va久久久久| 色婷婷一区二区三区四区| 久久久91精品国产一区二区精品 | 性做久久久久久久免费看| 波多野结衣视频一区| 欧美激情一区二区三区| 久久国产麻豆精品| 精品国产乱码91久久久久久网站| 亚洲精品视频在线观看免费| av电影在线观看一区| 国产精品婷婷午夜在线观看| 国产一区二区不卡在线| 欧美精品一区二区三区很污很色的 | 亚洲自拍偷拍网站| 成人97人人超碰人人99| 亚洲青青青在线视频| 欧美日韩免费一区二区三区视频| 性做久久久久久免费观看 | 欧美绝品在线观看成人午夜影视| 日韩制服丝袜av| 国产午夜亚洲精品不卡| 欧洲亚洲精品在线| 久久精品99久久久| 亚洲欧洲日韩在线| 在线播放国产精品二区一二区四区 | 亚洲高清在线精品| 26uuu精品一区二区在线观看| 菠萝蜜视频在线观看一区| 亚洲成年人影院| 国产精品视频一二三| 日韩免费成人网| 欧美裸体一区二区三区| 国产精品99久久久久久似苏梦涵| 亚洲欧美电影一区二区| 国产亚洲一区二区在线观看| 欧美日韩激情一区| 91麻豆视频网站| 成熟亚洲日本毛茸茸凸凹| 久久av资源站| 国产真实乱对白精彩久久| 久久99精品国产麻豆婷婷| 亚洲国产精品久久不卡毛片| 中文字幕欧美一| 亚洲欧美日韩中文播放 | 国产剧情一区二区| 久久99久久99| 国产一区二区按摩在线观看| 美女尤物国产一区| 国产高清一区日本|