此前在疫情期間學習了AI的經(jīng)典算法理論,但一直沒有機會實戰(zhàn)敲敲代碼,總感覺有遺憾,現(xiàn)在抓緊時間實戰(zhàn)一下!下面的筆記其實就是的pytorch官方學習代碼加上個人的理解,代碼已經(jīng)試運行過了,邊做邊學吧。
1、模型是如何學習的
模型學習的兩種方式:正反饋和負反饋機制
forwardpropagation
:告訴模型什么知識,它就輸出什么,類似模仿,中間包括提取特征(抓取精華,抽選。
??下面是定義了神經(jīng)網(wǎng)絡和前向傳播的pytorch代碼
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = torch.flatten(x, 1) # flatten all dimensions except batch
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
net = Net()
backpropagation
: 負反饋學習機制,從錯誤中吸收經(jīng)驗,失敗乃成功之母!(本質(zhì)是通過損失函數(shù)調(diào)整模型的參數(shù))-
如何判斷模型真正學到了知識
-
loss function
: 交叉熵損失(Cross-Entropy loss)是一種常用的損失函數(shù),特別適用于分類問題。它用于衡量模型的預測結(jié)果與真實標簽之間的差異,跟人類的考試差不多,用于查看模型的學習程度。當然了損失函數(shù)也只有Cross-Entropy loss這一種
-
??: pytorch實現(xiàn)模型訓練的代碼,注意的點:每一次反向?qū)W習的計算前都需要對梯度進行清零
,否則會引起梯度爆炸和梯度消失的問題,也即每次學習到更新了的狀態(tài)會被推翻,模型狀態(tài)變得跟薛定諤的貓一樣飄忽不定,也即訓練會沒有效果。
for epoch in range(2): # loop over the dataset multiple times
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# get the inputs; data is a list of [inputs, labels]
inputs, labels = data
# zero the parameter gradients
optimizer.zero_grad() #清除前一次訓練的梯度
# forward + backward + optimize
outputs = net(inputs) #這里就是正反饋學習
loss = criterion(outputs, labels)
loss.backward() #負反饋
optimizer.step()
# print statistics
running_loss += loss.item()
if i % 2000 == 1999: # print every 2000 mini-batches
print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
running_loss = 0.0
print('Finished Training')
2、模型的訓練過程(此處包含我個人不成熟的案例解說)
模型訓練步驟通常包含下面的模塊
- 讀取數(shù)據(jù)集(分批讀): 此處引入batch和epoch的概念,相當于一本書一共
200頁-->總數(shù)據(jù)集
,每天只能讀10頁-->batch_size
,分20天-->迭代iterations
讀完,讀完一次全書-->1次epoch
。溫故而知新,一本書可以讀多次,就有多輪的epoch了
- 讀取數(shù)據(jù)集(分批讀): 此處引入batch和epoch的概念,相當于一本書一共
- 模型預測(正反饋):看小說的開頭,已經(jīng)可以根據(jù)有限的信息推測后續(xù)的發(fā)展了,這里可以推斷出有
n種結(jié)局
??
- 模型預測(正反饋):看小說的開頭,已經(jīng)可以根據(jù)有限的信息推測后續(xù)的發(fā)展了,這里可以推斷出有
- 計算損失:??
哪一種結(jié)局比較接近真實結(jié)局呢?
,這時候就是要跟真的結(jié)局相比較了。假設(shè)真正的結(jié)局是喜劇,那么猜到了是悲劇就扣50分??,如果結(jié)局是be種帶點he比較接近真實的結(jié)局,就扣20分?。
- 計算損失:??
4、根據(jù)損失值進行負反饋學習調(diào)整模型的權(quán)重:對于模型而言,結(jié)局依然是未知的,隨著線索的獲取,就可以更新自己的預測并根據(jù)扣分的多少去衡量怎樣的結(jié)局是真實結(jié)局??,這就是反饋的過程。
上述的解說也不一定對啦,也可以參考猜數(shù)字游戲。
總結(jié)
本篇筆記記錄一個神經(jīng)網(wǎng)絡的基本訓練路線,代碼中包含了網(wǎng)絡的構(gòu)建,學習(訓練)的過程。
ps: 上述的個人理解不一定正確,有誤請在評論區(qū)指出/(ㄒoㄒ)/~~
參考
淺顯易懂的池化層解釋