中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

AI應用實戰(zhan)課學(xue)習總結(jie)(10)用CNN做圖像分(fen)類

大家(jia)好,我是Edison。

最近入坑黃佳老師的《AI應(ying)用實戰課(ke)》,記錄下我的學習之(zhi)旅,也算是總結回顧。

今天是我(wo)們的(de)第10站,一起(qi)了(le)解CNN卷積神經網絡 以及 通過(guo)CNN做圖像分類任務(wu)的(de)案例。

CNN卷積神經網絡介紹

卷積(ji)神(shen)(shen)(shen)經網絡(luo)(CNN)是一種用于圖像識別和處理的(de)人工(gong)神(shen)(shen)(shen)經網絡(luo),其靈感來(lai)自(zi)于動物視覺皮層的(de)生物過程。它(ta)們由具有可學(xue)習權(quan)重和偏差的(de)神(shen)(shen)(shen)經元組(zu)成。

CNN在至少一個層中使(shi)用一種稱為(wei)卷(juan)積的技(ji)術,而不是(shi)一般的矩陣(zhen)乘法,卷(juan)積是(shi)一種特殊的線(xian)性運(yun)算。

下(xia)圖展示了一個典型的(de)CNN架構:輸入(ru)的(de)是(shi)(shi)圖像,輸出的(de)是(shi)(shi)圖像的(de)標簽(qian)。例如下(xia)圖中輸入(ru)了一張卡(ka)通人物(崔弟鳥)的(de)圖片,輸出的(de)是(shi)(shi)幾個可能(neng)得標簽(qian)及其概(gai)(gai)率,其中AI認為Tweety(動畫片 崔弟鳥的(de)名字)的(de)概(gai)(gai)率最高。

那么,從(cong)輸(shu)入到輸(shu)出之間都經歷了什么呢?

輸入層一般(ban)是(shi)圖像(xiang),這里(li)的(de)(de)圖像(xiang)通(tong)常來說圖像(xiang)的(de)(de)張量,它(ta)是(shi)神經網(wang)(wang)絡能夠讀取(qu)的(de)(de)圖片的(de)(de)結構(gou)。然(ran)后(hou),通(tong)過(guo)卷(juan)(juan)積層(Convolution)做圖像(xiang)特(te)(te)征的(de)(de)提取(qu)(一般(ban)是(shi)局部特(te)(te)征),再通(tong)過(guo)池(chi)化(hua)(hua)(Pooling)降低特(te)(te)征空間的(de)(de)維(wei)度,然(ran)后(hou)繼續多次卷(juan)(juan)積和池(chi)化(hua)(hua),提取(qu)上一層中(zhong)的(de)(de)特(te)(te)征圖的(de)(de)特(te)(te)征,隨診深(shen)度網(wang)(wang)絡的(de)(de)加深(shen),特(te)(te)征也就越(yue)(yue)來越(yue)(yue)純,會變得越(yue)(yue)來越(yue)(yue)抽象,但神經網(wang)(wang)絡可以理解。最后(hou),經歷一個(ge)(ge)展平層(Flatten Layer)進入全連接層(Fully connected Layer)做一個(ge)(ge)Softmax激(ji)活(huo)(激(ji)活(huo)函數(shu)),完成分(fen)(fen)類輸出(chu),上圖中(zhong)輸出(chu)了3個(ge)(ge)分(fen)(fen)類,所(suo)有分(fen)(fen)類的(de)(de)概(gai)率值加起(qi)來之和為0.7+0.2+0.1=1。

CIFAR-10數據集

接(jie)下來,我們要(yao)做一(yi)個(ge)基于(yu)CNN的(de)(de)圖像(xiang)分(fen)類的(de)(de)案例,那么(me),就需(xu)要(yao)一(yi)個(ge)輸(shu)入(ru)的(de)(de)圖片數據(ju)集。這(zhe)里,我們了(le)解一(yi)下CIFAR-10數據(ju)集,10代表10種常見物體(ti),大概有6萬張這(zhe)10種物體(ti)的(de)(de)圖片,這(zhe)個(ge)數據(ju)集也常用于(yu)圖像(xiang)分(fen)類問(wen)題的(de)(de)教學任(ren)務(wu)。

這些圖片全都是32*32的尺寸,類別包括:飛機、汽車、鳥、貓、鹿、狗、蛙、馬、船、卡車,每個類(lei)別(bie)都有(you)5000張(zhang)訓練圖(tu)片(pian)和1000張(zhang)測試圖(tu)片(pian)。對于我們(men)用(yong)PyTorch來(lai)(lai)做Demo來(lai)(lai)說,不需要我們(men)自己將整個(ge)數據(ju)集(ji)手動(dong)下(xia)(xia)載下(xia)(xia)來(lai)(lai)并保存到(dao)某個(ge)目(mu)錄(lu),使用(yong)PyTorch提供的(de)圖像庫函數會(hui)自動(dong)幫我們(men)下(xia)(xia)載和加載到(dao)程序中,十分(fen)方便。當(dang)程序代碼完成下(xia)(xia)載后,CIFAR-10數據(ju)集(ji)也(ye)就會(hui)保存到(dao)你當(dang)前(qian)應用(yong)程序的(de)目(mu)錄(lu)下(xia)(xia):

需要注意的是,下載下來的文件目錄中的內容并不是原始的一張張圖片,而是已經轉化為張量的適(shi)合PyTorch讀取的格式。

基于CNN做圖像分類案例

基線模型:ResNet-18

這里我(wo)們(men)使用(yong)預訓(xun)練好的ResNet-18模型(xing)作為(wei)預訓(xun)練網絡(luo)(luo)(或者說基線模型(xing)),它是一(yi)個典型(xing)的用(yong)于圖像識別的CNN神經網絡(luo)(luo)模型(xing)。它本身(shen)采用(yong)了(le)ImageNet的大量圖片(pian)做(zuo)了(le)訓(xun)練,這里我(wo)們(men)將其下(xia)載(zai)下(xia)來對我(wo)們(men)的CIFAR10數(shu)據集(ji)做(zuo)二次(ci)訓(xun)練,也可以稱為(wei)“遷移學習”。

對(dui)于深度(du)學習(xi)來(lai)說,建議在(zai)GPU上進行(xing)訓練,在(zai)CPU上訓練會很慢(man)很慢(man)。

Step1. 導入所需要的庫

# 1. 導入所需要(yao)的庫(ku)
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms

Step2. 下載CIFAR-10數據集

# 2. 下(xia)載CIFAR-10數據(ju)集(ji)
# 設置圖像預處(chu)理: 圖像增(zeng)強 + 轉換為張量 + 標(biao)準化
transform = transforms.Compose(
    [transforms.RandomHorizontalFlip(),
     transforms.RandomCrop(32, padding=4),
     transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

# 下載訓練集和(he)測試集
print("[LOG] Now loading CIFAR-10 dataset for Training...")
trainset = torchvision.datasets.CIFAR10(root='CIFAR10', train=True,
                                        download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64,
                                          shuffle=True, num_workers=2)
print("[LOG] Now loading CIFAR-10 dataset for Testing...")
testset = torchvision.datasets.CIFAR10(root='CIFAR10', train=False,
                                       download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64,
                                         shuffle=False, num_workers=2)
print("[LOG] Loading CIFAR-10 dataset finished.")

Step3. 下載(zai)預訓練(lian)的ResNet-18模型

這里torchvision的models中(zhong)已經帶了resnet-18模型,用起來十分方便(bian)。

# 3. 使用ResNet-18作為預訓練(lian)網絡
# 下載預(yu)訓練的ResNet-18模型(xing)
print("[LOG] Now loading model RestNet-18...")
resnet18 = torchvision.models.resnet18(pretrained=True)
print("[LOG] Loading model ResNet-18 finished.")
# 由(you)于(yu)CIFAR-10有10個類(lei),我們需要調(diao)整ResNet的最后(hou)一個全連接層
num_classes = 10
resnet18.fc = nn.Linear(resnet18.fc.in_features, num_classes)

需要注意(yi)的是:由于CIFAR-10有(you)10個(ge)類別,因此(ci)需要調整(zheng)一下基線模型的最后一個(ge)全連接(jie)層,將其num_classes改(gai)為10。

Step4. 微調預訓練CNN網(wang)絡

這(zhe)里(li)開(kai)始定(ding)義損失函數和(he)優化器,然后一輪又一輪地訓練(lian)這(zhe)個網絡,并打印(yin)出損失。

# 4. 微調預(yu)訓練的CNN網絡
# 定義損失函數(shu)和優化(hua)器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(resnet18.parameters(), lr=0.001, momentum=0.9)
# 遷移到(dao)GPU上(如果有的話)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
print("[LOG] Current running device: ", device)
resnet18.to(device)
# 訓練網絡
print("[LOG] Start training...")
for epoch in range(10):  # 就演示訓練(lian)10個epochs
    running_loss = 0.0
    for i, data in enumerate(trainloader, 0):
        # 獲取輸(shu)入數據(ju)
        inputs, labels = data[0].to(device), data[1].to(device)
        # 清零參數梯度
        optimizer.zero_grad()
        # 前向(xiang) + 反向(xiang) + 優化(hua)
        outputs = resnet18(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if i % 200 == 199:  # 每200批次(ci)打印一次(ci)
            print('[%d, %5d] loss: %.3f' %
                  (epoch + 1, i + 1, running_loss / 200))
            running_loss = 0.0
print('[LOG] Training finished')

Step5. 測試(shi)訓練(lian)結(jie)果(網絡性能)

最后(hou),在測(ce)試集中進行測(ce)試,并打印出該網絡的(de)準確度。

# 5. 測試網絡(luo)性能
correct = 0
total = 0
with torch.no_grad():
    for data in testloader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = resnet18(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()
print('[LOG] Accuracy of the network on the 10000 test images: %d %%' % (
    100 * correct / total))

剛好我這里有一個GPU Runner跑了幾分鐘就出來了結果:

可(ke)以看到,我們借助ResNet-18在幾分鐘時(shi)間內就(jiu)訓練好了(le)一個(ge)接近80%準(zhun)確(que)度的(de)用于(yu)CIFAR-10數據集的(de)模型,成(cheng)本(ben)是真的(de)很低,上手也是很快的(de)。

當然,你也(ye)可以選擇自己寫一(yi)個(ge)CNN網(wang)絡來做這(zhe)個(ge)處理(li),但開發成本會高一(yi)些,而(er)且效(xiao)果也(ye)不一(yi)定有直接(jie)基于這(zhe)些已有CNN網(wang)絡模型做遷移的效(xiao)果好(hao)。

小結

本(ben)文(wen)介紹(shao)了CNN的基(ji)(ji)本(ben)概念 以及 如(ru)何基(ji)(ji)于預(yu)訓練的CNN模(mo)(mo)型(xing)對于CIFAR-10數據(ju)集(ji)做(zuo)圖像分類的案例。基(ji)(ji)于預(yu)訓練好的CNN模(mo)(mo)型(xing)作(zuo)為基(ji)(ji)線模(mo)(mo)型(xing),針對你自(zi)己的圖片(pian)數據(ju)集(ji)做(zuo)二次訓練(遷移學(xue)習),通常可以兼顧成本(ben)和(he)性能,是值得采用(yong)的實踐方(fang)式。

推薦學習

黃佳(jia),《AI應用實戰課》(課程)

黃佳,《圖解GPT:大模(mo)型是如何(he)構(gou)建的(de)》(圖書)

黃佳,《動手做AI Agent》(圖書)

 

posted @ 2025-02-24 18:30  EdisonZhou  閱讀(229)  評論(0)    收藏  舉報