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

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Javaer轉(zhuǎn)AI指南:用PyTorch構(gòu)建圖像分類器

0
分享至

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

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


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

0 目標(biāo)

  • 了解分類器的任務(wù)和數(shù)據(jù)樣式

  • 掌握如何用 PyTorch 實(shí)現(xiàn)一個(gè)圖像分類器

1 分類器任務(wù)和數(shù)據(jù)介紹 1.1 任務(wù)描述

構(gòu)造一個(gè)神經(jīng)網(wǎng)絡(luò)分類器,對(duì)輸入的圖像分類,判斷它們屬哪類。

本案例目標(biāo)是區(qū)分 CIFAR10 數(shù)據(jù)集中的不同圖像。

1.2 數(shù)據(jù)介紹:CIFAR10 數(shù)據(jù)集

數(shù)據(jù)集特點(diǎn):

  • CIFAR10 包含 10 種不同類別的小型彩色圖像

  • 每張圖像尺寸為 3 × 32 × 32,代表 3 個(gè)顏色通道(RGB)

  • 10 個(gè)類別分別為:"plane"(飛機(jī))、"car"(汽車)、"bird"(鳥(niǎo))、"cat"(貓)、"deer"(鹿)、"dog"(狗)、"frog"(青蛙)、"horse"(馬)、"ship"(船)、"truck"(卡車)

2 訓(xùn)練分類器的步驟

以下是使用 PyTorch 實(shí)現(xiàn)分類器的詳細(xì)步驟,適合 Java 程序員從零開(kāi)始學(xué)習(xí)。

2.1 使用 torchvision 下載 CIFAR10 數(shù)據(jù)集

用 PyTorch 的torchvision模塊下載 CIFAR10 數(shù)據(jù)集,并對(duì)圖像進(jìn)行預(yù)處理。

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(line
# 引入 PyTorch 的核心庫(kù)和圖像處理相關(guān)的庫(kù)
import torch
import torchvision
# torchvision.transforms是pytorch中的圖像預(yù)處理包,包含很多種對(duì)圖像數(shù)據(jù)進(jìn)行變換的函數(shù)
import torchvision.transforms as transforms

# 定義數(shù)據(jù)變換:將 PIL 格式圖像轉(zhuǎn)為張量,并標(biāo)準(zhǔn)化到 [-1, 1] 區(qū)間
# 這相當(dāng)于創(chuàng)建了一個(gè)圖像預(yù)處理的管道,類似 Java 的 Builder 模式。將圖像轉(zhuǎn)換為張量并進(jìn)行標(biāo)準(zhǔn)化處理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 下載并加載訓(xùn)練集
# 類似 Java 中創(chuàng)建數(shù)據(jù)源和迭代器。CIFAR10是一個(gè)圖像數(shù)據(jù)集
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                      download=True, transform=transform)
# DataLoader類似Java的 Iterator,以批量加載數(shù)據(jù)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,
                                        shuffle=True, num_workers=2)


testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                     download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                       shuffle=False, num_workers=2)

# 定義類別名稱
classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

數(shù)據(jù)格式:torchvision的輸出是 PIL 圖像,需通過(guò)transforms.ToTensor()轉(zhuǎn)為 PyTorch 張量,并通過(guò)Normalize標(biāo)準(zhǔn)化到 [-1, 1] 范圍。

★ PIL 圖像:值范圍通常是 [0, 255](8 位無(wú)符號(hào)整數(shù),代表像素強(qiáng)度)。 ”
2.1.1 transforms.ToTensor是啥? ① 為啥要轉(zhuǎn)換?

深度學(xué)習(xí)模型需要張量,Java 中,你可能慣用int[]或List存儲(chǔ)數(shù)據(jù),但深度學(xué)習(xí)框架(如 PyTorch)需用數(shù)學(xué)張量(torch.Tensor)表示數(shù)據(jù)。張量是多維數(shù)組,類似于 Java 的多維數(shù)組,但更優(yōu)化了矩陣運(yùn)算和 GPU 加速。

如圖像的每個(gè)像素值需要作為浮點(diǎn)數(shù)輸入到神經(jīng)網(wǎng)絡(luò),而非整數(shù)。

張量支持自動(dòng)求導(dǎo)、并行計(jì)算和 GPU 加速,這是 PyTorch 高效處理數(shù)據(jù)的基礎(chǔ)。

② 格式調(diào)整

PIL 圖像或 NumPy 數(shù)組的形狀是 (H, W, C)(高度、寬度、通道),但 PyTorch 模型期望輸入為 (C, H, W)(先通道后空間),所以需要轉(zhuǎn)換。

這就像在 Java 中將一個(gè) ArrayList 轉(zhuǎn)換為某種特定格式的集合,以便適配某個(gè) API。

③ 值范圍轉(zhuǎn)換

原始值 [0, 255] 轉(zhuǎn)換為 [0, 1.0],讓數(shù)據(jù)更適合神經(jīng)網(wǎng)絡(luò)處理(神經(jīng)網(wǎng)絡(luò)通常對(duì)小范圍浮點(diǎn)數(shù)更敏感)。

④ Java 類比

想象你在 Java 中有一個(gè) Image 對(duì)象(類似 PIL 圖像),但某個(gè)庫(kù)需要 double[] 格式的數(shù)據(jù)。你需要寫一個(gè)方法將 Image 轉(zhuǎn)換為 double[],并調(diào)整值范圍(如除以 255)。ToTensor 就是這個(gè)轉(zhuǎn)換過(guò)程。

2.1.2 transforms.Normalize是啥?

ounter(lineounter(lineounter(line
# 第一個(gè) (0.5, 0.5, 0.5):每個(gè)顏色通道的均值(mean)
# 第二個(gè) (0.5, 0.5, 0.5):每個(gè)顏色通道的標(biāo)準(zhǔn)差(standard deviation)
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))

對(duì)張量進(jìn)行標(biāo)準(zhǔn)化處理。

對(duì)每個(gè)像素值,公式為:

如對(duì)于 RGB 圖像的每個(gè)通道(R、G、B),值從 [0, 1] 調(diào)整為均值為 0、標(biāo)準(zhǔn)差為 1 的分布。

  • 輸入:經(jīng)過(guò) ToTensor 后的張量,值范圍為 [0, 1]。

  • 輸出:值范圍大致為 [-1, 1](以均值為 0、標(biāo)準(zhǔn)差為 1 為中心)。

① 為啥要標(biāo)準(zhǔn)化?

提高訓(xùn)練效率:

  • 神經(jīng)網(wǎng)絡(luò)的梯度下降優(yōu)化算法(如 SGD)對(duì)輸入數(shù)據(jù)的分布敏感。若數(shù)據(jù)值范圍很大或分布不均,訓(xùn)練會(huì)變得很慢,甚至收斂困難

  • 標(biāo)準(zhǔn)化后,數(shù)據(jù)分布更均勻(均值為 0,標(biāo)準(zhǔn)差為 1),讓模型更容易學(xué)習(xí)特征

一致性:不同圖像的像素值可能有不同分布(如有些圖像偏暗、有些偏亮)。標(biāo)準(zhǔn)化確保所有圖像都遵循相同的分布,便于模型處理。

數(shù)值穩(wěn)定性:深度學(xué)習(xí)模型中的權(quán)重初始化和激活函數(shù)(如 ReLU)對(duì)輸入范圍敏感。標(biāo)準(zhǔn)化后的數(shù)據(jù)更適合這些操作。

② Java類比

想象你在 Java 中處理一組數(shù)據(jù)(如用戶年齡),數(shù)據(jù)范圍可能從 0 到 100。為讓一個(gè)算法更好處理這些數(shù)據(jù),可能用 Z-Score 標(biāo)準(zhǔn)化((age - mean) / std),讓數(shù)據(jù)分布更集中(均值為 0,標(biāo)準(zhǔn)差為 1)。Normalize 就是對(duì)圖像像素值做的類似操作。

在 Java 開(kāi)發(fā)中,你可能處理過(guò)數(shù)據(jù)歸一化(如將用戶評(píng)分從 [0, 100] 歸一化到 [0, 1]),以便算法更穩(wěn)定。標(biāo)準(zhǔn)化在這里類似,調(diào)整像素值分布,讓神經(jīng)網(wǎng)絡(luò)更容易學(xué)到模式。

2.1.3 為啥選擇 [0.5, 0.5, 0.5] 作均值和標(biāo)準(zhǔn)差?

CIFAR10 數(shù)據(jù)集特性:

  • CIFAR10 的圖像已通過(guò) ToTensor 轉(zhuǎn)換為 [0, 1] 范圍。

  • 對(duì)于 RGB 圖像,0.5 是一個(gè)合理的經(jīng)驗(yàn)值,因?yàn)?CIFAR10 的像素值分布大致是以 0.5 為中心(均值接近 0.5,標(biāo)準(zhǔn)差接近 0.5)

  • 選擇這些值可以讓數(shù)據(jù)分布更接近標(biāo)準(zhǔn)正態(tài)分布,提升模型訓(xùn)練效果。

通用性:在許多圖像分類任務(wù)中,(0.5, 0.5, 0.5) 是一個(gè)常見(jiàn)的選擇,尤其在沒(méi)有具體統(tǒng)計(jì)時(shí)作為默認(rèn)值。

① Java 程序員提示

這有點(diǎn)像在 Java 中設(shè)置一個(gè)默認(rèn)配置(如默認(rèn)線程池大小),但這里是針對(duì)圖像數(shù)據(jù)的統(tǒng)計(jì)特性設(shè)置默認(rèn)參數(shù)。

2.1.4 轉(zhuǎn)換后的數(shù)據(jù)能做啥?

  • 輸入神經(jīng)網(wǎng)絡(luò):轉(zhuǎn)換后的張量(形狀 (C, H, W),值范圍 [-1, 1])可直接輸入到你定義的卷積神經(jīng)網(wǎng)絡(luò)(如上節(jié)中的 Net)。

  • 加速訓(xùn)練:標(biāo)準(zhǔn)化后的數(shù)據(jù)分布更適合梯度下降優(yōu)化,加快模型收斂。

  • 提高精度:統(tǒng)一的數(shù)據(jù)格式和分布讓模型更容易捕捉圖像特征,從而提升分類準(zhǔn)確率。

展示訓(xùn)練集圖片

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
import matplotlib.pyplot as plt
import numpy as np

# 定義展示圖片的函數(shù)
def imshow(img):
    img = img / 2 + 0.5  # 還原標(biāo)準(zhǔn)化后的圖像到 [0, 1]
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

# 從數(shù)據(jù)加載器中讀取一批圖片
dataiter = iter(trainloader)
images, labels = next(dataiter)

# 展示圖片網(wǎng)格
imshow(torchvision.utils.make_grid(images))
# 打印對(duì)應(yīng)標(biāo)簽
print(' '.join(f'{classes[labels[j]]:5}' for j in range(4)))

  • 輸出示例:顯示 4 張圖片及其標(biāo)簽(如 "cat ship ship plane")。

2.2 定義卷積神經(jīng)網(wǎng)絡(luò)

定義一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)(CNN),處理 CIFAR10 的 3 通道圖像。

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(line
import torch.nn as nn
import torch.nn.functional as F

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # 第一層卷積:輸入 3 通道,輸出 6 通道,卷積核 5x5
        self.conv1 = nn.Conv2d(3, 6, 5)
        # 最大池化層:2x2 窗口
        self.pool = nn.MaxPool2d(2, 2)
        # 第二層卷積:輸入 6 通道,輸出 16 通道,卷積核 5x5
        self.conv2 = nn.Conv2d(6, 16, 5)
        # 全連接層
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  # 16 個(gè) 5x5 的特征圖
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)  # 輸出 10 個(gè)類別

    def forward(self, x):
        # 卷積 -> ReLU 激活 -> 池化
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        # 展平為 1 維向量
        x = x.view(-1, 16 * 5 * 5)
        # 全連接層 + ReLU
        x = F.relu(self.fc1(x))
        x = F.relu(self.fc2(x))
        # 最后一層全連接輸出
        x = self.fc3(x)
        return x

# 實(shí)例化模型
net = Net()

  • 類結(jié)構(gòu)Net繼承自nn.Module,類似于 Java 中的類繼承,定義網(wǎng)絡(luò)的層結(jié)構(gòu)

  • 卷積層nn.Conv2d類似 Java 中的對(duì)象,處理圖像的特征提取

  • 全連接層nn.Linear類似于矩陣運(yùn)算,將特征映射到類別

2.3 定義損失函數(shù)

用交叉熵?fù)p失函數(shù)(CrossEntropyLoss)和SGD優(yōu)化器。

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

# 定義損失函數(shù)和優(yōu)化器
# 交叉熵?fù)p失:適用于多分類任務(wù),計(jì)算預(yù)測(cè)概率和真實(shí)標(biāo)簽之間的差異
criterion = nn.CrossEntropyLoss()
# SGD優(yōu)化器:通過(guò)梯度下降更新模型參數(shù),lr為學(xué)習(xí)率,momentum增加收斂速度
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

2.4 在訓(xùn)練集上訓(xùn)練模型

訓(xùn)練模型需要多次迭代(epoch),使用梯度下降優(yōu)化參數(shù)。

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(line
for epoch in range(2):  # 訓(xùn)練 2 個(gè)周期  控制訓(xùn)練輪數(shù)
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0): # 內(nèi)層循環(huán)處理每批數(shù)據(jù)
# 訓(xùn)練代碼:
        # 獲取輸入和標(biāo)簽
        inputs, labels = data

        # 梯度清零
        optimizer.zero_grad()

        # 前向傳播
        outputs = net(inputs)

        # 計(jì)算損失
        loss = criterion(outputs, labels)

        # 反向傳播和優(yōu)化
        loss.backward()
        optimizer.step()

        # 記錄損失
        running_loss += loss.item()
        if (i + 1) % 2000 == 0:  # 每 2000 步打印一次
            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')
            running_loss = 0.0

print('Finished Training')

保存模型

訓(xùn)練完成后,保存模型狀態(tài)字典:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 保存路徑
PATH = './cifar_net.pth'
# 保存模型參數(shù) 類似Java的序列化
torch.save(net.state_dict(), PATH)

# 類似Java的反序列化
net.load_state_dict(torch.load(PATH))

2.5 在測(cè)試集上測(cè)試模型

展示測(cè)試集中的若干圖片:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 讀取測(cè)試集數(shù)據(jù)
dataiter = iter(testloader)
images, labels = next(dataiter)

# 展示圖片
imshow(torchvision.utils.make_grid(images))
# 打印真實(shí)標(biāo)簽
print('GroundTruth: ', ' '.join(f'{classes[labels[j]]:5}' for j in range(4)))

輸出示例:GroundTruth: cat ship ship plane

加載模型并預(yù)測(cè)

加載保存的模型,對(duì)測(cè)試圖片進(jìn)行分類:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 實(shí)例化模型
net = Net()
# 加載訓(xùn)練好的參數(shù)
net.load_state_dict(torch.load(PATH))

# 預(yù)測(cè)
outputs = net(images)
# 取概率最大的類別作為預(yù)測(cè)結(jié)果
_, predicted = torch.max(outputs, 1)

# 打印預(yù)測(cè)結(jié)果
print('Predicted: ', ' '.join(f'{classes[predicted[j]]:5}' for j in range(4)))

輸出示例:Predicted: cat ship ship plane

整體測(cè)試集表現(xiàn)

計(jì)算模型在整個(gè)測(cè)試集上的準(zhǔn)確率:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
correct = 0
total = 0
with torch.no_grad():  # 不計(jì)算梯度以節(jié)省內(nèi)存
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total))

輸出示例:Accuracy of the network on the 10000 test images: 53 %

按類別分析準(zhǔn)確率

細(xì)化分析模型在每個(gè)類別的表現(xiàn):

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
# 創(chuàng)建兩個(gè)數(shù)組來(lái)統(tǒng)計(jì)每個(gè)類別的正確預(yù)測(cè)數(shù)、總數(shù)
class_correct = [0. for _ in range(10)]
class_total = [0. for _ in range(10)]
with torch.no_grad():
    for data in testloader:
        images, labels = data
        outputs = net(images)
        _, predicted = torch.max(outputs, 1)
        c = (predicted == labels).squeeze()
        for i in range(4):  # 每次處理 4 張圖片
            label = labels[i]
            class_correct[label] += c[i].item()
            class_total[label] += 1

for i in range(10):
    print('Accuracy of %5s : %2d %%' % (classes[i], 100 * class_correct[i] / class_total[i]))

輸出示例:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line
Accuracy of plane : 62 %
Accuracy of   car : 62 %
Accuracy of  bird : 45 %
Accuracy of   cat : 36 %
Accuracy of  deer : 52 %
Accuracy of   dog : 25 %
Accuracy of  frog : 69 %
Accuracy of horse : 60 %
Accuracy of  ship : 70 %
Accuracy of truck : 48 %

3 在 GPU 上訓(xùn)練模型

為加速訓(xùn)練,可將模型和數(shù)據(jù)轉(zhuǎn)移到GPU。

定義設(shè)備并檢查是否可用 CUDA:

ounter(lineounter(line
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print(device)

輸出示例:cuda:0(若 GPU 可用)或cpu(若無(wú) GPU)。

將模型和數(shù)據(jù)轉(zhuǎn)移到GPU:

ounter(lineounter(lineounter(lineounter(lineounter(line
# 將模型轉(zhuǎn)移到 GPU
net.to(device)

# 訓(xùn)練時(shí)將輸入和標(biāo)簽轉(zhuǎn)移到 GPU
inputs, labels = data[0].to(device), data[1].to(device)

確保你的環(huán)境安裝了 CUDA 支持,并更新 PyTorch 為 GPU 版本。

4 總結(jié) 分類器的任務(wù)和數(shù)據(jù)樣式

  • 任務(wù):使用神經(jīng)網(wǎng)絡(luò)分類器對(duì) CIFAR10 數(shù)據(jù)集中的圖像進(jìn)行分類,判斷它們屬于 10 個(gè)類別之一

  • 數(shù)據(jù):CIFAR10 數(shù)據(jù)集包含 10 個(gè)類別的 3 × 32 × 32 彩色圖像

訓(xùn)練分類器的步驟
  1. 下載數(shù)據(jù)集:使用torchvision下載 CIFAR10 數(shù)據(jù)集,并預(yù)處理為張量格式

  2. 定義網(wǎng)絡(luò):構(gòu)建一個(gè)卷積神經(jīng)網(wǎng)絡(luò)(CNN),包含卷積層、池化層和全連接層

  3. 定義損失和優(yōu)化:使用交叉熵?fù)p失函數(shù)和 SGD 優(yōu)化器

  4. 訓(xùn)練模型:在訓(xùn)練集上進(jìn)行多次迭代,優(yōu)化模型參數(shù)

  5. 測(cè)試模型:在測(cè)試集上評(píng)估模型性能,計(jì)算準(zhǔn)確率和按類別分析

在 GPU 上訓(xùn)練模型
  • 設(shè)備選擇:使用torch.device選擇 CPU 或 GPU

  • 模型轉(zhuǎn)移:將模型和數(shù)據(jù)轉(zhuǎn)移到 GPU 上以加速訓(xùn)練


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

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

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

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

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

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

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

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

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(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)推薦
熱點(diǎn)推薦
耐克悄然出售旗下品牌,四大品牌變成三個(gè)

耐克悄然出售旗下品牌,四大品牌變成三個(gè)

FLIGHTCLUB中文站
2026-01-11 12:04:30
特朗普考慮干涉伊朗,但其幕僚擔(dān)心“軍事行動(dòng)將破壞抗議活動(dòng)”

特朗普考慮干涉伊朗,但其幕僚擔(dān)心“軍事行動(dòng)將破壞抗議活動(dòng)”

文匯報(bào)
2026-01-12 03:58:05
原來(lái)是他娶了譚維維!被譽(yù)為“不老男神”,曾在海拔5600米上求婚

原來(lái)是他娶了譚維維!被譽(yù)為“不老男神”,曾在海拔5600米上求婚

韓馳
2025-12-25 20:04:01
遼籃慘敗廣東揪出三大死穴!楊鳴還在啃老本:外援竟狂輸對(duì)手44分

遼籃慘敗廣東揪出三大死穴!楊鳴還在啃老本:外援竟狂輸對(duì)手44分

籃球快餐車
2026-01-12 01:36:41
前國(guó)腳定居西班牙多年,賣5套房花費(fèi)1000萬(wàn),如今沒(méi)有工作吃老本

前國(guó)腳定居西班牙多年,賣5套房花費(fèi)1000萬(wàn),如今沒(méi)有工作吃老本

素衣讀史
2025-12-30 18:06:27
切爾西血虧!400萬(wàn)甩賣的天才,如今估值超6000萬(wàn), 槍手曼城瘋搶

切爾西血虧!400萬(wàn)甩賣的天才,如今估值超6000萬(wàn), 槍手曼城瘋搶

瀾歸序
2026-01-11 02:24:33
張凌赫是娛樂(lè)圈隱藏的浙江滬少爺!網(wǎng)友:難怪一個(gè)眼神就帥到國(guó)外

張凌赫是娛樂(lè)圈隱藏的浙江滬少爺!網(wǎng)友:難怪一個(gè)眼神就帥到國(guó)外

小霍霍
2026-01-09 16:32:42
絕不姑息!國(guó)家出手逮捕的5位華人首富,原因曝光下才知罪有應(yīng)得

絕不姑息!國(guó)家出手逮捕的5位華人首富,原因曝光下才知罪有應(yīng)得

老鼳是個(gè)手藝人
2026-01-02 11:36:20
“兒子都腺樣體了,還吃烤腸呢?”一份糊弄早餐暴露家長(zhǎng)的低認(rèn)知

“兒子都腺樣體了,還吃烤腸呢?”一份糊弄早餐暴露家長(zhǎng)的低認(rèn)知

妍妍教育日記
2025-12-26 17:18:26
法院判了!男子入新加坡籍后未銷中國(guó)戶籍,這代價(jià)有點(diǎn)大

法院判了!男子入新加坡籍后未銷中國(guó)戶籍,這代價(jià)有點(diǎn)大

小李睡不醒了
2026-01-11 22:25:06
日本算清楚了,中國(guó)老實(shí),挑釁中國(guó)的最壞結(jié)果,他們完全可以接受

日本算清楚了,中國(guó)老實(shí),挑釁中國(guó)的最壞結(jié)果,他們完全可以接受

時(shí)分秒說(shuō)
2025-12-23 11:20:17
張雨綺穿搭終于找對(duì)風(fēng)格,我發(fā)現(xiàn):衣服在精不在多,這么穿更時(shí)髦

張雨綺穿搭終于找對(duì)風(fēng)格,我發(fā)現(xiàn):衣服在精不在多,這么穿更時(shí)髦

八分搭配
2026-01-05 23:46:22
突變!竟然說(shuō)出這句話!“沒(méi)美國(guó),你在中國(guó)俄羅斯面前,啥也不是!”

突變!竟然說(shuō)出這句話!“沒(méi)美國(guó),你在中國(guó)俄羅斯面前,啥也不是!”

喀秋莎大世界
2026-01-08 22:33:44
2025年俱樂(lè)部球衣銷量榜:皇馬居首,巴薩第二,巴黎第三

2025年俱樂(lè)部球衣銷量榜:皇馬居首,巴薩第二,巴黎第三

懂球帝
2026-01-11 18:17:13
痛心!陜西15歲“巨嬰”孫寶去世,媽媽背著爬華山,網(wǎng)友:解脫了

痛心!陜西15歲“巨嬰”孫寶去世,媽媽背著爬華山,網(wǎng)友:解脫了

靜若梨花
2026-01-07 17:00:46
62歲穆帥哭暈?被解雇166天后,舊主破2年半冠軍荒!2-0掀翻死敵

62歲穆帥哭暈?被解雇166天后,舊主破2年半冠軍荒!2-0掀翻死敵

我愛(ài)英超
2026-01-11 06:47:54
安徽美女陳秀麗去世,僅35歲,天天跑步喝黑咖啡,脖子長(zhǎng)疙瘩確診

安徽美女陳秀麗去世,僅35歲,天天跑步喝黑咖啡,脖子長(zhǎng)疙瘩確診

削桐作琴
2026-01-09 12:45:18
央視怒批,人民日?qǐng)?bào)點(diǎn)名封殺,這5位目無(wú)法紀(jì)的大網(wǎng)紅,徹底涼涼

央視怒批,人民日?qǐng)?bào)點(diǎn)名封殺,這5位目無(wú)法紀(jì)的大網(wǎng)紅,徹底涼涼

一娛三分地
2025-12-04 17:00:33
“年度反腐大片”披露:5干部喝4瓶白酒后縣委政法委副書(shū)記死亡 報(bào)告中寫“在家中因突發(fā)疾病去世”

“年度反腐大片”披露:5干部喝4瓶白酒后縣委政法委副書(shū)記死亡 報(bào)告中寫“在家中因突發(fā)疾病去世”

紅星新聞
2026-01-11 22:04:26
人類對(duì)閑魚(yú)的開(kāi)發(fā)不足1%,一群神人把我笑發(fā)財(cái)了

人類對(duì)閑魚(yú)的開(kāi)發(fā)不足1%,一群神人把我笑發(fā)財(cái)了

另子維愛(ài)讀史
2026-01-11 21:09:06
2026-01-12 04:51:00
JavaEdge incentive-icons
JavaEdge
Java 技術(shù)
466文章數(shù) 457關(guān)注度
往期回顧 全部

科技要聞

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

頭條要聞

美軍突襲委內(nèi)瑞拉俄制防空系統(tǒng)失聯(lián) 俄方回應(yīng)

頭條要聞

美軍突襲委內(nèi)瑞拉俄制防空系統(tǒng)失聯(lián) 俄方回應(yīng)

體育要聞

U23國(guó)足形勢(shì):末輪不負(fù)泰國(guó)即確保晉級(jí)

娛樂(lè)要聞

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

財(cái)經(jīng)要聞

外賣平臺(tái)"燒錢搶存量市場(chǎng)"迎來(lái)終局?

汽車要聞

2026款宋Pro DM-i長(zhǎng)續(xù)航補(bǔ)貼后9.98萬(wàn)起

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

時(shí)尚
家居
手機(jī)
親子
軍事航空

當(dāng)一個(gè)57歲的女人,決定從零開(kāi)始

家居要聞

木色留白 演繹現(xiàn)代自由

手機(jī)要聞

曝三星Galaxy S26 Ultra支持?eSIM,新機(jī)下月見(jiàn)

親子要聞

最近的孩子怎么都長(zhǎng)得這么著急?你不說(shuō),誰(shuí)知道他還是個(gè)寶寶?

軍事要聞

俄大使:馬杜羅夫婦被控制時(shí)身邊沒(méi)人

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版