国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

4.4 線性回歸代碼實(shí)現(xiàn)

2023-02-04 11:30 作者:梗直哥丶  | 我要投稿



4.4.3?完整代碼

接著將所有代碼組合起來(lái),看一下完整代碼示例,輸出值和上面代碼應(yīng)該是一樣的。同學(xué)們可以自行修改數(shù)據(jù)維度、學(xué)習(xí)率、迭代次數(shù)進(jìn)行實(shí)驗(yàn)。

import?numpy?as?np
import?torch

#?設(shè)置隨機(jī)數(shù)種子,使得每次運(yùn)行代碼生成的數(shù)據(jù)相同
np.random.seed(42)

#?生成隨機(jī)數(shù)據(jù)
x?=?np.random.rand(100,?1)
y?=?1?+?2?*?x?+?0.1?*?np.random.randn(100,?1)

#?將數(shù)據(jù)轉(zhuǎn)換為?pytorch tensor
x_tensor?=?torch.from_numpy(x).float()
y_tensor?=?torch.from_numpy(y).float()

#?設(shè)置超參數(shù)
learning_rate?=?0.1
num_epochs?=?1000

#?初始化參數(shù)
w?=?torch.randn(1, requires_grad=True)
b?=?torch.zeros(1, requires_grad=True)

#?開始訓(xùn)練
for?epoch?in?range(num_epochs):
????#?計(jì)算預(yù)測(cè)值
????y_pred?=?x_tensor?*?w?+?b

????#?計(jì)算損失
????loss?=?((y_pred?-?y_tensor)?**?2).mean()

????#?反向傳播
????loss.backward()

????#?更新參數(shù)
????with?torch.no_grad():
????????w?-=?learning_rate?*?w.grad
????????b?-=?learning_rate?*?b.grad

????????#?清空梯度
????????w.grad.zero_()
????????b.grad.zero_()

#?輸出訓(xùn)練后的參數(shù)
print('w:', w)
print('b:', b)

w: tensor([1.9540], requires_grad=True)
b: tensor([1.0215], requires_grad=True)

4.4.4 Pytorch模型實(shí)現(xiàn)

最后看一下如何使用Pytorch模型實(shí)現(xiàn),前面是手動(dòng)定義和更新參數(shù)w和b。但每次都手動(dòng)操作實(shí)在是太麻煩了,當(dāng)然還有更簡(jiǎn)單的方法。先把前面沒(méi)有變化的內(nèi)容復(fù)制過(guò)來(lái)。然后定義輸入數(shù)據(jù)的維度和輸出數(shù)據(jù)的維度,接下來(lái)使用 nn.Linear 模塊定義一個(gè)線性回歸模型,它有 input_dim 個(gè)輸入特征和 output_dim 個(gè)輸出特征。本質(zhì)上就是一個(gè)神經(jīng)元,和前面 w、b 的作用是一樣的。

然后使用 nn.MSELoss 模塊定義一個(gè)均方誤差(MSE)損失函數(shù),使用 torch.optim.SGD 模塊定義一個(gè)隨機(jī)梯度下降(SGD)優(yōu)化器,并傳入前面定義好的學(xué)習(xí)率。

import numpy as np

import torch

import torch.nn as nn


# 設(shè)置隨機(jī)數(shù)種子,使得每次運(yùn)行代碼生成的數(shù)據(jù)相同

np.random.seed(42)


# 生成隨機(jī)數(shù)據(jù)

x = np.random.rand(100, 1)

y = 1 + 2 * x + 0.1 * np.random.randn(100, 1)


# 將數(shù)據(jù)轉(zhuǎn)換為 pytorch tensor

x_tensor = torch.from_numpy(x).float()

y_tensor = torch.from_numpy(y).float()


# 設(shè)置超參數(shù)

learning_rate = 0.1

num_epochs = 1000


# 定義輸入數(shù)據(jù)的維度和輸出數(shù)據(jù)的維度

input_dim = 1

output_dim = 1


# 定義模型

model = nn.Linear(input_dim, output_dim)


# 定義損失函數(shù)和優(yōu)化器

criterion = nn.MSELoss()

optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)


# 開始訓(xùn)練

for epoch in range(num_epochs):

# 將輸入數(shù)據(jù)喂給模型

y_pred = model(x_tensor)


# 計(jì)算損失

loss = criterion(y_pred, y_tensor)


# 清空梯度

optimizer.zero_grad()


# 反向傳播

loss.backward()


# 更新參數(shù)

optimizer.step()


# 輸出訓(xùn)練后的參數(shù)

print('w:',?model.weight.data)

print('b:',?model.bias.data)

w: tensor([[1.9540]])

b: tensor([1.0215])

還是使用 for 循環(huán)迭代最大迭代次數(shù)。在每一次迭代中,我們首先用模型計(jì)算輸入數(shù)據(jù)的預(yù)測(cè)值 y_pred ,然后使用損失函數(shù)計(jì)算 ??oss ,也就是MSE均方誤差。

接著我們使用優(yōu)化器的 zero_grad 方法清空梯度,然后調(diào)用 loss.backward 來(lái)反向傳播梯度。

再直接調(diào)用優(yōu)化器的 step 方法就可以更新模型的參數(shù)。

最后還是輸出訓(xùn)練后的參數(shù) w和b。可以看到和前面手動(dòng)更新的輸出值是完全一致的。通過(guò)這種模式可以進(jìn)一步定義復(fù)雜網(wǎng)絡(luò),然后很容易的批量更新參數(shù)。

好了,這一節(jié)我們簡(jiǎn)單回顧了線性回歸的要點(diǎn),用代碼一步步實(shí)現(xiàn)了線性回歸并進(jìn)行詳細(xì)解釋,最后使用Pytorch框架快速實(shí)現(xiàn)。大家加油。


機(jī)器學(xué)習(xí)必修課

同步更新:

Github/公眾號(hào):梗直哥

學(xué)習(xí)資料&分享交流:gengzhige99


4.4 線性回歸代碼實(shí)現(xiàn)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
福安市| 平顺县| 清水县| 宝清县| 平武县| 苍南县| 泽州县| 太仓市| 嘉善县| 信阳市| 曲麻莱县| 界首市| 斗六市| 佛学| 牙克石市| 民和| 铜川市| 乐昌市| 新乐市| 河南省| 托里县| 辉南县| 九龙坡区| 鱼台县| 霸州市| 延吉市| 阿拉善盟| 万年县| 施甸县| 同德县| 丁青县| 信丰县| 新田县| 称多县| 碌曲县| 太谷县| 章丘市| 衢州市| 西青区| 开化县| 睢宁县|