大家好,我們是 AI . FREE Team - 人工智慧自由團隊,這一次的鐵人賽,自由團隊將從0到1 手把手教各位讀者學會 (1)Python基礎語法 (2)Python Web 網頁開發框架 – Django (3)Python網頁爬蟲 – 周易解夢網 (4)Tensorflow AI語言模型基礎與訓練 – LSTM (5)實際部屬AI解夢模型到Web框架上。
自由團隊的成立宗旨為開發AI/新科技的學習資源,提供各領域的學習者能夠跨域學習資料科學,並透過自主學習發展協槓職涯,結合智能應用到各式領域,無論是文、法、商、管、醫領域的朋友,都可以自由的學習AI技術。
AI . FREE Team 讀者專屬福利 → Python Basics 免費學習資源
pytorch
這個深度學習的套件,來進行今天的實作。W
,降低預測與答案之間的差距,進而提高正確率,但是其實再向後傳播的過程中,還有一個更重要的過程,便是梯度下降(Gradient descent),這次我們將帶來更詳細的解說loss
的總和的平均(其實是一樣的),透過y
是我們的預測,而y上面有一個^符號的是答案,我們先稱為y_hat
y_p
不等於y_t
時,我們會提高W
降低W
,這個過程其實就是梯度下降,但是公式簡陋也不夠精確,在求出loss
之後,我們需要得知神經元對於輸出的變化,好吧!用說的可能比較難理解,那我們來看圖片,這圖片中相信大家會有更好的見解。W
),我們必須仰賴向後傳播。pytorch
的基本教學例子,其實有先看過我們後面文章的朋友都知道,真正到解夢模型那裏的深度學習套件是用tensorflow
與keras
,使用過keras
的朋友們都知道,當用這個套件時,AI就真的像黑盒子一樣,丟進去等結果就好,而pytorch
這個套件release底層API比較多,方便不熟悉python
實作AI的朋友們理解模型內的運作喔~pytorch
官網的教學import torch
dtype = torch.float
device = torch.device("cpu") # 表示目前使用CPU來跑
# device = torch.device("cuda:0") # 這是for GPU的程式
# N is batch size; D_in 是輸入維度;
# H is hidden dimension; D_out 是輸出維度.
N, D_in, H, D_out = 64, 1000, 100, 10
# Create random input and output data
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)
# Randomly initialize weights
w1 = torch.randn(D_in, H, device=device, dtype=dtype)
w2 = torch.randn(H, D_out, device=device, dtype=dtype)
learning_rate = 1e-6
for t in range(500):
# 向前傳播
h = x.mm(w1)
h_relu = h.clamp(min=0)
y_pred = h_relu.mm(w2)
# 計算出loss 這邊loss function使用的是 MSE公式
loss = (y_pred - y).pow(2).sum().item()
if t % 100 == 0:
print(t, loss)
# 向後傳播計算出w1與w2的梯度
grad_y_pred = 2.0 * (y_pred - y)
grad_w2 = h_relu.t().mm(grad_y_pred) # t()是將矩陣轉置
grad_h_relu = grad_y_pred.mm(w2.t())
grad_h = grad_h_relu.clone() #clone是賦值之外並且讓這個變數具有可計算梯度的功能
grad_h[h < 0] = 0
grad_w1 = x.t().mm(grad_h)
# 更新權重
w1 -= learning_rate * grad_w1
w2 -= learning_rate * grad_w2
0 1.4500995348498691e-05
100 1.0990642294927966e-05
200 8.501140655425843e-06
300 6.994195700826822e-06
400 5.831332146044588e-06
dtype = torch.float
device = torch.device("cpu")
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in, device=device, dtype=dtype)
y = torch.randn(N, D_out, device=device, dtype=dtype)
w1 = torch.randn(D_in, H, device=device, dtype=dtype, requires_grad=True)
w2 = torch.randn(H, D_out, device=device, dtype=dtype, requires_grad=True)
learning_rate = 1e-6
for t in range(500):
y_pred = x.mm(w1).clamp(min=0).mm(w2)
loss = (y_pred - y).pow(2).sum()
if t % 100 == 0:
print(t, loss.item())
# 這裡我們使用backward()來自動找出w1與w2的梯度,是不是很輕鬆呢~
loss.backward()
with torch.no_grad():
w1 -= learning_rate * w1.grad
w2 -= learning_rate * w2.grad
# 更新完權重後,我們需要將每個梯度手動歸0,以免下次的梯度加到這次的
w1.grad.zero_()
w2.grad.zero_()
pytorch
向前傳播也有很方便的APIimport torch
N, D_in, H, D_out = 64, 1000, 100, 10
x = torch.randn(N, D_in)
y = torch.randn(N, D_out)
# 這裡使用nn.Sequential()這個function來宣告我們向前傳播的模型
model = torch.nn.Sequential(
torch.nn.Linear(D_in, H),
torch.nn.ReLU(),
torch.nn.Linear(H, D_out),
)
# loss也有funciton可以做喔
loss_fn = torch.nn.MSELoss(reduction='sum')
learning_rate = 1e-4
for t in range(500):
# 這裡只要將x丟進我們的model就好
y_pred = model(x)
# 將預測與答案丟進剛剛宣告的loss funciton就可以得到loss
loss = loss_fn(y_pred, y)
if t % 100 == 0:
print(t, loss.item())
loss.backward()
# 更新權重也有簡化的API
with torch.no_grad():
for param in model.parameters():
param -= learning_rate * param.grad
自由團隊 官方網站:https://aifreeblog.herokuapp.com/
自由團隊 Github:https://github.com/AI-FREE-Team/
自由團隊 粉絲專頁:https://www.facebook.com/AI.Free.Team/
自由團隊 IG:https://www.instagram.com/aifreeteam/
自由團隊 Youtube:https://www.youtube.com/channel/UCjw6Kuw3kwM_il39NTBJVTg/
文章同步發布於:自由團隊部落格
(想看更多文章?學習更多AI知識?敬請鎖定自由團隊的頻道!)