深度學習實驗流程及 PyTorch 提供的解決方案
新智元推薦
來源:專知
【新智元導讀】在研究深度學習的過程中,當你腦中突然迸發出一個靈感,你是否發現沒有趁手的工具可以快速實現你的想法?看完本文之後,你可能會多出一個選擇。本文簡要分析了研究深度學習問題時常見的工作流, 並介紹了怎麼使用 PyTorch 來快速構建你的實驗。
常見的 Research workflow
某一天, 你坐在實驗室的椅子上, 突然:
你腦子裡迸發出一個idea
你看了關於某一theory的文章, 想試試: 要是把 xx 也加進去會怎麼樣
你老闆突然給你一張紙, 然後說: 那個誰, 來把這個東西實現一下
於是, 你設計了實驗流程, 並為這一 idea挑選了合適的數據集和運行環境, 然後你廢寢忘食的實現了模型, 經過長時間的訓練和測試, 你發現:
這 idea 不 work --> 那算了 or 再調調
這 idea 很 work --> 可以寫paper 了
我們可以把上述流程用下圖表示:
實際上, 常見的流程由下面幾項組成起來:
一旦選定了數據集, 你就要寫一些函數去 load 數據集, 然後 pre-process 數據集, normalize 數據集, 可以說這是一個實驗中佔比重最多的部分, 因為:
每個數據集的格式都不太一樣
預處理和正則化的方式也不盡相同
需要一個快速的 dataloader 來 feed data, 越快越好
然後, 你就要實現自己的模型, 如果你是 CV 方向的你可能想實現一個 ResNet, 如果你是 NLP 相關的你可能想實現一個 Seq2Seq
接下來, 你需要實現訓練步驟, 分 batch, 循環 epoch
在若干輪的訓練後, 總要 checkpoint 一下, 才是最安全的
你還需要構建一些 baseline, 以驗證自己 idea 的有效性
如果你實現的是神經網路模型, 當然離不開 GPU 的支持
很多深度學習框架提供了常見的損失函數, 但大部分時間, 損失函數都要和具體任務結合起來, 然後重新實現
使用優化方法, 優化構建的模型, 動態調整學習率
Pytorch 給出的解決方案
對於載入數據, Pytorch 提出了多種解決辦法
對於構建模型, 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)
)
"""
集成 torch.nn.Module 深度定製
classNet(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)
defforward(self,x):
x = F.relu(self.hidden(x))
x =self.predict(x)
returnx
net = Net(1,10,1)
print(net)
"""
Net (
(hidden): Linear (1 -> 10)
(predict): Linear (10 -> 1)
)
"""
對於訓練過程的 Pytorch 實現
# 創建數據載入器
loader = Data.DataLoader(
dataset=torch_dataset,# TensorDataset類型數據集
batch_size=BATCH_SIZE,# mini batch size
shuffle=True,# 設置隨機洗牌
num_workers=2,# 載入數據的進程個數
)
forepochinrange(3):# 訓練3輪
forstep,(batch_x,batch_y)inenumerate(loader):# 每一步
# 在這裡寫訓練代碼...
print("Epoch: ",epoch)
對於保存和載入模型 Pytorch 提供兩種方案
保存和載入整個網路
# 保存和載入整個模型, 包括: 網路結構, 模型參數等
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 支持
你可以直接調用 Tensor 的. cuda() 直接將 Tensor 的數據遷移到 GPU 的顯存上, 當然, 你也可以用. cpu() 隨時將數據移回內存
對於 Loss 函數, 以及自定義 Loss
在 Pytorch 的包 torch.nn 里, 不僅包含常用且經典的 Loss 函數, 還會實時跟進新的 Loss 包括: CosineEmbeddingLoss, TripletMarginLoss 等.
如果你的 idea 非常新穎, Pytorch 提供了三種自定義 Loss 的方式
然後
loss_instance= MyLoss(...)
loss =loss_instance(a,b,c)
繼承 torch.autograd.Function
importtorch
fromtorch.autogradimportFunction
fromtorch.autogradimportVariable
classMyLoss(Function):
defforward(input_tensor):
# 具體實現
result = ......
returntorch.Tensor(result)
defbackward(grad_output):
# 如果你只是需要在loss中應用這個操作的時候,這裡直接return輸入就可以了
# 如果你需要在nn中用到這個,需要寫明具體的反向傳播操作
returngrad_output
這樣做,你能夠用常用的 numpy 和 scipy 函數來組成你的 Loss
寫一個 Pytorch 的 C 擴展
這裡就不細講了,未來會有內容專門介紹這一部分。
對於優化演算法以及調節學習率
Pytorch 集成了常見的優化演算法, 包括 SGD, Adam, SparseAdam, AdagradRMSprop, Rprop 等等.
希望第一篇《深度學習實驗流程及 PyTorch 提供的解決方案》,大家會喜歡,後續會推出系列實戰教程,敬請期待。
【2018新智元AI技術峰會重磅開啟,瘋狂搶票中!】早鳥票3折搶票倒計時6天開槍
2017年,作為人工智慧領域最具影響力的產業服務平台——新智元成功舉辦了「新智元開源·生態技術峰會」和「2017AIWORLD 世界人工智慧大會」。憑藉超高活動人氣及行業影響力,獲得2017年度活動行「年度最具影響力主辦方」獎項。
其中「2017AIWORLD 世界人工智慧大會」創人工智慧領域活動先河,參會人次超5000;開場視頻在騰訊視頻點播量超100萬;新華網圖文直播超1200萬;
2018年的3月29日,新智元再匯AI之力,共築產業躍遷之路。 在北京舉辦2018年中國AI開年盛典——2018新智元AI技術峰會,本次峰會以「產業·躍遷」為主題,特邀諾貝爾獎評委德國人工智慧研究中心創始人兼CEO Wolfgang Wahlster 親臨現場與谷歌、微軟、亞馬遜、BAT、科大訊飛、京東和華為等企業重量級嘉賓,共同研討技術變革,助力領域融合發展。
新智元誠摯邀請關心人工智慧行業發展的各界人士 3 月 29 日親臨峰會現場,共同參與這一跨領域的思維碰撞。
關於大會,請關注新智元微信公眾號或訪問活動行頁面:http://www.huodongxing.com/event/8426451122400了解更多
※「AI比人更擅長妥協」Nature子刊全新機器學習演算法探討人機合作
※國內首款量產NPU再升級,16倍性能提升
TAG:新智元 |