在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

pytorch實(shí)現(xiàn)斷電繼續(xù)訓(xùn)練時(shí)需要注意的要點(diǎn)

新機(jī)器視覺 ? 來(lái)源:新機(jī)器視覺 ? 作者:新機(jī)器視覺 ? 2022-08-22 09:50 ? 次閱讀

導(dǎo)讀

本文整理了pytorch實(shí)現(xiàn)斷電繼續(xù)訓(xùn)練時(shí)需要注意的要點(diǎn),附有代碼詳解。

最近在嘗試用CIFAR10訓(xùn)練分類問題的時(shí)候,由于數(shù)據(jù)集體量比較大,訓(xùn)練的過(guò)程中時(shí)間比較長(zhǎng),有時(shí)候想給停下來(lái),但是停下來(lái)了之后就得重新訓(xùn)練,之前師兄讓我們學(xué)習(xí)斷點(diǎn)繼續(xù)訓(xùn)練及繼續(xù)訓(xùn)練的時(shí)候注意epoch的改變等,今天上午給大致整理了一下,不全面僅供參考


Epoch:  9 | train loss: 0.3517 | test accuracy: 0.7184 | train time: 14215.1018  sEpoch:  9 | train loss: 0.2471 | test accuracy: 0.7252 | train time: 14309.1216  sEpoch:  9 | train loss: 0.4335 | test accuracy: 0.7201 | train time: 14403.2398  sEpoch:  9 | train loss: 0.2186 | test accuracy: 0.7242 | train time: 14497.1921  sEpoch:  9 | train loss: 0.2127 | test accuracy: 0.7196 | train time: 14591.4974  sEpoch:  9 | train loss: 0.1624 | test accuracy: 0.7142 | train time: 14685.7034  sEpoch:  9 | train loss: 0.1795 | test accuracy: 0.7170 | train time: 14780.2831  s絕望!!!!!訓(xùn)練到了一定次數(shù)發(fā)現(xiàn)訓(xùn)練次數(shù)少了,或者中途斷了又得重新開始訓(xùn)練

一、模型的保存與加載

PyTorch中的保存(序列化,從內(nèi)存到硬盤)與反序列化(加載,從硬盤到內(nèi)存)

torch.save主要參數(shù):obj:對(duì)象 、f:輸出路徑

torch.load 主要參數(shù) :f:文件路徑 、map_location:指定存放位置、 cpu or gpu

模型的保存的兩種方法:

1、保存整個(gè)Module


torch.save(net, path)

2、保存模型參數(shù)


state_dict = net.state_dict()torch.save(state_dict , path)

二、模型的訓(xùn)練過(guò)程中保存


checkpoint = {        "net": model.state_dict(),        'optimizer':optimizer.state_dict(),        "epoch": epoch    }

網(wǎng)絡(luò)訓(xùn)練過(guò)程中的網(wǎng)絡(luò)的權(quán)重,優(yōu)化器的權(quán)重保存,以及epoch 保存,便于繼續(xù)訓(xùn)練恢復(fù)

在訓(xùn)練過(guò)程中,可以根據(jù)自己的需要,每多少代,或者多少epoch保存一次網(wǎng)絡(luò)參數(shù),便于恢復(fù),提高程序的魯棒性。

checkpoint = {        "net": model.state_dict(),        'optimizer':optimizer.state_dict(),        "epoch": epoch    }    if not os.path.isdir("./models/checkpoint"):        os.mkdir("./models/checkpoint")torch.save(checkpoint,'./models/checkpoint/ckpt_best_%s.pth'%(str(epoch)))
通過(guò)上述的過(guò)程可以在訓(xùn)練過(guò)程自動(dòng)在指定位置創(chuàng)建文件夾,并保存斷點(diǎn)文件

e331992c-20d9-11ed-ba43-dac502259ad0.png

三、模型的斷點(diǎn)繼續(xù)訓(xùn)練


if RESUME:    path_checkpoint = "./models/checkpoint/ckpt_best_1.pth"  # 斷點(diǎn)路徑    checkpoint = torch.load(path_checkpoint)  # 加載斷點(diǎn)
    model.load_state_dict(checkpoint['net'])  # 加載模型可學(xué)習(xí)參數(shù)
    optimizer.load_state_dict(checkpoint['optimizer'])  # 加載優(yōu)化器參數(shù)    start_epoch = checkpoint['epoch']  # 設(shè)置開始的epoch

指出這里的是否繼續(xù)訓(xùn)練,及訓(xùn)練的checkpoint的文件位置等可以通過(guò)argparse從命令行直接讀取,也可以通過(guò)log文件直接加載,也可以自己在代碼中進(jìn)行修改。關(guān)于argparse參照我的這一篇文章:

HUST小菜雞:argparse 命令行選項(xiàng)、參數(shù)和子命令解析器

https://zhuanlan.zhihu.com/p/133285373

四、重點(diǎn)在于epoch的恢復(fù)


start_epoch = -1

if RESUME:    path_checkpoint = "./models/checkpoint/ckpt_best_1.pth"  # 斷點(diǎn)路徑    checkpoint = torch.load(path_checkpoint)  # 加載斷點(diǎn)
    model.load_state_dict(checkpoint['net'])  # 加載模型可學(xué)習(xí)參數(shù)
    optimizer.load_state_dict(checkpoint['optimizer'])  # 加載優(yōu)化器參數(shù)    start_epoch = checkpoint['epoch']  # 設(shè)置開始的epoch


for epoch in  range(start_epoch + 1 ,EPOCH):    # print('EPOCH:',epoch)    for step, (b_img,b_label) in enumerate(train_loader):        train_output = model(b_img)        loss = loss_func(train_output,b_label)        # losses.append(loss)        optimizer.zero_grad()        loss.backward()        optimizer.step()

通過(guò)定義start_epoch變量來(lái)保證繼續(xù)訓(xùn)練的時(shí)候epoch不會(huì)變化

e340886a-20d9-11ed-ba43-dac502259ad0.jpg

斷點(diǎn)繼續(xù)訓(xùn)練

一、初始化隨機(jī)數(shù)種子


import torchimport randomimport numpy as np
def set_random_seed(seed = 10,deterministic=False,benchmark=False):    random.seed(seed)    np.random(seed)    torch.manual_seed(seed)    torch.cuda.manual_seed_all(seed)    if deterministic:        torch.backends.cudnn.deterministic = True    if benchmark:        torch.backends.cudnn.benchmark = True

關(guān)于torch.backends.cudnn.deterministic和torch.backends.cudnn.benchmark詳見

Pytorch學(xué)習(xí)0.01:cudnn.benchmark= True的設(shè)置

https://www.cnblogs.com/captain-dl/p/11938864.html

pytorch---之cudnn.benchmark和cudnn.deterministic_人工智能_zxyhhjs2017的博客

https://blog.csdn.net/zxyhhjs2017/article/details/91348108

e34baefc-20d9-11ed-ba43-dac502259ad0.png

benchmark用在輸入尺寸一致,可以加速訓(xùn)練,deterministic用來(lái)固定內(nèi)部隨機(jī)性

二、多步長(zhǎng)SGD繼續(xù)訓(xùn)練

在簡(jiǎn)單的任務(wù)中,我們使用固定步長(zhǎng)(也就是學(xué)習(xí)率LR)進(jìn)行訓(xùn)練,但是如果學(xué)習(xí)率lr設(shè)置的過(guò)小的話,則會(huì)導(dǎo)致很難收斂,如果學(xué)習(xí)率很大的時(shí)候,就會(huì)導(dǎo)致在最小值附近,總會(huì)錯(cuò)過(guò)最小值,loss產(chǎn)生震蕩,無(wú)法收斂。所以這要求我們要對(duì)于不同的訓(xùn)練階段使用不同的學(xué)習(xí)率,一方面可以加快訓(xùn)練的過(guò)程,另一方面可以加快網(wǎng)絡(luò)收斂。

采用多步長(zhǎng) torch.optim.lr_scheduler的多種步長(zhǎng)設(shè)置方式來(lái)實(shí)現(xiàn)步長(zhǎng)的控制,lr_scheduler的各種使用推薦參考如下教程

【轉(zhuǎn)載】 Pytorch中的學(xué)習(xí)率調(diào)整lr_scheduler,ReduceLROnPlateau

https://www.cnblogs.com/devilmaycry812839668/p/10630302.html

所以我們?cè)诒4婢W(wǎng)絡(luò)中的訓(xùn)練的參數(shù)的過(guò)程中,還需要保存lr_scheduler的state_dict,然后斷點(diǎn)繼續(xù)訓(xùn)練的時(shí)候恢復(fù)

#這里我設(shè)置了不同的epoch對(duì)應(yīng)不同的學(xué)習(xí)率衰減,在10->20->30,學(xué)習(xí)率依次衰減為原來(lái)的0.1,即一個(gè)數(shù)量級(jí)lr_schedule = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[10,20,30,40,50],gamma=0.1)optimizer = torch.optim.SGD(model.parameters(),lr=0.1)
for epoch in range(start_epoch+1,80):    optimizer.zero_grad()    optimizer.step()    lr_schedule.step()
    if epoch %10 ==0:        print('epoch:',epoch)print('learningrate:',optimizer.state_dict()['param_groups'][0]['lr'])
lr的變化過(guò)程如下:

epoch: 10learning rate: 0.1epoch: 20learning rate: 0.010000000000000002epoch: 30learning rate: 0.0010000000000000002epoch: 40learning rate: 0.00010000000000000003epoch: 50learning rate: 1.0000000000000004e-05epoch: 60learning rate: 1.0000000000000004e-06epoch: 70learning rate: 1.0000000000000004e-06

我們?cè)诒4娴臅r(shí)候,也需要對(duì)lr_scheduler的state_dict進(jìn)行保存,斷點(diǎn)繼續(xù)訓(xùn)練的時(shí)候也需要恢復(fù)lr_scheduler

#加載恢復(fù)if RESUME:    path_checkpoint = "./model_parameter/test/ckpt_best_50.pth"  # 斷點(diǎn)路徑    checkpoint = torch.load(path_checkpoint)  # 加載斷點(diǎn)
    model.load_state_dict(checkpoint['net'])  # 加載模型可學(xué)習(xí)參數(shù)
    optimizer.load_state_dict(checkpoint['optimizer'])  # 加載優(yōu)化器參數(shù)    start_epoch = checkpoint['epoch']  # 設(shè)置開始的epoch    lr_schedule.load_state_dict(checkpoint['lr_schedule'])#加載lr_scheduler


#保存for epoch in range(start_epoch+1,80):
    optimizer.zero_grad()
    optimizer.step()    lr_schedule.step()

    if epoch %10 ==0:        print('epoch:',epoch)        print('learning rate:',optimizer.state_dict()['param_groups'][0]['lr'])        checkpoint = {            "net": model.state_dict(),            'optimizer': optimizer.state_dict(),            "epoch": epoch,            'lr_schedule': lr_schedule.state_dict()        }        if not os.path.isdir("./model_parameter/test"):            os.mkdir("./model_parameter/test")torch.save(checkpoint,'./model_parameter/test/ckpt_best_%s.pth'%(str(epoch)))

三、保存最好的結(jié)果

每一個(gè)epoch中的每個(gè)step會(huì)有不同的結(jié)果,可以保存每一代最好的結(jié)果,用于后續(xù)的訓(xùn)練

第一次實(shí)驗(yàn)代碼

RESUME = True
EPOCH = 40LR = 0.0005

model = cifar10_cnn.CIFAR10_CNN()
print(model)optimizer = torch.optim.Adam(model.parameters(),lr=LR)loss_func = nn.CrossEntropyLoss()
start_epoch = -1

if RESUME:    path_checkpoint = "./models/checkpoint/ckpt_best_1.pth"  # 斷點(diǎn)路徑    checkpoint = torch.load(path_checkpoint)  # 加載斷點(diǎn)
    model.load_state_dict(checkpoint['net'])  # 加載模型可學(xué)習(xí)參數(shù)
    optimizer.load_state_dict(checkpoint['optimizer'])  # 加載優(yōu)化器參數(shù)    start_epoch = checkpoint['epoch']  # 設(shè)置開始的epoch


for epoch in  range(start_epoch + 1 ,EPOCH):    # print('EPOCH:',epoch)    for step, (b_img,b_label) in enumerate(train_loader):        train_output = model(b_img)        loss = loss_func(train_output,b_label)        # losses.append(loss)        optimizer.zero_grad()        loss.backward()        optimizer.step()
        if step % 100 == 0:            now = time.time()            print('EPOCH:',epoch,'| step :',step,'| loss :',loss.data.numpy(),'| train time: %.4f'%(now-start_time))
    checkpoint = {        "net": model.state_dict(),        'optimizer':optimizer.state_dict(),        "epoch": epoch    }    if not os.path.isdir("./models/checkpoint"):        os.mkdir("./models/checkpoint")torch.save(checkpoint,'./models/checkpoint/ckpt_best_%s.pth'%(str(epoch)))

更新實(shí)驗(yàn)代碼

optimizer = torch.optim.SGD(model.parameters(),lr=0.1)lr_schedule = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=[10,20,30,40,50],gamma=0.1)start_epoch = 9# print(schedule)

if RESUME:    path_checkpoint = "./model_parameter/test/ckpt_best_50.pth"  # 斷點(diǎn)路徑    checkpoint = torch.load(path_checkpoint)  # 加載斷點(diǎn)
    model.load_state_dict(checkpoint['net'])  # 加載模型可學(xué)習(xí)參數(shù)
    optimizer.load_state_dict(checkpoint['optimizer'])  # 加載優(yōu)化器參數(shù)    start_epoch = checkpoint['epoch']  # 設(shè)置開始的epoch    lr_schedule.load_state_dict(checkpoint['lr_schedule'])
for epoch in range(start_epoch+1,80):
    optimizer.zero_grad()
    optimizer.step()    lr_schedule.step()

    if epoch %10 ==0:        print('epoch:',epoch)        print('learning rate:',optimizer.state_dict()['param_groups'][0]['lr'])        checkpoint = {            "net": model.state_dict(),            'optimizer': optimizer.state_dict(),            "epoch": epoch,            'lr_schedule': lr_schedule.state_dict()        }        if not os.path.isdir("./model_parameter/test"):            os.mkdir("./model_parameter/test")torch.save(checkpoint,'./model_parameter/test/ckpt_best_%s.pth'%(str(epoch)))
審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7139

    瀏覽量

    89578
  • 硬盤
    +關(guān)注

    關(guān)注

    3

    文章

    1317

    瀏覽量

    57492
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    808

    瀏覽量

    13361

原文標(biāo)題:實(shí)操教程|PyTorch實(shí)現(xiàn)斷點(diǎn)繼續(xù)訓(xùn)練

文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Pytorch模型訓(xùn)練實(shí)用PDF教程【中文】

    及優(yōu)化器,從而給大家?guī)?lái)清晰的機(jī)器學(xué)習(xí)結(jié)構(gòu)。通過(guò)本教程,希望能夠給大家?guī)?lái)一個(gè)清晰的模型訓(xùn)練結(jié)構(gòu)。當(dāng)模型訓(xùn)練遇到問題時(shí),需要通過(guò)可視化工具對(duì)數(shù)據(jù)、模型、損失等內(nèi)容進(jìn)行觀察,分析并定位問題出在數(shù)據(jù)部分
    發(fā)表于 12-21 09:18

    電機(jī)驅(qū)動(dòng)MCU技術(shù)有哪些要點(diǎn)需要注意

    電機(jī)驅(qū)動(dòng)MCU技術(shù)有哪些要點(diǎn)需要注意
    發(fā)表于 04-09 06:19

    嵌入式系統(tǒng)設(shè)計(jì)時(shí)需要注意的技術(shù)要點(diǎn)實(shí)現(xiàn)細(xì)節(jié)有哪些?

    為什么需要safe mode?嵌入式系統(tǒng)設(shè)計(jì)時(shí)需要注意的技術(shù)要點(diǎn)實(shí)現(xiàn)細(xì)節(jié)有哪些?
    發(fā)表于 04-25 08:49

    pytorch模型轉(zhuǎn)換需要注意的事項(xiàng)有哪些?

    什么是JIT(torch.jit)? 答:JIT(Just-In-Time)是一組編譯工具,用于彌合PyTorch研究與生產(chǎn)之間的差距。它允許創(chuàng)建可以在不依賴Python解釋器的情況下運(yùn)行的模型
    發(fā)表于 09-18 08:05

    AVR熔絲位配置的一些要點(diǎn)需要注意的相關(guān)事項(xiàng)資料下載

    電子發(fā)燒友網(wǎng)為你提供AVR熔絲位配置的一些要點(diǎn)需要注意的相關(guān)事項(xiàng)資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-11 08:52 ?6次下載
    AVR熔絲位配置的一些<b class='flag-5'>要點(diǎn)</b>和<b class='flag-5'>需要注意</b>的相關(guān)事項(xiàng)資料下載

    選擇電磁閥要注意的四大要點(diǎn)

    電磁閥選擇要注意四大要點(diǎn)“適用性、可靠性、安全性、經(jīng)濟(jì)性”
    的頭像 發(fā)表于 06-13 17:30 ?3334次閱讀

    使用威格士葉片泵時(shí)需要注意什么

    很多用戶在運(yùn)用威格士葉片泵期間都需要注意使用的,如果我們不注意,會(huì)給泵帶來(lái)事故現(xiàn)象,當(dāng)威格士葉片泵容積泵中的滑片泵應(yīng)該需要注意哪些事項(xiàng)?威格士葉片泵的管理要點(diǎn)除需防干轉(zhuǎn)和過(guò)載、防吸入空
    發(fā)表于 09-02 17:20 ?513次閱讀

    電子琴設(shè)計(jì)中要注意哪些要點(diǎn)

    引起了很多同學(xué)的興趣,活動(dòng)正式發(fā)布出來(lái),就有不少同學(xué)紛紛下單。在這里順便給同學(xué)們梳理一下要做出這個(gè)電子琴需要用到哪些書本知識(shí)?設(shè)計(jì)中要注意哪些要點(diǎn)
    的頭像 發(fā)表于 07-01 16:43 ?1877次閱讀

    地埋燈的安裝需要注意哪些事項(xiàng)?

    哪些事項(xiàng)?接下來(lái)大成智慧地埋燈廠家的小編就來(lái)給大家做詳細(xì)的介紹,其實(shí)地埋燈的安裝需要注意以下幾點(diǎn): 1、地埋燈安裝前必須切斷電源,這是所有電氣設(shè)備安裝和安全運(yùn)行的第一步。 2、整理所需的配件。地埋燈是埋在地下的特殊景觀燈。
    的頭像 發(fā)表于 04-14 11:32 ?1592次閱讀

    使用安全光幕有哪些需要注意的嗎?

    使用安全光幕有哪些需要注意的嗎?
    的頭像 發(fā)表于 06-29 09:38 ?772次閱讀
    使用安全光幕有哪些<b class='flag-5'>需要注意</b>的嗎?

    設(shè)計(jì)軟板pcb需要注意哪些事項(xiàng)

    設(shè)計(jì)軟板pcb需要注意哪些事項(xiàng)
    的頭像 發(fā)表于 12-19 10:06 ?746次閱讀

    應(yīng)用PLC需要注意哪些問題

    PLC(可編程邏輯控制器)作為現(xiàn)代工業(yè)控制的核心設(shè)備,其應(yīng)用的廣泛性和重要性不言而喻。然而,在應(yīng)用PLC的過(guò)程中,也需要注意一系列問題,以確保PLC系統(tǒng)的穩(wěn)定運(yùn)行和高效控制。本文將結(jié)合實(shí)際應(yīng)用經(jīng)驗(yàn),詳細(xì)探討應(yīng)用PLC時(shí)需要注意的問題,并給出相應(yīng)的解決策略和建議。
    的頭像 發(fā)表于 06-17 11:29 ?638次閱讀

    PyTorch如何訓(xùn)練自己的數(shù)據(jù)集

    PyTorch是一個(gè)廣泛使用的深度學(xué)習(xí)框架,它以其靈活性、易用性和強(qiáng)大的動(dòng)態(tài)圖特性而聞名。在訓(xùn)練深度學(xué)習(xí)模型時(shí),數(shù)據(jù)集是不可或缺的組成部分。然而,很多時(shí)候,我們可能需要使用自己的數(shù)據(jù)集而不是現(xiàn)成
    的頭像 發(fā)表于 07-02 14:09 ?2015次閱讀

    pytorch如何訓(xùn)練自己的數(shù)據(jù)

    本文將詳細(xì)介紹如何使用PyTorch框架來(lái)訓(xùn)練自己的數(shù)據(jù)。我們將從數(shù)據(jù)準(zhǔn)備、模型構(gòu)建、訓(xùn)練過(guò)程、評(píng)估和測(cè)試等方面進(jìn)行講解。 環(huán)境搭建 首先,我們需要安裝
    的頭像 發(fā)表于 07-11 10:04 ?621次閱讀

    Pytorch深度學(xué)習(xí)訓(xùn)練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學(xué)習(xí)訓(xùn)練
    的頭像 發(fā)表于 10-28 14:05 ?274次閱讀
    <b class='flag-5'>Pytorch</b>深度學(xué)習(xí)<b class='flag-5'>訓(xùn)練</b>的方法
    主站蜘蛛池模板: 天天操夜夜操夜夜操 | 日本高清一区二区三区不卡免费 | 91精品啪国产在线观看免费牛牛 | 日本三级免费 | 性欧美大战久久久久久久 | 狠狠干激情 | 黄色网址视频在线播放 | 一级大片视频 | 久久波多野结衣 | 色多多污网站在线观看 | 亚洲色图国产精品 | 欧美成人26uuu欧美毛片 | 曰本a | 一区二区三区无码高清视频 | 国产特黄特色的大片观看免费视频 | 久久综合丁香 | 午夜影院在线免费 | 日本理论午夜中文字幕第一页 | 在线视频亚洲一区 | 主人扒开腿揉捏花蒂调教cfh | 免费大片黄在线观看日本 | 久久手机看片 | 四虎影院官网 | 4480yy私人午夜a级国产 | 么公的好大好硬好深好爽在线视频 | 夜夜澡人人爽人人喊_欧美 夜夜综合网 | 夜夜五月天 | 色噜噜狠狠成人影院 | 国产特黄特色的大片观看免费视频 | 国产91啪| 亚洲激情视频 | 久久99热久久精品动漫 | 天天爱天天射 | 龙口护士门91午夜国产在线 | 天天弄天天操 | 狠狠五月深爱婷婷网 | 国产午夜一区二区在线观看 | 国产精品 视频一区 二区三区 | 色花堂国产精品首页第一页 | 免费的很黄很色的床小视频 | 黄鳝钻进下面好爽小说 |