欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁 > 知識庫 > pytorch finetuning 自己的圖片進行訓練操作

pytorch finetuning 自己的圖片進行訓練操作

熱門標簽:騰訊地圖標注沒法顯示 聊城語音外呼系統 南陽打電話機器人 商家地圖標注海報 地圖標注自己和別人標注區別 海外網吧地圖標注注冊 打電話機器人營銷 ai電銷機器人的優勢 孝感營銷電話機器人效果怎么樣

一、pytorch finetuning 自己的圖片進行訓練

這種讀取圖片的方式用的是torch自帶的 ImageFolder,讀取的文件夾必須在一個大的子文件下,按類別歸好類。

就像我現在要區分三個類別。

#perpare data set
#train data
train_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/trainData',transform=transforms.Compose(
         [
            transforms.Scale(256),
            transforms.CenterCrop(224),
            transforms.ToTensor()
       ]))
print(len(train_data))
train_loader=DataLoader(train_data,batch_size=20,shuffle=True)

然后就是fine tuning自己的網絡,在torch中可以對整個網絡修改后,訓練全部的參數也可以只訓練其中的一部分,我這里就只訓練最后一個全連接層。

torchvision中提供了很多常用的模型,比如resnet ,Vgg,Alexnet等等

# prepare model
mode1_ft_res18=torchvision.models.resnet18(pretrained=True)
for param in mode1_ft_res18.parameters():
    param.requires_grad=False
num_fc=mode1_ft_res18.fc.in_features
mode1_ft_res18.fc=torch.nn.Linear(num_fc,3)

定義自己的優化器,注意這里的參數只傳入最后一層的

#loss function and optimizer
criterion=torch.nn.CrossEntropyLoss()
#parameters only train the last fc layer
optimizer=torch.optim.Adam(mode1_ft_res18.fc.parameters(),lr=0.001)

然后就可以開始訓練了,定義好各種參數。

#start train
#label  not  one-hot encoder
EPOCH=1
for epoch in range(EPOCH):
    train_loss=0.
    train_acc=0.
    for step,data in enumerate(train_loader):
        batch_x,batch_y=data
        batch_x,batch_y=Variable(batch_x),Variable(batch_y)
        #batch_y not one hot
        #out is the probability of eatch class
        # such as one sample[-1.1009  0.1411  0.0320],need to calculate the max index
        # out shape is batch_size * class
        out=mode1_ft_res18(batch_x)
        loss=criterion(out,batch_y)
        train_loss+=loss.data[0]
        # pred is the expect class
        #batch_y is the true label
        pred=torch.max(out,1)[1]
        train_correct=(pred==batch_y).sum()
        train_acc+=train_correct.data[0]
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step%14==0:
            print('Epoch: ',epoch,'Step',step,
                  'Train_loss: ',train_loss/((step+1)*20),'Train acc: ',train_acc/((step+1)*20))

測試部分和訓練部分類似這里就不一一說明。

這樣就完整了對自己網絡的訓練測試,完整代碼如下:

import torch
import numpy as np
import torchvision
from torchvision import transforms,utils
from torch.utils.data import DataLoader
from torch.autograd import Variable
#perpare data set
#train data
train_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/trainData',transform=transforms.Compose(
           [
               transforms.Scale(256),
               transforms.CenterCrop(224),
               transforms.ToTensor()
         ]))
print(len(train_data))
train_loader=DataLoader(train_data,batch_size=20,shuffle=True)
 
#test data
test_data=torchvision.datasets.ImageFolder('F:/eyeDataSet/testData',transform=transforms.Compose(
           [
         transforms.Scale(256),
         transforms.CenterCrop(224),
         transforms.ToTensor()
         ]))
test_loader=DataLoader(test_data,batch_size=20,shuffle=True)
 
# prepare model
mode1_ft_res18=torchvision.models.resnet18(pretrained=True)
for param in mode1_ft_res18.parameters():
    param.requires_grad=False
num_fc=mode1_ft_res18.fc.in_features
mode1_ft_res18.fc=torch.nn.Linear(num_fc,3)
 
#loss function and optimizer
criterion=torch.nn.CrossEntropyLoss()
#parameters only train the last fc layer
optimizer=torch.optim.Adam(mode1_ft_res18.fc.parameters(),lr=0.001)
 
#start train
#label  not  one-hot encoder
EPOCH=1
for epoch in range(EPOCH):
    train_loss=0.
    train_acc=0.
    for step,data in enumerate(train_loader):
        batch_x,batch_y=data
        batch_x,batch_y=Variable(batch_x),Variable(batch_y)
        #batch_y not one hot
        #out is the probability of eatch class
        # such as one sample[-1.1009  0.1411  0.0320],need to calculate the max index
        # out shape is batch_size * class
        out=mode1_ft_res18(batch_x)
        loss=criterion(out,batch_y)
        train_loss+=loss.data[0]
        # pred is the expect class
        #batch_y is the true label
        pred=torch.max(out,1)[1]
        train_correct=(pred==batch_y).sum()
        train_acc+=train_correct.data[0]
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        if step%14==0:
            print('Epoch: ',epoch,'Step',step,
                  'Train_loss: ',train_loss/((step+1)*20),'Train acc: ',train_acc/((step+1)*20))
 
    #print('Epoch: ', epoch, 'Train_loss: ', train_loss / len(train_data), 'Train acc: ', train_acc / len(train_data))
 
# test model
mode1_ft_res18.eval()
eval_loss=0
eval_acc=0
for step ,data in enumerate(test_loader):
    batch_x,batch_y=data
    batch_x,batch_y=Variable(batch_x),Variable(batch_y)
    out=mode1_ft_res18(batch_x)
    loss = criterion(out, batch_y)
    eval_loss += loss.data[0]
    # pred is the expect class
    # batch_y is the true label
    pred = torch.max(out, 1)[1]
    test_correct = (pred == batch_y).sum()
    eval_acc += test_correct.data[0]
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
print( 'Test_loss: ', eval_loss / len(test_data), 'Test acc: ', eval_acc / len(test_data))

二、PyTorch 利用預訓練模型進行Fine-tuning

在Deep Learning領域,很多子領域的應用,比如一些動物識別,食物的識別等,公開的可用的數據庫相對于ImageNet等數據庫而言,其規模太小了,無法利用深度網絡模型直接train from scratch,容易引起過擬合,這時就需要把一些在大規模數據庫上已經訓練完成的模型拿過來,在目標數據庫上直接進行Fine-tuning(微調),這個已經經過訓練的模型對于目標數據集而言,只是一種相對較好的參數初始化方法而已,尤其是大數據集與目標數據集結構比較相似的話,經過在目標數據集上微調能夠得到不錯的效果。

Fine-tune預訓練網絡的步驟:

1. 首先更改預訓練模型分類層全連接層的數目,因為一般目標數據集的類別數與大規模數據庫的類別數不一致,更改為目標數據集上訓練集的類別數目即可,一致的話則無需更改;

2. 把分類器前的網絡的所有層的參數固定,即不讓它們參與學習,不進行反向傳播,只訓練分類層的網絡,這時學習率可以設置的大一點,如是原來初始學習率的10倍或幾倍或0.01等,這時候網絡訓練的比較快,因為除了分類層,其它層不需要進行反向傳播,可以多嘗試不同的學習率設置。

3.接下來是設置相對較小的學習率,對整個網絡進行訓練,這時網絡訓練變慢啦。

下面對利用PyTorch深度學習框架Fine-tune預訓練網絡的過程中涉及到的固定可學習參數,對不同的層設置不同的學習率等進行詳細講解。

1. PyTorch對某些層固定網絡的可學習參數的方法:

class Net(nn.Module):
    def __init__(self, num_classes=546):
        super(Net, self).__init__()
        self.features = nn.Sequential(
 
            nn.Conv2d(1, 64, kernel_size=3, stride=2, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
        )
 
        self.Conv1_1 = nn.Sequential(
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
        )
 
  for p in self.parameters():
            p.requires_grad=False
        self.Conv1_2 = nn.Sequential(
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
 
            nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1),
            nn.BatchNorm2d(64),
        )

如上述代碼,則模型Net網絡中self.features與self.Conv1_1層中的參數便是固定,不可學習的。這主要看代碼:

for p in self.parameters():
    p.requires_grad=False

插入的位置,這段代碼前的所有層的參數是不可學習的,也就沒有反向傳播過程。也可以指定某一層的參數不可學習,如下:

for p in  self.features.parameters():
    p.requires_grad=False

則 self.features層所有參數均是不可學習的。

注意,上述代碼設置若要真正生效,在訓練網絡時需要在設置優化器如下:

 optimizer = torch.optim.SGD(filter(lambda p: p.requires_grad, model.parameters()), args.lr,
        momentum=args.momentum,
        weight_decay=args.weight_decay)

2. PyTorch之為不同的層設置不同的學習率

model = Net()
conv1_2_params = list(map(id, model.Conv1_2.parameters()))
base_params = filter(lambda p: id(p) not in conv1_2_params,
                     model.parameters())
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}], args.lr,             
            momentum=args.momentum, weight_decay=args.weight_decay)

上述代碼表示將模型Net網絡的 self.Conv1_2層的學習率設置為傳入學習率的10倍,base_params的學習沒有明確設置,則默認為傳入的學習率args.lr。

注意:

[{'params': base_params}, {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}]

表示為列表中的字典結構。

這種方法設置不同的學習率顯得不夠靈活,可以為不同的層設置靈活的學習率,可以采用如下方法在adjust_learning_rate函數中設置:

def adjust_learning_rate(optimizer, epoch, args):
    lre = []
    lre.extend([0.01] * 10)
    lre.extend([0.005] * 10)
    lre.extend([0.0025] * 10)
    lr = lre[epoch]
    optimizer.param_groups[0]['lr'] = 0.9 * lr
    optimizer.param_groups[1]['lr'] = 10 * lr
    print(param_group[0]['lr'])
    print(param_group[1]['lr'])

上述代碼中的optimizer.param_groups[0]就代表[{'params': base_params}, {'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr}]中的'params': base_params},optimizer.param_groups[1]代表{'params': model.Conv1_2.parameters(), 'lr': 10 * args.lr},這里設置的學習率會把args.lr給覆蓋掉,個人認為上述代碼在設置學習率方面更靈活一些。上述代碼也可如下變成實現(注意學習率隨便設置的,未與上述代碼保持一致):

def adjust_learning_rate(optimizer, epoch, args):
    lre = np.logspace(-2, -4, 40)
    lr = lre[epoch]
    for i in range(len(optimizer.param_groups)):
        param_group = optimizer.param_groups[i]
        if i == 0:
            param_group['lr'] = 0.9 * lr
        else:
            param_group['lr'] = 10 * lr
        print(param_group['lr'])

下面貼出SGD優化器的PyTorch實現,及其每個參數的設置和表示意義,具體如下:

import torch
from .optimizer import Optimizer, required
 
class SGD(Optimizer):
    r"""Implements stochastic gradient descent (optionally with momentum).
    Nesterov momentum is based on the formula from
    `On the importance of initialization and momentum in deep learning`__.
    Args:
        params (iterable): iterable of parameters to optimize or dicts defining
            parameter groups
        lr (float): learning rate
        momentum (float, optional): momentum factor (default: 0)
        weight_decay (float, optional): weight decay (L2 penalty) (default: 0)
        dampening (float, optional): dampening for momentum (default: 0)
        nesterov (bool, optional): enables Nesterov momentum (default: False)
    Example:
        >>> optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)
        >>> optimizer.zero_grad()
        >>> loss_fn(model(input), target).backward()
        >>> optimizer.step()
    __ http://www.cs.toronto.edu/%7Ehinton/absps/momentum.pdf
    .. note::
        The implementation of SGD with Momentum/Nesterov subtly differs from
        Sutskever et. al. and implementations in some other frameworks.
        Considering the specific case of Momentum, the update can be written as
        .. math::
                  v = \rho * v + g \\
                  p = p - lr * v
        where p, g, v and :math:`\rho` denote the parameters, gradient,
        velocity, and momentum respectively.
        This is in contrast to Sutskever et. al. and
        other frameworks which employ an update of the form
        .. math::
             v = \rho * v + lr * g \\
             p = p - v
        The Nesterov version is analogously modified.
    """
 
    def __init__(self, params, lr=required, momentum=0, dampening=0,
                 weight_decay=0, nesterov=False):
        if lr is not required and lr  0.0:
            raise ValueError("Invalid learning rate: {}".format(lr))
        if momentum  0.0:
            raise ValueError("Invalid momentum value: {}".format(momentum))
        if weight_decay  0.0:
            raise ValueError("Invalid weight_decay value: {}".format(weight_decay))
 
        defaults = dict(lr=lr, momentum=momentum, dampening=dampening,
                        weight_decay=weight_decay, nesterov=nesterov)
        if nesterov and (momentum = 0 or dampening != 0):
            raise ValueError("Nesterov momentum requires a momentum and zero dampening")
        super(SGD, self).__init__(params, defaults)
 
    def __setstate__(self, state):
        super(SGD, self).__setstate__(state)
        for group in self.param_groups:
            group.setdefault('nesterov', False)
 
    def step(self, closure=None):
        """Performs a single optimization step.
        Arguments:
            closure (callable, optional): A closure that reevaluates the model
                and returns the loss.
        """
        loss = None
        if closure is not None:
            loss = closure()
 
        for group in self.param_groups:
            weight_decay = group['weight_decay']
            momentum = group['momentum']
            dampening = group['dampening']
            nesterov = group['nesterov']
 
            for p in group['params']:
                if p.grad is None:
                    continue
                d_p = p.grad.data
                if weight_decay != 0:
                    d_p.add_(weight_decay, p.data)
                if momentum != 0:
                    param_state = self.state[p]
                    if 'momentum_buffer' not in param_state:
                        buf = param_state['momentum_buffer'] = torch.zeros_like(p.data)
                        buf.mul_(momentum).add_(d_p)
                    else:
                        buf = param_state['momentum_buffer']
                        buf.mul_(momentum).add_(1 - dampening, d_p)
                    if nesterov:
                        d_p = d_p.add(momentum, buf)
                    else:
                        d_p = buf
 
                p.data.add_(-group['lr'], d_p)
 
        return loss

經驗總結:

在Fine-tuning時最好不要隔層設置層的參數的可學習與否,這樣做一般效果餅不理想,一般準則即可,即先Fine-tuning分類層,學習率設置的大一些,然后在將整個網絡設置一個較小的學習率,所有層一起訓練。

至于不先經過Fine-tune分類層,而是將整個網絡所有層一起訓練,只是分類層的學習率相對設置大一些,這樣做也可以,至于哪個效果更好,沒評估過。當用三元組損失(triplet loss)微調用softmax loss訓練的網絡時,可以設置階梯型的較小學習率,整個網絡所有層一起訓練,效果比較好,而不用先Fine-tune分類層前一層的輸出。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • pytorch 實現將自己的圖片數據處理成可以訓練的圖片類型
  • pytorch 準備、訓練和測試自己的圖片數據的方法
  • Pytorch自己加載單通道圖片用作數據集訓練的實例
  • Pytorch之finetune使用詳解

標簽:南寧 牡丹江 六盤水 聊城 揚州 楊凌 撫州 迪慶

巨人網絡通訊聲明:本文標題《pytorch finetuning 自己的圖片進行訓練操作》,本文關鍵詞  pytorch,finetuning,自己的,圖片,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《pytorch finetuning 自己的圖片進行訓練操作》相關的同類信息!
  • 本頁收集關于pytorch finetuning 自己的圖片進行訓練操作的相關信息資訊供網民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    国产精品1区2区| 国产喷水在线观看| 欧美日韩一区二区在线观看| 日韩一区中文字幕| 国产高清无密码一区二区三区| brazzers精品成人一区| 日韩免费视频一区二区| 日本午夜精品视频在线观看| 污污污www精品国产网站| 欧美精品在线观看播放| 偷拍亚洲欧洲综合| 久久久久亚洲无码| 欧美一区二区三区四区在线观看 | jizzjizzjizz国产| 国产色一区二区| 国产精品综合一区二区| 日本免费网站视频| 国产精品美女一区二区三区| www.日韩av| 欧美艳星brazzers| 亚洲图片欧美综合| 在线精品一区二区三区| 精品欧美一区二区三区精品久久| 免费成人你懂的| 日本免费www| 国产精品毛片a∨一区二区三区| 成人av影院在线| 在线观看av一区二区| 亚洲一区二区免费视频| 久久精品女同亚洲女同13| 日韩欧美久久久| 国产中文一区二区三区| 97精品在线播放| 亚洲欧美在线视频| 91人人澡人人爽| 欧美zozo另类异族| 国产成人高清视频| 欧美中文字幕一区二区三区| 五月综合激情婷婷六月色窝| 免费网站在线高清观看| 国产精品国产三级国产aⅴ入口| av一区二区三区| 69精品人人人人| 精品一二三四区| 手机在线免费看毛片| 一区二区三区日韩精品视频| 7788色淫网站小说| 中文字幕不卡一区| 国产a级片视频| 久久综合九色综合久久久精品综合| 国产精品一二三四| 欧美性大战久久久| 久久精品国产一区二区三区免费看| 任你操精品视频| 一区二区欧美国产| 女人黄色一级片| 亚洲精品视频一区二区| 一二三不卡视频| 国产精品毛片大码女人 | **性色生活片久久毛片| 亚洲高清无码久久| 国产欧美精品一区aⅴ影院| 少妇欧美激情一区二区三区| 精品国产在天天线2019| 国产91丝袜在线观看| 欧美精选午夜久久久乱码6080| 国产在线精品视频| 欧美人妇做爰xxxⅹ性高电影| 国产曰批免费观看久久久| 欧美综合亚洲图片综合区| 蜜臂av日日欢夜夜爽一区| 美女的奶胸大爽爽大片| 日本 国产 欧美色综合| 国产大学生自拍| 久久精品国产色蜜蜜麻豆| 色噜噜久久综合| 激情国产一区二区| 欧美片网站yy| 成人福利电影精品一区二区在线观看| 欧美一区二区三区免费视频 | 捆绑凌虐一区二区三区| 国产精品嫩草影院av蜜臀| 插吧插吧综合网| 亚洲一区二区三区在线播放| 影音先锋男人资源在线观看| 日韩综合一区二区| 91国产成人在线| 国产成人av网站| 精品国产一二三区| 久久久久亚洲av成人网人人软件| 国产精品色在线观看| 精品无人区无码乱码毛片国产 | 人妻巨大乳一二三区| 欧美高清在线一区| 免费黄色在线视频| 丝袜美腿高跟呻吟高潮一区| 在线观看日产精品| 成人激情午夜影院| 国产午夜精品久久久久久久| 人妻无码中文久久久久专区| 一区二区三区日韩欧美| 亚洲国产美女视频| 国产精品一区二区久久不卡| 日韩欧美电影在线| 91丨porny丨对白| 一区二区三区四区在线免费观看| www.97视频| 国产电影精品久久禁18| 久久色视频免费观看| 久久美女免费视频| 老色鬼精品视频在线观看播放| 欧美一区二区三级| 7788色淫网站小说| 色婷婷久久久综合中文字幕| 国产伦精一区二区三区| 亚洲精品一区二区三区精华液 | 亚洲免费视频中文字幕| 日韩在线不卡av| 国产精品一区在线| 国产亚洲精品7777| 日本精品久久久久中文| 国产综合色视频| 久久久久久久久久美女| 调教驯服丰满美艳麻麻在线视频| 看国产成人h片视频| 欧美本精品男人aⅴ天堂| 成人午夜剧场视频网站| 久久99精品国产.久久久久久| 欧美成人一区二区| 无套内谢大学处破女www小说| 亚洲国产精品久久人人爱蜜臀 | 91黄色免费看| 91视频在线观看| 夜夜爽夜夜爽精品视频| 欧美亚洲一区三区| 黑人无套内谢中国美女| 亚洲va欧美va天堂v国产综合| 欧美精品在欧美一区二区少妇| 久久久老熟女一区二区三区91| 婷婷国产在线综合| 日韩欧美123| 欧美成人国产精品一区二区| 久久精品99国产国产精| 久久免费美女视频| 久久99久久99精品免费看小说| 国产成a人亚洲| 一区二区三区自拍| 欧美二区乱c少妇| 91精品人妻一区二区三区蜜桃欧美| 久久99久久精品| 日本一区二区三区四区 | 免费中文字幕在线| 99国产欧美另类久久久精品 | 北条麻妃在线观看视频| 成人av午夜电影| 亚洲一级片在线观看| 日韩一级片网址| 日本黄色激情视频| 99久久精品国产导航| 午夜视频在线观看一区二区三区| 日韩精品中午字幕| 少妇视频在线播放| 99国产精品久久久久久久久久久 | 国产真实乱人偷精品| 另类综合日韩欧美亚洲| 国产精品看片你懂得| 欧美日韩高清一区二区不卡| 亚洲色图14p| 国产成人自拍高清视频在线免费播放| 国产精品国产三级国产普通话蜜臀 | 国产色产综合产在线视频| 无码人妻精品一区二区三区夜夜嗨| 91欧美一区二区| 日本免费新一区视频| 中文字幕国产一区| 欧美嫩在线观看| 夫妇交换中文字幕| 91首页免费视频| 蜜桃视频一区二区三区| 亚洲欧洲av一区二区三区久久| 91精品免费在线观看| 五月天免费网站| 色哟哟无码精品一区二区三区| 九色porny丨国产精品| 亚洲日本韩国一区| 精品国产网站在线观看| 91传媒视频在线播放| 成年人免费观看视频网站| av中文字幕不卡| 男男gaygay亚洲| 亚洲日本欧美天堂| 久久婷婷色综合| 欧美日韩国产一级片| jizzjizzjizz国产| 亚洲精品在线视频免费观看| 成人福利在线看| 国内精品国产三级国产a久久| 亚洲一区在线视频观看| 欧美经典一区二区| 欧美一级搡bbbb搡bbbb|