最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ó)家法律
巴青县| 古丈县| 日喀则市| 黔西| 容城县| 三河市| 龙岩市| 昌吉市| 松江区| 射阳县| 逊克县| 宁安市| 且末县| 赣州市| 和静县| 高唐县| 遵义市| 浪卡子县| 巫山县| 沅陵县| 扎兰屯市| 青冈县| 攀枝花市| 大安市| 扶余县| 手游| 宽城| 峨眉山市| 蓝山县| 永州市| 鹤庆县| 呈贡县| 上饶市| 江安县| 武夷山市| 盘山县| 巨鹿县| 堆龙德庆县| 湘乡市| 香港| 西藏|