国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Javaer轉(zhuǎn)AI指南:用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)

0
分享至

點擊下方“JavaEdge”,選擇“設(shè)為星標(biāo)”

第一時間關(guān)注技術(shù)干貨!


免責(zé)聲明~ 任何文章不要過度深思! 萬事萬物都經(jīng)不起審視,因為世上沒有同樣的成長環(huán)境,也沒有同樣的認(rèn)知水平,更「沒有適用于所有人的解決方案」; 不要急著評判文章列出的觀點,只需代入其中,適度審視一番自己即可,能「跳脫出來從外人的角度看看現(xiàn)在的自己處在什么樣的階段」才不為俗人。 怎么想、怎么做,全在乎自己「不斷實踐中尋找適合自己的大道」

0 學(xué)習(xí)目標(biāo)

掌握使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的基本流程和實現(xiàn)過程。PyTorch是一個強大的深度學(xué)習(xí)框架,其核心工具集中在torch.nn包中。這個包依賴于自動求導(dǎo)(autograd)機制來定義模型并計算梯度,省去了手動編寫復(fù)雜數(shù)學(xué)公式的需求。

對于Java開發(fā)者來說,PyTorch的神經(jīng)網(wǎng)絡(luò)構(gòu)建類似于設(shè)計一個復(fù)雜的Java類系統(tǒng):你需要定義類、方法和字段,并通過循環(huán)和算法優(yōu)化來處理數(shù)據(jù)和學(xué)習(xí)。

構(gòu)建神經(jīng)網(wǎng)絡(luò)的流程

以下是構(gòu)建神經(jīng)網(wǎng)絡(luò)的6個核心步驟,類似Java中開發(fā)一個數(shù)據(jù)處理系統(tǒng):

  • 定義一個包含可學(xué)習(xí)參數(shù)的神經(jīng)網(wǎng)絡(luò)(類似Java類和字段)。

  • 遍歷訓(xùn)練數(shù)據(jù)集(類似Java中的for循環(huán)或迭代器)。

  • 處理輸入數(shù)據(jù)使其流經(jīng)神經(jīng)網(wǎng)絡(luò)(前向傳播,類似數(shù)據(jù)流經(jīng)對象方法)。

  • 計算損失值(評估預(yù)測結(jié)果與真實結(jié)果的差距,類似Java中的誤差計算方法)。

  • 將網(wǎng)絡(luò)參數(shù)的梯度進行反向傳播(類似Java中根據(jù)誤差調(diào)整字段值)。

  • 按照特定規(guī)則更新網(wǎng)絡(luò)權(quán)重(類似Java中的優(yōu)化算法,如梯度下降)。

1 定義一個神經(jīng)網(wǎng)絡(luò)

PyTorch中的神經(jīng)網(wǎng)絡(luò)通過定義一個類來實現(xiàn),類似于Java中的面向?qū)ο缶幊?。以下是代碼和詳細(xì)解釋:

代碼示例

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
import torch
import torch.nn as nn
import torch.nn.functional as F

# 定義神經(jīng)網(wǎng)絡(luò)類,繼承自nn.Module(類似Java的繼承)
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 第一層卷積層:輸入1個通道(例如灰度圖像),輸出6個通道,卷積核大小3x3
        self.conv1 = nn.Conv2d(1, 6, 3)
        # 第二層卷積層:輸入6個通道,輸出16個通道,卷積核大小3x3
        self.conv2 = nn.Conv2d(6, 16, 3)
        # 三層全連接層:展平后的輸入維度為16 * 6 * 6,輸出維度依次為120、84、10
        self.fc1 = nn.Linear(16 * 6 * 6, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    # 前向傳播方法,定義數(shù)據(jù)如何流經(jīng)網(wǎng)絡(luò)(類似Java方法)
    def forward(self, x):
        # 卷積 + 激活(ReLU) + 最大池化
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
        # 再次卷積 + 激活 + 最大池化
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)
        # 展平數(shù)據(jù),方便全連接層處理(類似Java中矩陣轉(zhuǎn)置或展平)
        x = x.view(-1, self.num_flat_features(x))
        # 全連接層 + 激活
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        # 輸出層
        x = self.fc3(x)
        return x

    # 計算展平后的特征數(shù)量(輔助方法)
    def num_flat_features(self, x):
        # 忽略批次維度(第0維),計算其余維度的乘積
        size = x.size()[1:]  # 類似Java中獲取數(shù)組維度
        num_features = 1
        for s in size:
            num_features *= s
        return num_features

# 創(chuàng)建網(wǎng)絡(luò)實例
net = Net()
print(net)  # 打印網(wǎng)絡(luò)結(jié)構(gòu)

詳細(xì)講解(面向Java開發(fā)者)
  • 類定義Net類繼承nn.Module,類似于Java中的class Net extends BaseModel。nn.Module提供了管理參數(shù)和網(wǎng)絡(luò)層的基礎(chǔ)功能。

  • 初始化(__init__:相當(dāng)于Java的構(gòu)造函數(shù),這里定義網(wǎng)絡(luò)的層:

    • nn.Conv2d是卷積層,類似圖像處理中的濾波器,參數(shù)表示輸入/輸出通道數(shù)和卷積核大小。

    • nn.Linear是全連接層,類似Java中的矩陣乘法,輸入和輸出維度由參數(shù)指定。

  • 前向傳播(forward:定義數(shù)據(jù)如何通過網(wǎng)絡(luò)處理,類似于Java中的方法調(diào)用鏈。F.relu是激活函數(shù)(類似Math.max(0, x)),F.max_pool2d是池化操作(降采樣,減少數(shù)據(jù)維度)。

  • 參數(shù)管理net.parameters()返回所有可訓(xùn)練參數(shù)(權(quán)重和偏置),類似于Java中List ,可以用來迭代更新。

測試網(wǎng)絡(luò)

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 生成隨機輸入數(shù)據(jù),形狀為(1, 1, 32, 32):1個樣本、1個通道、32x32像素
input = torch.randn(1, 1, 32, 32)
out = net(input)  # 前向傳播,輸出形狀為(1, 10),表示10個類別的預(yù)測
print(out)

# 獲取并查看參數(shù)
params = list(net.parameters())
print(len(params))      # 參數(shù)組數(shù)(每層權(quán)重和偏置)
print(params[0].size()) # 第一個參數(shù)的形狀(例如權(quán)重矩陣維度)

# 清零梯度并執(zhí)行反向傳播
net.zero_grad()
out.backward(torch.randn(1, 10))  # 模擬反向傳播

  • 輸入要求:PyTorch的nn.Conv2d需要4D張量(nSamples, nChannels, Height, Width),不支持單樣本輸入。如果輸入是3D張量,需要用input.unsqueeze(0)擴展為4D,類似Java中手動調(diào)整數(shù)組維度。

2 損失函數(shù)

損失函數(shù)用來評估網(wǎng)絡(luò)輸出(預(yù)測)和目標(biāo)(真實值)之間的差距,類似于Java中定義一個誤差計算方法。

代碼示例

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 獲取網(wǎng)絡(luò)輸出
output = net(input)
# 生成隨機目標(biāo),形狀為(10,),調(diào)整為(1, 10)與output匹配
target = torch.randn(10)
target = target.view(1, -1)  # 調(diào)整形狀

# 定義均方誤差損失函數(shù)
criterion = nn.MSELoss()
# 計算損失值,一個標(biāo)量表示預(yù)測與目標(biāo)的差距
loss = criterion(output, target)
print(loss)

# 查看損失的計算圖
print(loss.grad_fn)  # 輸出損失的計算節(jié)點(如MSELoss)
print(loss.grad_fn.next_functions[0][0])  # 線性層
print(loss.grad_fn.next_functions[0][0].next_functions[0][0])  # ReLU

詳細(xì)講解
  • 損失函數(shù)nn.MSELoss計算均方誤差((output - target)^2的平均值),類似于Java中的平方差計算。

  • 計算圖:PyTorch自動構(gòu)建計算圖(類似Java的依賴樹),loss.grad_fn顯示計算路徑(如input -> conv2d -> relu -> ... -> MSELoss -> loss)。

  • 自動求導(dǎo):當(dāng)調(diào)用loss.backward()時,PyTorch會對所有requires_grad=True的張量計算梯度,并累加到.grad屬性,類似Java中追蹤對象依賴并更新字段。

3 反向傳播(Backpropagation)

反向傳播是神經(jīng)網(wǎng)絡(luò)訓(xùn)練的核心,用于計算每個參數(shù)的梯度,進而優(yōu)化模型。

代碼示例

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 清零梯度,防止累加
net.zero_grad()

# 打印反向傳播前的梯度
print('conv1.bias.grad before backward')
print(net.conv1.bias.grad)  # 初始為0

# 執(zhí)行反向傳播
loss.backward()

# 打印反向傳播后的梯度
print('conv1.bias.grad after backward')
print(net.conv1.bias.grad)  # 梯度變?yōu)榉橇阒?/code>

詳細(xì)講解
  • 梯度清零net.zero_grad()清空所有參數(shù)的梯度,類似于Java中重置計數(shù)器或清空緩存,防止不同批次數(shù)據(jù)的梯度累加。

  • 反向傳播loss.backward()從損失值開始,沿著計算圖反向計算每個參數(shù)的梯度,存入.grad屬性,類似Java中根據(jù)誤差反向調(diào)整對象字段。

  • 重要性:確保每次訓(xùn)練迭代開始時梯度為0,避免累積誤差影響訓(xùn)練。

4 更新網(wǎng)絡(luò)參數(shù)

訓(xùn)練的最后一步是根據(jù)梯度更新參數(shù),最常見的方法是隨機梯度下降(SGD)。更新公式為:

傳統(tǒng)方法

ounter(lineounter(lineounter(line
learning_rate = 0.01
for f in net.parameters():
    f.data.sub_(f.grad.data * learning_rate)  # 手動更新參數(shù)

PyTorch優(yōu)化器(推薦)

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
import torch.optim as optim

# 創(chuàng)建SGD優(yōu)化器,管理網(wǎng)絡(luò)參數(shù),學(xué)習(xí)率為0.01
optimizer = optim.SGD(net.parameters(), lr=0.01)

# 訓(xùn)練步驟
optimizer.zero_grad()      # 清零梯度
output = net(input)        # 前向傳播
loss = criterion(output, target)  # 計算損失
loss.backward()            # 反向傳播
optimizer.step()           # 更新參數(shù)

詳細(xì)講解
  • 手動SGD:直接用公式更新參數(shù),類似Java中循環(huán)遍歷對象字段并應(yīng)用算法。

  • 優(yōu)化器optim.SGD是PyTorch提供的工具,封裝了SGD邏輯,類似Java中的優(yōu)化算法庫,簡化了參數(shù)更新。

  • 步驟optimizer.step()自動根據(jù)梯度更新所有參數(shù),比手動循環(huán)更高效。

5 總結(jié) 構(gòu)建神經(jīng)網(wǎng)絡(luò)的典型流程
  1. 定義網(wǎng)絡(luò):創(chuàng)建一個包含可學(xué)習(xí)參數(shù)的類(類似Java類),定義層和前向傳播邏輯。

  2. 遍歷數(shù)據(jù):使用數(shù)據(jù)集循環(huán)訓(xùn)練(類似Java的for循環(huán))。

  3. 前向傳播:處理輸入數(shù)據(jù)得到預(yù)測(類似方法調(diào)用鏈)。

  4. 計算損失:用損失函數(shù)(如nn.MSELoss)評估預(yù)測與目標(biāo)差距。

  5. 反向傳播:通過loss.backward()計算梯度(類似Java中反向調(diào)整字段)。

  6. 更新參數(shù):用優(yōu)化器(如optim.SGD)更新權(quán)重(類似Java中優(yōu)化算法)。

關(guān)鍵技術(shù)點
  • 損失函數(shù)nn.MSELoss計算均方誤差,loss.backward()觸發(fā)自動求導(dǎo),更新requires_grad=True張量的.grad屬性。

  • 反向傳播net.zero_grad()清零梯度,loss.backward()計算梯度,確保每次迭代獨立。

  • 參數(shù)更新:通過優(yōu)化器(如SGD)實現(xiàn),公式為weight = weight - learning_rate * gradient

面向Java開發(fā)者的類比

構(gòu)建PyTorch神經(jīng)網(wǎng)絡(luò)就像設(shè)計一個Java系統(tǒng):

  • 網(wǎng)絡(luò)類Net類似于Java類,層(如nn.Conv2d、nn.Linear)是字段。

  • 前向傳播和反向傳播是方法調(diào)用,損失函數(shù)和優(yōu)化器像是Java中的工具類。

  • PyTorch的自動求導(dǎo)省去了手動計算梯度的麻煩,類似Java框架(如Spring)自動管理依賴。


本文已收錄在Github Java-Interview-Tutorial,關(guān)注我,緊跟本系列專欄文章,咱們下篇再續(xù)!

  • 魔都架構(gòu)師 | 全網(wǎng)30W+技術(shù)追隨者

  • 大廠分布式系統(tǒng)/數(shù)據(jù)中臺實戰(zhàn)專家

  • 主導(dǎo)交易系統(tǒng)億級流量調(diào)優(yōu) & 車聯(lián)網(wǎng)平臺架構(gòu)

  • AIGC應(yīng)用開發(fā)先行者 | 區(qū)塊鏈落地實踐者

  • 以技術(shù)驅(qū)動創(chuàng)新,我們的征途是改變世界!

  • 實戰(zhàn)干貨:編程嚴(yán)選網(wǎng)

關(guān)注我,緊跟本系列專欄文章,咱們下篇再續(xù)!

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
2340萬人創(chuàng)出5.65萬億GDP,臺灣人均GDP遠(yuǎn)超京滬,憑啥這么能打?

2340萬人創(chuàng)出5.65萬億GDP,臺灣人均GDP遠(yuǎn)超京滬,憑啥這么能打?

墨蘭史書
2026-01-04 17:40:03
伊能靜參觀清真寺,包著頭巾不敢大聲說話,秦昊把她拍得像130斤

伊能靜參觀清真寺,包著頭巾不敢大聲說話,秦昊把她拍得像130斤

心靜物娛
2026-01-11 10:03:04
塞梅尼奧6250萬英鎊轉(zhuǎn)會曼城,買下整版報紙致謝伯恩茅斯球迷

塞梅尼奧6250萬英鎊轉(zhuǎn)會曼城,買下整版報紙致謝伯恩茅斯球迷

星耀國際足壇
2026-01-10 23:33:32
皇帝駕崩時,殉葬妃子雙腿為何都是張開的?死前經(jīng)歷了什么

皇帝駕崩時,殉葬妃子雙腿為何都是張開的?死前經(jīng)歷了什么

小嵩
2025-11-14 18:33:36
經(jīng)濟一差,到處都是詐騙。

經(jīng)濟一差,到處都是詐騙。

愛吃糖的貓cat
2026-01-11 14:04:09
慈禧太后一天的生活開銷,放在今天,大概需要多少人民幣維持?

慈禧太后一天的生活開銷,放在今天,大概需要多少人民幣維持?

銘記歷史呀
2026-01-08 08:42:11
周日焦點戰(zhàn)前瞻:國足迪拜迎強敵,邵佳一首秀對決“袋鼠軍團”

周日焦點戰(zhàn)前瞻:國足迪拜迎強敵,邵佳一首秀對決“袋鼠軍團”

小何足球
2026-01-11 16:28:50
好久不見!廣東舊將現(xiàn)身業(yè)余比賽 曾是杜鋒愛徒 因傷遺憾退役

好久不見!廣東舊將現(xiàn)身業(yè)余比賽 曾是杜鋒愛徒 因傷遺憾退役

胖子噴球
2026-01-10 19:41:44
調(diào)整!1月11日央視直播WTT冠軍賽有變,CCTV5直播,附賽程!

調(diào)整!1月11日央視直播WTT冠軍賽有變,CCTV5直播,附賽程!

皮皮觀天下
2026-01-11 13:50:50
閆學(xué)晶的兒媳婦太卑微,不僅要穿婆婆的舊衣服,還要吃婆婆的剩飯

閆學(xué)晶的兒媳婦太卑微,不僅要穿婆婆的舊衣服,還要吃婆婆的剩飯

鋭娛之樂
2026-01-01 13:48:53
解放軍戰(zhàn)機飛過宮古海峽,日方極力隱藏的秘密,被中方發(fā)現(xiàn)了

解放軍戰(zhàn)機飛過宮古海峽,日方極力隱藏的秘密,被中方發(fā)現(xiàn)了

空天力量
2026-01-11 13:17:27
百年龐家故事大揭秘:他們?yōu)楹尾贿x擇離開大陸?

百年龐家故事大揭秘:他們?yōu)楹尾贿x擇離開大陸?

金牌輿情官
2025-12-25 20:15:34
給人養(yǎng)了7年閑人,廣汽終于要關(guān)閉洛杉磯的研發(fā)中心

給人養(yǎng)了7年閑人,廣汽終于要關(guān)閉洛杉磯的研發(fā)中心

與車同樂
2025-12-04 10:05:02
外交途徑關(guān)閉?俄羅斯拒絕第三方介入!基輔凌晨遭大規(guī)模轟炸!

外交途徑關(guān)閉?俄羅斯拒絕第三方介入!基輔凌晨遭大規(guī)模轟炸!

阿芒娛樂說
2026-01-11 16:47:31
退出國家隊,赴德國打球后離婚,如今已過去24年,丁松現(xiàn)狀如何?

退出國家隊,赴德國打球后離婚,如今已過去24年,丁松現(xiàn)狀如何?

比利
2026-01-09 12:18:11
近200名印度裔高管被裁,美國人終驚醒阿三不靠譜?印度CEO崩了!

近200名印度裔高管被裁,美國人終驚醒阿三不靠譜?印度CEO崩了!

墨蘭史書
2025-12-25 08:20:05
卸任孫穎莎教練,邱貽可退出?國乒官宣,誰注意多哈賽教練組名單

卸任孫穎莎教練,邱貽可退出?國乒官宣,誰注意多哈賽教練組名單

樂聊球
2026-01-10 14:54:08
不打球了!CBA名將選擇退役,轉(zhuǎn)型為助理教練

不打球了!CBA名將選擇退役,轉(zhuǎn)型為助理教練

籃球大陸
2026-01-11 15:40:09
美論壇:38輛美軍坦克運往臺灣,中國為什么不敢阻止?

美論壇:38輛美軍坦克運往臺灣,中國為什么不敢阻止?

無情有思可
2026-01-10 03:32:32
開始清算?閆學(xué)晶再迎3大噩耗,這一次,誰也救不了自掘墳?zāi)沟乃?>
    </a>
        <h3>
      <a href=觀察鑒娛
2026-01-11 15:00:55
2026-01-11 17:59:00
JavaEdge incentive-icons
JavaEdge
Java 技術(shù)
466文章數(shù) 457關(guān)注度
往期回顧 全部

科技要聞

“我們與美國的差距也許還在拉大”

頭條要聞

網(wǎng)約車送斷指乘客在交警帶路闖紅燈時出車禍 被判全責(zé)

頭條要聞

網(wǎng)約車送斷指乘客在交警帶路闖紅燈時出車禍 被判全責(zé)

體育要聞

詹皇曬照不滿打手沒哨 裁判報告最后兩分鐘無誤判

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財經(jīng)要聞

外賣平臺"燒錢搶存量市場"迎來終局?

汽車要聞

2026款宋Pro DM-i長續(xù)航補貼后9.98萬起

態(tài)度原創(chuàng)

親子
藝術(shù)
游戲
公開課
軍事航空

親子要聞

爸媽總是對外人比對我好

藝術(shù)要聞

引爆期待!275米,東莞第四高樓封頂!

《天下貳·經(jīng)典版》火爆來襲!搬磚賺錢真是爽!

公開課

李玫瑾:為什么性格比能力更重要?

軍事要聞

俄大使:馬杜羅夫婦被控制時身邊沒人

無障礙瀏覽 進入關(guān)懷版