欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python Pytorch深度學習之圖像分類器

 更新時間:2021年10月28日 10:36:15   作者:柚子味的羊  
今天小編就為大家分享一篇關(guān)于Pytorch圖像分類器的文章,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

一、簡介

通常,當處理圖像、文本、語音或視頻數(shù)據(jù)時,可以使用標準Python將數(shù)據(jù)加載到numpy數(shù)組格式,然后將這個數(shù)組轉(zhuǎn)換成torch.*Tensor

  • 對于圖像,可以用Pillow,OpenCV
  • 對于語音,可以用scipy,librosa
  • 對于文本,可以直接用Python或Cython基礎(chǔ)數(shù)據(jù)加載模塊,或者用NLTK和SpaCy

特別是對于視覺,Pytorch已經(jīng)創(chuàng)建了一個叫torchvision的package,該報包含了支持加載類似Imagenet,CIFAR10,MNIST等公共數(shù)據(jù)集的數(shù)據(jù)加載??靦orchvision.datasets和支持加載圖像數(shù)據(jù)數(shù)據(jù)轉(zhuǎn)換模塊torch.utils.data.DataLoader。這提供了極大地便利,并避免了編寫“樣板代碼”

二、數(shù)據(jù)集

對于本小節(jié),使用CIFAR10數(shù)據(jù)集,它包含了是個類別:airplane,automobile,bird,cat,deer,dog,frog,horse,ship,truck。CIFAR10中的圖像尺寸是33232,也就是RGB的3層顏色通道,每層通道內(nèi)的尺寸為32*32

三、訓練一個圖像分類器

訓練圖像分類器的步驟

  • 使用torchvision加載并且歸一化CIFAR10的訓練和測試數(shù)據(jù)集
  • 定義一個卷積神經(jīng)網(wǎng)絡(luò)
  • 定義一個損失函數(shù)
  • 在訓練樣本數(shù)據(jù)上訓練網(wǎng)絡(luò)
  • 在測試樣本數(shù)據(jù)上測試網(wǎng)絡(luò)

1、導入package吧

# 使用torchvision,加載并歸一化CIFAR10
import torch
import torchvision
import torchvision.transforms as transforms

2、歸一化處理+貼標簽吧

# torchvision數(shù)據(jù)集的輸出是范圍在[0,1]之間的PILImage,將他們轉(zhuǎn)換成歸一化范圍為[-1,1]之間的張量Tensor
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=False,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=False,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")

3、先來康康訓練集中的照片吧

# 展示其中的訓練照片
import matplotlib.pyplot as plt
import numpy as np
# 定義圖片顯示的function
def imshow(img):
    img=img/2+0.5
    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))
#打印標簽labels
print(' '.join("%5s"%classes[labels[j]] for j in range(4)))

運行結(jié)果

在這里插入圖片描述

在這里插入圖片描述

注:初學的猿仔們?nèi)绻鸖pyder不顯示圖片,自己設(shè)置一下就OK,在Tools——>Preferences中設(shè)置如下:

在這里插入圖片描述

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

此處,復(fù)制前一節(jié)的神經(jīng)網(wǎng)絡(luò)(在這里),并修改為3通道的圖片(之前定義的是1通道)

#%%
# 定義卷積神經(jīng)網(wǎng)絡(luò)
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        # 1個輸入,6個輸出,5*5的卷積
        # 內(nèi)核
        self.conv1=nn.Conv2d(3,6,5)#定義三個通道
        self.pool=nn.MaxPool2d(2,2)
        self.conv2=nn.Conv2d(6,16,5)
        # 映射函數(shù):線性——y=Wx+b
        self.fc1=nn.Linear(16*5*5,120)#輸入特征值:16*5*5,輸出特征值:120
        self.fc2=nn.Linear(120,84)
        self.fc3=nn.Linear(84,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,16*5*5)
        x=F.relu(self.fc1(x))
        x=F.relu(self.fc2(x))
        x=self.fc3(x)
        return x
net=Net()

Tips:在Spyder中可用使用“#%%”得到cell塊,之后對每個cell進行運行,快捷鍵(Ctrl+Enter)——>我太愛用快捷鍵了,無論是什么能用鍵盤堅決不用鼠標(是真的懶吧?。。。?/p>

5、定義一個損失函數(shù)和優(yōu)化器吧

使用分類交叉熵Cross-Entropy做損失函數(shù),動量SGD做優(yōu)化器

#%%
# 定義一個損失函數(shù)和優(yōu)化器
import torch.optim as optim
criterion=nn.CrossEntropyLoss()
optimizer=optim.SGD(net.parameters(), lr=0.001,momentum=0.9)

6、訓練網(wǎng)絡(luò)吧

此處只需要在數(shù)據(jù)迭代器上循環(huán)輸入網(wǎng)絡(luò)和優(yōu)化器

#%%訓練網(wǎng)絡(luò)
for epoch in range(2):
    running_loss=0.0
    for i,data in enumerate(trainloader,0):
        #得到輸入
        inputs,labels=data
        # 將參數(shù)的梯度值置零
        optimizer.zero_grad()
        #反向傳播+優(yōu)化
        outputs=net(inputs)
        loss=criterion(outputs,labels)
        loss.backward()
        optimizer.step()
        #打印數(shù)據(jù)
        running_loss+=loss.item()
        if i% 2000==1999:
            print('[%d,%5d] loss: %.3f'%(epoch+1,i+1,running_loss/2000))#每2000個輸出一次
print('Finished Training')

運行結(jié)果

在這里插入圖片描述

7、在測試集上測試一下網(wǎng)絡(luò)吧

已經(jīng)通過訓練數(shù)據(jù)集對網(wǎng)絡(luò)進行了兩次訓練,但是我們需要檢查是否已經(jīng)學到了東西。將使用神經(jīng)網(wǎng)絡(luò)的輸出作為預(yù)測的類標來檢查網(wǎng)絡(luò)的預(yù)測性能,用樣本的真實類標校對,如過預(yù)測正確,將樣本添加到正確預(yù)測的列表中

#%%
#在測試集上顯示
outputs=net(images)
# 輸出是預(yù)測與十個類的相似程度,與某一個類的近似程度越高,網(wǎng)絡(luò)就越認為圖像是屬于這一類別
# 打印其中最相似類別類標
_, predictd=torch.max(outputs,1)
print('Predicted:',' '.join('%5s'% classes[predictd[j]]
                            for j in range(4)))

運行結(jié)果

在這里插入圖片描述

把網(wǎng)絡(luò)放在整個數(shù)據(jù)集上看看具體表現(xiàn)

#%% 結(jié)果看起來還好55%,看看網(wǎng)絡(luò)在整個數(shù)據(jù)集的表現(xiàn)
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('Accuracy of the network on the 10000 test images:%d %%' % (
    100*correct/total))

運行結(jié)果

在這里插入圖片描述

8、分別查看一下訓練效果吧

#%%分類查看
class_correct=list(0. for i in range(10))
class_total=list(0. for i in range(10))
with torch.no_grad():
    for data in testloader:
        images,labels=data
        outputs=net(images)
        _, predictd=torch.max(outputs,1)
        c=(predictd==labels).squeeze()
        for i in range(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]))

運行結(jié)果

在這里插入圖片描述

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • Python中Tkinter的面向?qū)ο缶幊虇栴}與解決方案

    Python中Tkinter的面向?qū)ο缶幊虇栴}與解決方案

    在Python的GUI開發(fā)中,Tkinter是一個廣泛使用的標準庫,結(jié)合面向?qū)ο缶幊痰乃枷?可以使Tkinter的代碼更加模塊化和易于維護,然而,在實際應(yīng)用中,OOP與Tkinter的結(jié)合也會帶來一些常見的問題,本文將通過具體的代碼案例,分析這些問題,并提供相應(yīng)的解決方案
    2024-12-12
  • python爬取梨視頻生活板塊最熱視頻

    python爬取梨視頻生活板塊最熱視頻

    這篇文章主要介紹了python爬取梨視頻生活板塊最熱視頻,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳解Python中的文件操作

    詳解Python中的文件操作

    在日常生活中,文件操作主要包括打開、關(guān)閉、讀、寫等操作,這篇文章主要為大家詳細介紹了Python中這些文件操作的實現(xiàn),需要的可以了解下
    2023-07-07
  • 分享10個有趣的Python程序

    分享10個有趣的Python程序

    這篇文章主要給大家分享的是10個有趣的Python程序,Python程序有許多模塊和第三方包,這非常有助于高效編程,所以了解這些模塊的正確使用方法是很重要的,下面詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-02-02
  • Python實現(xiàn)名片管理系統(tǒng)

    Python實現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Python實現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • 如何用Django處理gzip數(shù)據(jù)流

    如何用Django處理gzip數(shù)據(jù)流

    這篇文章主要介紹了如何用Django處理gzip數(shù)據(jù)流,幫助大家更好的理解和使用django框架,感興趣的朋友可以了解下
    2021-01-01
  • python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動

    python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動

    這篇文章主要為大家介紹了python使用IP歸屬地查詢API追蹤網(wǎng)絡(luò)活動實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 使用Python編寫一個自動化圖片格式轉(zhuǎn)換工具

    使用Python編寫一個自動化圖片格式轉(zhuǎn)換工具

    這篇文章主要為大家詳細介紹了如何使用Python編寫一個自動化圖片格式轉(zhuǎn)換工具,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-07-07
  • vue.js刷新當前頁面的實例講解

    vue.js刷新當前頁面的實例講解

    在本篇文章里小編給各位分享了一篇關(guān)于vue.js刷新當前頁面的實例講解,有興趣的朋友們可以學習參考下。
    2020-12-12
  • 使用jupyter?notebook保存python代碼為.py格式問題

    使用jupyter?notebook保存python代碼為.py格式問題

    這篇文章主要介紹了使用jupyter?notebook保存python代碼為.py格式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07

最新評論