新智元推薦 來源:專知 【新智元導(dǎo)讀】在研究深度學(xué)習(xí)的過程中,當(dāng)你腦中突然迸發(fā)出一個靈感,,你是否發(fā)現(xiàn)沒有趁手的工具可以快速實現(xiàn)你的想法?看完本文之后,,你可能會多出一個選擇。本文簡要分析了研究深度學(xué)習(xí)問題時常見的工作流, 并介紹了怎么使用 PyTorch 來快速構(gòu)建你的實驗,。 常見的 Research workflow某一天, 你坐在實驗室的椅子上, 突然:
于是, 你設(shè)計了實驗流程, 并為這一 idea 挑選了合適的數(shù)據(jù)集和運行環(huán)境, 然后你廢寢忘食的實現(xiàn)了模型, 經(jīng)過長時間的訓(xùn)練和測試, 你發(fā)現(xiàn):
我們可以把上述流程用下圖表示: 實際上, 常見的流程由下面幾項組成起來:
Pytorch 給出的解決方案對于加載數(shù)據(jù), Pytorch 提出了多種解決辦法
對于構(gòu)建模型, Pytorch 也提供了三種方案
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))'''
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ù)進行采樣,,生成 # 創(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ò)結(jié)構(gòu), 模型參數(shù)等torch.save(resnet, 'model.pkl')model = torch.load('model.pkl')
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 的方式
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
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
這里就不細(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)教程,,敬請期待,。 |
|