久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【干貨】深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案

 漫步之心情 2018-02-23

【干貨】深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案


新智元推薦

來源:專知

【新智元導(dǎo)讀】在研究深度學(xué)習(xí)的過程中,當(dāng)你腦中突然迸發(fā)出一個靈感,,你是否發(fā)現(xiàn)沒有趁手的工具可以快速實現(xiàn)你的想法?看完本文之后,,你可能會多出一個選擇。本文簡要分析了研究深度學(xué)習(xí)問題時常見的工作流, 并介紹了怎么使用 PyTorch 來快速構(gòu)建你的實驗,。

【干貨】深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案

常見的 Research workflow

某一天, 你坐在實驗室的椅子上, 突然:

  • 你腦子里迸發(fā)出一個idea

  • 你看了關(guān)于某一theory 的文章, 想試試: 要是把 xx 也加進去會怎么樣

  • 你老板突然給你一張紙, 然后說: 那個誰, 來把這個東西實現(xiàn)一下

于是, 你設(shè)計實驗流程, 并為這一 idea 挑選了合適的數(shù)據(jù)集和運行環(huán)境, 然后你廢寢忘食的實現(xiàn)模型, 經(jīng)過長時間的訓(xùn)練和測試, 你發(fā)現(xiàn):

  • 這 idea 不 work --> 那算了 or 再調(diào)調(diào)

  • 這 idea 很 work --> 可以 paper 了

我們可以把上述流程用下圖表示:

【干貨】深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案

實際上, 常見的流程由下面幾項組成起來:

  1. 一旦選定了數(shù)據(jù)集, 你就要寫一些函數(shù)去 load 數(shù)據(jù)集, 然后 pre-process 數(shù)據(jù)集, normalize 數(shù)據(jù)集, 可以說這是一個實驗中占比重最多的部分, 因為:

  1. 每個數(shù)據(jù)集的格式都不太一樣

  2. 預(yù)處理和正則化的方式也不盡相同

  3. 需要一個快速的 dataloader 來 feed data, 越快越好

  1. 然后, 你就要實現(xiàn)自己的模型, 如果你是 CV 方向的你可能想實現(xiàn)一個 ResNet, 如果你是 NLP 相關(guān)的你可能想實現(xiàn)一個 Seq2Seq

  2. 接下來, 你需要實現(xiàn)訓(xùn)練步驟, 分 batch, 循環(huán) epoch

  3. 在若干輪的訓(xùn)練后, 總要 checkpoint 一下, 才是最安全的

  4. 你還需要構(gòu)建一些 baseline, 以驗證自己 idea 的有效性

  5. 如果你實現(xiàn)的是神經(jīng)網(wǎng)絡(luò)模型, 當(dāng)然離不開 GPU 的支持

  6. 很多深度學(xué)習(xí)框架提供了常見的損失函數(shù), 但大部分時間, 損失函數(shù)都要和具體任務(wù)結(jié)合起來, 然后重新實現(xiàn)

  7. 使用優(yōu)化方法, 優(yōu)化構(gòu)建的模型, 動態(tài)調(diào)整學(xué)習(xí)率

Pytorch 給出的解決方案

對于加載數(shù)據(jù), Pytorch 提出了多種解決辦法

  • Pytorch 是一個 Python 包, 而不是某些大型 C++ 庫的 Python 接口, 所以, 對于數(shù)據(jù)集本身提供 Python API 的, Pytorch 可以直接調(diào)用, 不必特殊處理.

  • Pytorch 集成了常用數(shù)據(jù)集的 data loader

  • 雖然以上措施已經(jīng)能涵蓋大部分?jǐn)?shù)據(jù)集了, 但 Pytorch 還開展了兩個項目: vision, 和 text, 見下圖灰色背景部分. 這兩個項目, 采用眾包機制, 收集了大量的 dataloader, pre-process 以及 normalize, 分別對應(yīng)于圖像和文本信息.

【干貨】深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案

  • 如果你要自定義數(shù)據(jù)集,,也只需要繼承 torch.utils.data.dataset

對于構(gòu)建模型, Pytorch 也提供了三種方案

  • 眾包的模型: torch.utils.model_zoo , 你可以使用這個工具, 加載大家共享出來的模型

  • 使用 torch.nn.Sequential 模塊快速構(gòu)建

net = torch.nn.Sequential( torch.nn.Linear(1, 10), torch.nn.ReLU(), torch.nn.Linear(10, 1))print(net)'''Sequential ( (0): Linear (1 -> 10) (1): ReLU () (2): Linear (10 -> 1))'''
  • 集成 torch.nn.Module 深度定制

class Net(torch.nn.Module): def __init__(self, n_feature, n_hidden, n_output): super(Net, self).__init__() self.hidden = torch.nn.Linear(n_feature, n_hidden) self.predict = torch.nn.Linear(n_hidden, n_output) def forward(self, x): x = F.relu(self.hidden(x)) x = self.predict(x) return xnet = Net(1, 10, 1) print(net)'''Net ( (hidden): Linear (1 -> 10) (predict): Linear (10 -> 1))'''

對于訓(xùn)練過程的 Pytorch 實現(xiàn)

你當(dāng)然可以自己實現(xiàn)數(shù)據(jù)的 batch, shuffer 等, 但 Pytorch 建議用類 torch.utils.data.DataLoader 加載數(shù)據(jù),并對數(shù)據(jù)進行采樣,,生成batch迭代器,。

# 創(chuàng)建數(shù)據(jù)加載器loader = Data.DataLoader( dataset=torch_dataset, # TensorDataset類型數(shù)據(jù)集 batch_size=BATCH_SIZE, # mini batch size shuffle=True, # 設(shè)置隨機洗牌 num_workers=2, # 加載數(shù)據(jù)的進程個數(shù))for epoch in range(3): # 訓(xùn)練3輪 for step, (batch_x, batch_y) in enumerate(loader): # 每一步 # 在這里寫訓(xùn)練代碼... print('Epoch: ', epoch)

對于保存和加載模型 Pytorch 提供兩種方案

  • 保存和加載整個網(wǎng)絡(luò)

# 保存和加載整個模型, 包括: 網(wǎng)絡(luò)結(jié)構(gòu), 模型參數(shù)等torch.save(resnet, 'model.pkl')model = torch.load('model.pkl')
  • 保存和加載網(wǎng)絡(luò)中的參數(shù)

torch.save(resnet.state_dict(), 'params.pkl')resnet.load_state_dict(torch.load('params.pkl'))

對于 GPU 支持

你可以直接調(diào)用 Tensor 的. cuda() 直接將 Tensor 的數(shù)據(jù)遷移到 GPU 的顯存上, 當(dāng)然, 你也可以用. cpu() 隨時將數(shù)據(jù)移回內(nèi)存

if torch.cuda.is_available(): linear = linear.cuda() # 將網(wǎng)絡(luò)中的參數(shù)和緩存移到GPU顯存中

對于 Loss 函數(shù), 以及自定義 Loss

在 Pytorch 的包 torch.nn 里, 不僅包含常用且經(jīng)典的 Loss 函數(shù), 還會實時跟進新的 Loss 包括: CosineEmbeddingLoss, TripletMarginLoss 等.

如果你的 idea 非常新穎, Pytorch 提供了三種自定義 Loss 的方式

  • 繼承 torch.nn.module

import torchimport torch.nn as nnimport torch.nn.functional as funcclass MyLoss(nn.Module): # 設(shè)置超參 def __init__(self, a, b, c): super(TripletLossFunc, self).__init__() self.a = a self.b = b self.c = c return def forward(self, a, b, c): # 具體實現(xiàn) loss = a + b + c return loss

然后

loss_instance = MyLoss(...)loss = loss_instance(a, b, c)

這樣做, 你能夠用 torch.nn.functional 里優(yōu)化過的各種函數(shù)來組成你的 Loss

  • 繼承 torch.autograd.Function

import torchfrom torch.autograd import Functionfrom torch.autograd import Variableclass MyLoss(Function): def forward(input_tensor): # 具體實現(xiàn) result = ...... return torch.Tensor(result) def backward(grad_output): # 如果你只是需要在loss中應(yīng)用這個操作的時候,,這里直接return輸入就可以了 # 如果你需要在nn中用到這個,需要寫明具體的反向傳播操作 return grad_output

這樣做,,你能夠用常用的 numpy 和 scipy 函數(shù)來組成你的 Loss

  • 寫一個 Pytorch 的 C 擴展

這里就不細(xì)講了,未來會有內(nèi)容專門介紹這一部分,。

對于優(yōu)化算法以及調(diào)節(jié)學(xué)習(xí)率

Pytorch 集成了常見的優(yōu)化算法, 包括 SGD, Adam, SparseAdam, AdagradRMSprop, Rprop 等等.

torch.optim.lr_scheduler 提供了多種方式來基于 epoch 迭代次數(shù)調(diào)節(jié)學(xué)習(xí)率 torch.optim.lr_scheduler.ReduceLROnPlateau 還能夠基于實時的學(xué)習(xí)結(jié)果, 動態(tài)調(diào)整學(xué)習(xí)率.

希望第一篇《深度學(xué)習(xí)實驗流程及 PyTorch 提供的解決方案》,,大家會喜歡,后續(xù)會推出系列實戰(zhàn)教程,,敬請期待,。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多