怎么實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)?神經(jīng)網(wǎng)絡(luò)的組成結(jié)構(gòu) 原創(chuàng)
“ 神經(jīng)網(wǎng)絡(luò)模型雖然是一個整體,但卻是由多個環(huán)節(jié)和步驟組成的。”
對學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)技術(shù)的人來說,自己設(shè)計一個神經(jīng)網(wǎng)絡(luò)模型是很多人都想做的事情;也是神經(jīng)網(wǎng)絡(luò)技術(shù)學(xué)習(xí)過程中必不可少的一個環(huán)節(jié);但是很多人又不知道應(yīng)該怎么下手。
所以今天就介紹一下怎么設(shè)計一個神經(jīng)網(wǎng)絡(luò)模型。
實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)
很多人認(rèn)為神經(jīng)網(wǎng)絡(luò)復(fù)雜的原因是因為沒有了解過神經(jīng)網(wǎng)絡(luò)的組成結(jié)構(gòu);因此,就很難弄清楚神經(jīng)網(wǎng)絡(luò)模型中每個環(huán)節(jié)的作用,所以我們就先從神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)入手。
首先,簡單來說實現(xiàn)和訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)首先需要以下幾個步驟:
- 數(shù)據(jù)集準(zhǔn)備
- 神經(jīng)網(wǎng)絡(luò)模型設(shè)計
- 模型訓(xùn)練
- 模型測試驗證
不論你使用什么樣的技術(shù)或框架,基本上都離不開這幾個步驟。
以下展開說明每個步驟的功能與作用:
數(shù)據(jù)集準(zhǔn)備
現(xiàn)在的神經(jīng)網(wǎng)絡(luò)模型主要采用的是預(yù)訓(xùn)練模式,因此模型在設(shè)計完成之后就需要大量的數(shù)據(jù)對模型進(jìn)行訓(xùn)練與測試;因此,數(shù)據(jù)集是其中必不可少的一個環(huán)節(jié)。
而數(shù)據(jù)集的準(zhǔn)備需要大量的準(zhǔn)備工作,包括數(shù)據(jù)的采集(公開數(shù)據(jù),企業(yè)內(nèi)部數(shù)據(jù),行業(yè)數(shù)據(jù)等等),數(shù)據(jù)的清洗與整理(很多數(shù)據(jù)并不完全符合神經(jīng)網(wǎng)絡(luò)模型的需求,因此需要對數(shù)據(jù)進(jìn)行清洗以及格式化處理)。
具體涉及的技術(shù)大概有數(shù)據(jù)導(dǎo)入(csv,word,excel,sql等多種數(shù)據(jù)格式),數(shù)據(jù)格式化,爬蟲技術(shù)(自動采集數(shù)據(jù)),利用pandas,numpy,sql技術(shù)等對數(shù)據(jù)進(jìn)行清洗整理等;如果是圖片數(shù)據(jù)還需要對圖片進(jìn)行裁剪,統(tǒng)一化等。
最后把整理的數(shù)據(jù)轉(zhuǎn)換成神經(jīng)網(wǎng)絡(luò)能夠處理的數(shù)據(jù)格式,如向量。
當(dāng)然,數(shù)據(jù)集的準(zhǔn)備需要在完全合法的前提下進(jìn)行。
神經(jīng)網(wǎng)絡(luò)模型的設(shè)計
神經(jīng)網(wǎng)絡(luò)模型設(shè)計是實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)模型最重要的步驟之一,根據(jù)不同的任務(wù)類型,用戶可以選擇不同的神經(jīng)網(wǎng)絡(luò)模型架構(gòu),如RNN,CNN,Transformer等;當(dāng)然還有其它網(wǎng)絡(luò)模型架構(gòu),或者用戶根據(jù)自己的需求自定義神經(jīng)網(wǎng)絡(luò)模型架構(gòu)及實現(xiàn)。
神經(jīng)網(wǎng)絡(luò)模型的設(shè)計主要涉及到各種算法的實現(xiàn),每層神經(jīng)網(wǎng)絡(luò)的功能實現(xiàn)及優(yōu)化等。如全鏈接層,激活函數(shù)等的實現(xiàn)。
模型訓(xùn)練
模型訓(xùn)練是實現(xiàn)一個神經(jīng)網(wǎng)絡(luò)模型的重要環(huán)節(jié),模型的訓(xùn)練效果直接決定著神經(jīng)網(wǎng)絡(luò)的好壞以及性能。
但從技術(shù)上來說,模型的訓(xùn)練流程是一個流程化的步驟;主要有以下幾點:
- 正向傳播
- 反向傳播
- 損失計算
- 模型優(yōu)化
而這幾個步驟由于是固定的,因此其代碼比較簡單,以下以pytorch為例:
model = Network() # 模型實例化
optimizer = optim.Adam(model.parameters()) # 優(yōu)化器 優(yōu)化模型參數(shù)
criterion = nn.CrossEntropyLoss() # 損失函數(shù) 分類問題 使用交叉熵?fù)p失誤差
for epoch in range(10): #外層循環(huán) 代表整個訓(xùn)練數(shù)據(jù)集的遍歷次數(shù)
#整個訓(xùn)練集要循環(huán)多少輪 是10次 20次 或者100次都有可能
# 內(nèi)存循環(huán)使用train_loader 進(jìn)行小批量數(shù)據(jù)讀取
for batch_idx, (data, label) in enumerate(train_loader):
#內(nèi)層循環(huán)一次 就會進(jìn)行一次梯度下降算法
#包括5個步驟
output = model(data) # 計算神經(jīng)網(wǎng)絡(luò)的前向傳播結(jié)果
loss = criterion(output, label) # 損失計算 計算output和標(biāo)簽label之間的損失loss
loss.backward() # 反向傳播 使用backward計算梯度
optimizer.step() # 使用optimizer.step更新參數(shù)
optimizer.zero_grad() # 將梯度歸零
# 這五個步驟 是使用pytorch框架訓(xùn)練模型的定式 初學(xué)時 先記住即可
# 模型保存
torch.save(model.state_dict(), 'mnist.pth')
模型訓(xùn)練既是一個標(biāo)準(zhǔn)化的過程,但又是一個基于經(jīng)驗的科學(xué);同一個模型,訓(xùn)練次數(shù)不一樣,訓(xùn)練數(shù)據(jù)的批次不一樣,甚至完全通用的訓(xùn)練數(shù)據(jù)都可能會得到完全不一樣的效果。
而且成本問題,也是模型訓(xùn)練的一個重要考慮因素。
模型測試
至于模型測試就相對比較簡單了,以模型訓(xùn)練為基礎(chǔ);去除反向傳播和優(yōu)化功能;只需要使用測試數(shù)據(jù)集,計算神經(jīng)網(wǎng)絡(luò)的預(yù)測結(jié)果與實際label的損失差;如果損失差過大則說明模型效果不好,可能需要重新設(shè)計或訓(xùn)練。
當(dāng)然,要想訓(xùn)練出一個高性能的神經(jīng)網(wǎng)絡(luò)模型,并不是完全按照以上步驟執(zhí)行就能得到一個好的結(jié)果;在訓(xùn)練過程中會存在各種各樣的問題,因此技術(shù)人員需要根據(jù)不同的結(jié)果去判斷具體哪個環(huán)節(jié)可能出現(xiàn)問題,以及應(yīng)該怎么解決或優(yōu)化。
本文轉(zhuǎn)載自公眾號AI探索時代 作者:DFires
