Python AI入門學習:從Hello World到線性回歸、神經(jīng)網(wǎng)絡、圖像分類
一、Python AI的Hello World
1.1 環(huán)境搭建
首先,我們需要搭建Python AI的開發(fā)環(huán)境:
# 安裝PyTorch pip install torch torchvision # 安裝其他依賴 pip install numpy matplotlib
1.2 第一個AI程序
讓我們來編寫一個最簡單的AI程序 - 線性回歸:
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
# 生成訓練數(shù)據(jù)
x = torch.linspace(0, 10, 100).unsqueeze(1)
y = 2 * x + 1 + torch.randn(100, 1) * 0.5
# 定義模型
class LinearModel(nn.Module):
def __init__(self):
super(LinearModel, self).__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
# 創(chuàng)建模型實例
model = LinearModel()
# 定義損失函數(shù)和優(yōu)化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
# 訓練模型
epochs = 100
for epoch in range(epochs):
# 前向傳播
outputs = model(x)
# 計算損失
loss = criterion(outputs, y)
# 反向傳播
optimizer.zero_grad()
loss.backward()
# 更新參數(shù)
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 測試模型
with torch.no_grad():
predicted = model(x)
# 可視化結果
plt.scatter(x.numpy(), y.numpy(), label='Original data')
plt.plot(x.numpy(), predicted.numpy(), 'r-', label='Fitted line')
plt.legend()
plt.show()
print("Hello World! AI模型訓練完成")
二、從線性回歸到神經(jīng)網(wǎng)絡
2.1 神經(jīng)網(wǎng)絡基礎
線性回歸是最簡單的AI模型,而神經(jīng)網(wǎng)絡則是更復雜的模型。讓我們來構建一個簡單的神經(jīng)網(wǎng)絡:
import torch
import torch.nn as nn
import torch.optim as optim
# 生成非線性數(shù)據(jù)
x = torch.linspace(-1, 1, 100).unsqueeze(1)
y = x.pow(2) + 0.2 * torch.randn(100, 1)
# 定義神經(jīng)網(wǎng)絡模型
class NeuralNet(nn.Module):
def __init__(self):
super(NeuralNet, self).__init__()
self.hidden = nn.Linear(1, 10)
self.output = nn.Linear(10, 1)
def forward(self, x):
x = torch.relu(self.hidden(x))
x = self.output(x)
return x
# 創(chuàng)建模型實例
model = NeuralNet()
# 定義損失函數(shù)和優(yōu)化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 訓練模型
epochs = 1000
for epoch in range(epochs):
outputs = model(x)
loss = criterion(outputs, y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (epoch + 1) % 100 == 0:
print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')
# 測試模型
with torch.no_grad():
predicted = model(x)
# 可視化結果
import matplotlib.pyplot as plt
plt.scatter(x.numpy(), y.numpy(), label='Original data')
plt.plot(x.numpy(), predicted.numpy(), 'r-', label='Neural network prediction')
plt.legend()
plt.show()
2.2 理解神經(jīng)網(wǎng)絡的工作原理
神經(jīng)網(wǎng)絡的基本原理是通過多層神經(jīng)元的組合,學習數(shù)據(jù)中的復雜模式:
- 輸入層:接收原始數(shù)據(jù)
- 隱藏層:提取數(shù)據(jù)特征
- 輸出層:產(chǎn)生預測結果
- 激活函數(shù):引入非線性,使網(wǎng)絡能夠學習復雜模式
三、圖像分類入門
3.1 數(shù)據(jù)準備
我們將使用MNIST數(shù)據(jù)集進行圖像分類:
import torch
import torchvision
import torchvision.transforms as transforms
# 數(shù)據(jù)預處理
transform = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))
])
# 加載MNIST數(shù)據(jù)集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
# 查看數(shù)據(jù)
import matplotlib.pyplot as plt
import numpy as np
# 函數(shù):顯示圖像
def imshow(img):
img = img / 2 + 0.5 # 反歸一化
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
# 獲取一批訓練數(shù)據(jù)
dataiter = iter(trainloader)
images, labels = next(dataiter)
# 顯示圖像
imshow(torchvision.utils.make_grid(images))
print('標簽:', ' '.join(f'{labels[j]}' for j in range(4)))
3.2 構建圖像分類模型
現(xiàn)在我們來構建一個用于圖像分類的卷積神經(jīng)網(wǎng)絡:
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 卷積層
self.conv1 = nn.Conv2d(1, 32, 3, 1)
self.conv2 = nn.Conv2d(32, 64, 3, 1)
# 池化層
self.pool = nn.MaxPool2d(2, 2)
# 全連接層
self.fc1 = nn.Linear(64 * 12 * 12, 128)
self.fc2 = nn.Linear(128, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 64 * 12 * 12)
x = F.relu(self.fc1(x))
x = self.fc2(x)
return x
# 創(chuàng)建模型實例
net = Net()
print(net)
3.3 訓練圖像分類模型
import torch.optim as optim
# 定義損失函數(shù)和優(yōu)化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 訓練模型
epochs = 5
for epoch in range(epochs):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
# 獲取輸入
inputs, labels = data
# 清零梯度
optimizer.zero_grad()
# 前向傳播
outputs = net(inputs)
# 計算損失
loss = criterion(outputs, labels)
# 反向傳播
loss.backward()
# 更新參數(shù)
optimizer.step()
# 統(tǒng)計損失
running_loss += loss.item()
if i % 100 == 99:
print(f'[{epoch + 1}, {i + 1}] loss: {running_loss / 100:.3f}')
running_loss = 0.0
print('訓練完成')
3.4 測試模型
# 測試模型
correct = 0
total = 0
with torch.no_grad():
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(f'測試準確率: {100 * correct / total:.2f}%')
# 查看預測結果
dataiter = iter(testloader)
images, labels = next(dataiter)
# 顯示圖像
imshow(torchvision.utils.make_grid(images))
print('真實標簽:', ' '.join(f'{labels[j]}' for j in range(4)))
# 預測
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('預測標簽:', ' '.join(f'{predicted[j]}' for j in range(4)))
四、從Rust開發(fā)者角度的思考
4.1 與Rust的對比
作為一個Rust開發(fā)者,學習Python AI有以下感受:
- 開發(fā)效率:Python的開發(fā)效率比Rust高,尤其是在AI開發(fā)中
- 生態(tài)系統(tǒng):Python的AI生態(tài)系統(tǒng)非常豐富,有大量成熟的庫
- 性能:Python的性能雖然不如Rust,但在AI開發(fā)中,PyTorch等庫已經(jīng)做了很多優(yōu)化
- 類型系統(tǒng):Python的動態(tài)類型與Rust的靜態(tài)類型有很大不同,需要適應
4.2 學習建議
對于Rust開發(fā)者學習Python AI,我有以下建議:
- 利用系統(tǒng)思維:Rust的系統(tǒng)級編程經(jīng)驗有助于理解AI模型的底層實現(xiàn)
- 注重代碼質量:保持Rust的代碼風格,寫出清晰、可維護的Python代碼
- 實踐項目:通過實際項目鞏固學習成果
- 跨語言學習:將Rust和Python結合起來,發(fā)揮各自的優(yōu)勢
五、總結
通過從Hello World到圖像分類的學習,我已經(jīng)初步掌握了Python AI的基本概念和使用方法。作為一個Rust開發(fā)者,我發(fā)現(xiàn)Python AI的學習過程既有挑戰(zhàn)也有機遇。
挑戰(zhàn)在于Python的動態(tài)類型和內存管理與Rust有很大不同,需要適應新的思維方式。機遇在于Python的AI生態(tài)系統(tǒng)非常豐富,開發(fā)效率高,能夠快速實現(xiàn)AI模型。
到此這篇關于Python AI入門學習:從Hello World到線性回歸、神經(jīng)網(wǎng)絡、圖像分類的文章就介紹到這了,更多相關Python AI學習線性回歸、神經(jīng)網(wǎng)絡、圖像分類內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解Python如何檢查一個數(shù)字是否為科技數(shù)
科技數(shù)(Tech?Number)是一種在數(shù)學上具有一定特殊性質的數(shù)字,這篇文章主要為大家詳細介紹了如何使用Python檢查一個數(shù)字是否為科技數(shù),感興趣的可以了解下2024-03-03
Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn)
這篇文章主要介紹了Selenium環(huán)境變量配置(火狐瀏覽器)及驗證實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-12-12
python使用BeautifulSoup分頁網(wǎng)頁中超鏈接的方法
這篇文章主要介紹了python使用BeautifulSoup分頁網(wǎng)頁中超鏈接的方法,涉及Python使用BeautifulSoup模塊操作網(wǎng)頁鏈接的技巧,需要的朋友可以參考下2015-04-04
python中利用zfill方法自動給數(shù)字前面補0
python中有一個zfill方法用來給字符串前面補0,非常不錯,下面小編給大家分享了實例代碼,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2018-04-04
OpenCV3.0+Python3.6實現(xiàn)特定顏色的物體追蹤
這篇文章主要為大家詳細介紹了OpenCV3.0+Python3.6實現(xiàn)特定顏色的物體追蹤,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07
使用Python制作一個數(shù)據(jù)預處理小工具(多種操作一鍵完成)
這篇文章主要介紹了使用Python制作一個數(shù)據(jù)預處理小工具(多種操作一鍵完成),本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-02-02
pytorch關于Tensor的數(shù)據(jù)類型說明
這篇文章主要介紹了pytorch關于Tensor的數(shù)據(jù)類型說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

