日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python训练手势分类器_使用Pytorch训练分类器详解(附python演练)

發布時間:2023/12/19 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python训练手势分类器_使用Pytorch训练分类器详解(附python演练) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【前言】:你已經了解了如何定義神經網絡,計算loss值和網絡里權重的更新。現在你也許會想數據怎么樣?

目錄:

一.數據

二.訓練一個圖像分類器

使用torchvision加載并且歸一化CIFAR10的訓練和測試數據集

定義一個卷積神經網絡

定義一個損失函數

在訓練樣本數據上訓練網絡

在測試樣本數據上測試網絡

三.在GPU上訓練

四.在多個GPU上訓練

五.還可以學哪些?

一、 數據

通常來說,當你處理圖像,文本,語音或者視頻數據時,你可以使用標準python包將數據加載成numpy數組格式,然后將這個數組轉換成torch.*Tensor

對于圖像,可以用Pillow,OpenCV

對于語音,可以用scipy,librosa

對于文本,可以直接用Python或Cython基礎數據加載模塊,或者用NLTK和SpaCy

特別是對于視覺,我們已經創建了一個叫做totchvision的包,該包含有支持加載類似Imagenet,CIFAR10,MNIST等公共數據集的數據加載模塊torchvision.datasets和支持加載圖像數據數據轉換模塊torch.utils.data.DataLoader。

這提供了極大的便利,并且避免了編寫“樣板代碼”。

對于本教程,我們將使用CIFAR10數據集,它包含十個類別:‘airplane’, ‘automobile’, ‘bird’, ‘cat’, ‘deer’, ‘dog’, ‘frog’, ‘horse’, ‘ship’, ‘truck’。CIFAR-10中的圖像尺寸為33232,也就是RGB的3層顏色通道,每層通道內的尺寸為32*32。

二、 訓練一個圖像分類器

我們將按次序的做如下幾步:

使用torchvision加載并且歸一化CIFAR10的訓練和測試數據集

定義一個卷積神經網絡

定義一個損失函數

在訓練樣本數據上訓練網絡

在測試樣本數據上測試網絡

加載并歸一化CIFAR10

使用torchvision,用它來加載CIFAR10數據非常簡單

import torch

import torchvision

import torchvision.transformsastransforms

torchvision數據集的輸出是范圍在[0,1]之間的PILImage,我們將他們轉換成歸一化范圍為[-1,1]之間的張量Tensors。

transform = transforms.Compose(

[transforms.ToTensor(),

transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,

download=True,transform=transform)

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')

輸出:

Downloading https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz to ./data/cifar-10-python.tar.gz Files already downloaded and verified

讓我們來展示其中的一些訓練圖片。

import matplotlib.pyplot as plt

import numpy as np

# 圖像顯示函數

defimshow(img):

img = img /2+0.5 # 非標準的(unnormalized)

npimg = img.numpy()

plt.imshow(np.transpose(npimg, (1, 2, 0)))

plt.show()

# 得到一些隨機圖像

dataiter =iter(trainloader)images, labels = dataiter.next()

# 顯示圖像

imshow(torchvision.utils.make_grid(images))

# 打印類標

print(' '.join('%5s'% classes[labels[j]] for j inrange(4)))

輸出:

cat car dog cat

定義一個卷積神經網絡

在這之前先 從神經網絡章節 復制神經網絡,并修改它為3通道的圖片(在此之前它被定義為1通道)

import torch.nn as nn

import torch.nn.functional as F

classNet(nn.Module):

def __init__(self):

super(Net, self).__init__()

self.conv1 = nn.Conv2d(3, 6, 5)

self.pool = nn.MaxPool2d(2, 2)

self.conv2 = nn.Conv2d(6, 16, 5)

self.fc1 = nn.Linear(16*5*5, 120)

self.fc2 = nn.Linear(120, 84)

self.fc3 = nn.Linear(84, 10)

defforward(self, x):

x =self.pool(F.relu(self.conv1(x)))

x =self.pool(F.relu(self.conv2(x)))

x = x.view(-1, 16*5*5)

x = F.relu(self.fc1(x))

x = F.relu(self.fc2(x))

x =self.fc3(x)

return x

net = Net()

定義一個損失函數和優化器

讓我們使用分類交叉熵Cross-Entropy 作損失函數,動量SGD做優化器。

import torch.optim as optim

criterion = nn.CrossEntropyLoss()optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

訓練網絡

這里事情開始變得有趣,我們只需要在數據迭代器上循環傳給網絡和優化器輸入就可以。

for epoch inrange(2): # 多次循環遍歷數據集

running_loss =0.0

for i, data inenumerate(trainloader, 0):

# 獲取輸入

inputs, labels = data

# 參數梯度置零

optimizer.zero_grad()

# 前向+ 反向 + 優化

outputs = net(inputs)

loss = criterion(outputs, labels)

loss.backward()

optimizer.step()

# 輸出統計

running_loss += loss.item()

if i %2000==1999: # 每2000 mini-batchs輸出一次 print('[%d, %5d] loss: %.3f'%

(epoch +1, i +1, running_loss /2000))

running_loss =0.0

print('Finished Training')

輸出:

[1, 2000] loss: 2.211

[1, 4000] loss: 1.837

[1, 6000] loss: 1.659

[1, 8000] loss: 1.570

[1, 10000] loss: 1.521

[1, 12000] loss: 1.451

[2, 2000] loss: 1.411

[2, 4000] loss: 1.393

[2, 6000] loss: 1.348

[2, 8000] loss: 1.340

[2, 10000] loss: 1.363

[2, 12000] loss: 1.320

Finished Training

在測試集上測試網絡

我們已經通過訓練數據集對網絡進行了2次訓練,但是我們需要檢查網絡是否已經學到了東西。

我們將用神經網絡的輸出作為預測的類標來檢查網絡的預測性能,用樣本的真實類標來校對。如果預測是正確的,我們將樣本添加到正確預測的列表里。

好的,第一步,讓我們從測試集中顯示一張圖像來熟悉它。

dataiter =iter(testloader)images, labels = dataiter.next()

# 打印圖片

imshow(torchvision.utils.make_grid(images))

print('GroundTruth: ', ' '.join('%5s'% classes[labels[j]] for j inrange(4)))

輸出:

GroundTruth: cat ship ship plane

現在讓我們看看神經網絡認為這些樣本應該預測成什么:

outputs = net(images)

輸出是預測與十個類的近似程度,與某一個類的近似程度越高,網絡就越認為圖像是屬于這一類別。所以讓我們打印其中最相似類別類標:

_, predicted = torch.max(outputs, 1)

print('Predicted: ', ' '.join('%5s'% classes[predicted[j]]

for j inrange(4)))

輸出:

Predicted: cat car car ship

結果看起開非常好,讓我們看看網絡在整個數據集上的表現。

correct =0total =0with 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('Accuracy of the network on the 10000 test images: %d %%'% (

100* correct / total))

輸出:

Accuracy of the network on the 10000 test images: 53 %

這看起來比隨機預測要好,隨機預測的準確率為10%(隨機預測出為10類中的哪一類)。看來網絡學到了東西。

class_correct =list(0.for i inrange(10))class_total =list(0.for i inrange(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 inrange(4):

label = labels[i]

class_correct[label] += c[i].item()

class_total[label] +=1

for i inrange(10):

print('Accuracy of %5s : %2d %%'% (

classes[i], 100* class_correct[i] / class_total[i]))

輸出:

Accuracy of plane : 52 %

Accuracy of car : 73 %

Accuracy of bird : 34 %

Accuracy of cat : 54 %

Accuracy of deer : 48 %

Accuracy of dog : 26 %

Accuracy of frog : 68 %

Accuracy of horse : 51 %

Accuracy of ship : 63 %

Accuracy of truck : 60 %

所以接下來呢?我們怎么在GPU上跑這些神經網絡?

三、 在GPU上訓練

就像你怎么把一個張量轉移到GPU上一樣,你要將神經網絡轉到GPU上。

如果CUDA可以用,讓我們首先定義下我們的設備為第一個可見的cuda設備。

device = torch.device("cuda:0"if torch.cuda.is_available() else"cpu")

# 假設在一臺CUDA機器上運行,那么這里將輸出一個CUDA設備號:

print(device)

輸出:

cuda:0

本節剩余部分都會假定設備就是臺CUDA設備。接著這些方法會遞歸地遍歷所有模塊,并將它們的參數和緩沖器轉換為CUDA張量。

net.to(device)

記住你也必須在每一個步驟向GPU發送輸入和目標:

inputs, labels = inputs.to(device), labels.to(device)

為什么沒有注意到與CPU相比巨大的加速?因為你的網絡非常小。

練習:嘗試增加你的網絡寬度(首個nn.Conv2d參數設定為2,第二個nn.Conv2d參數設定為1--它們需要有相同的個數),看看會得到怎么的速度提升。

目標:

深度理解了PyTorch的張量和神經網絡

訓練了一個小的神經網絡來分類圖像

原文發布時間為:2018-12-27

本文作者: 荔枝boy

本文來自云棲社區合作伙伴“ 磐創AI”,了解相關信息可以關注“xunixs”微信公眾號

總結

以上是生活随笔為你收集整理的python训练手势分类器_使用Pytorch训练分类器详解(附python演练)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。