国产无码免费,人妻口爆,国产V在线,99中文精品7,国产成人无码AA精品一,制度丝袜诱惑av,久久99免费麻辣视频,蜜臀久久99精品久久久久久酒店
        訂閱
        糾錯
        加入自媒體

        在PyTorch中使用卷積神經網絡建立圖像分類模型

        2019-10-30 16:33
        磐創AI
        關注

        概述

        在PyTorch中構建自己的卷積神經網絡(CNN)的實踐教程

        我們將研究一個圖像分類問題——CNN的一個經典和廣泛使用的應用

        我們將以實用的格式介紹深度學習概念

        介紹

        我被神經網絡的力量和能力所吸引。在機器學習和深度學習領域,幾乎每一次突破都以神經網絡模型為核心。

        這在計算機視覺領域尤為普遍。無論是簡單的圖像分類還是更高級的東西(如對象檢測),神經網絡開辟了處理圖像數據的可能性。簡而言之,對于像我這樣的數據科學家來說,這是一座金礦!

        當我們使用深度學習來解決一個圖像分類問題時,簡單的神經網絡總是一個好的起點。但是,它們確實有局限性,而且模型的性能在達到一定程度后無法得到改善。

        這就是卷積神經網絡(CNNs)改變了競爭環境的地方。它們在計算機視覺應用中無處不在。老實說,我覺得每一個計算機視覺愛好者都應該可以很快學會這個概念。

        我將向你介紹使用流行的PyTorch框架進行深度學習的新概念。在本文中,我們將了解卷積神經網絡是如何工作的,以及它如何幫助我們改進模型的性能。我們還將研究在PyTorch中CNNs的實現。

        目錄

        1.簡要介紹PyTorch、張量和NumPy

        2.為什么選擇卷積神經網絡(CNNs)?

        3.識別服裝問題

        4.使用PyTorch實現CNNs

        一、簡要介紹PyTorch、張量和NumPy

        讓我們快速回顧一下第一篇文章中涉及的內容。我們討論了PyTorch和張量的基礎知識,還討論了PyTorch與NumPy的相似之處。

        PyTorch是一個基于python的庫,提供了以下功能:

        用于創建可序列化和可優化模型的TorchScript

        以分布式訓練進行并行化計算

        動態計算圖,等等

        PyTorch中的張量類似于NumPy的n維數組,也可以與gpu一起使用。在這些張量上執行操作幾乎與在NumPy數組上執行操作類似。這使得PyTorch非常易于使用和學習。

        在本系列的第1部分中,我們構建了一個簡單的神經網絡來解決一個案例研究。使用我們的簡單模型,我們在測試集中獲得了大約65%的基準準確度,F在,我們將嘗試使用卷積神經網絡來提高這個準確度。

        二、為什么選擇卷積神經網絡(CNNs)?

        在我們進入實現部分之前,讓我們快速地看看為什么我們首先需要CNNs,以及它們是如何工作的。

        我們可以將卷積神經網絡(CNNs)看作是幫助從圖像中提取特征的特征提取器。

        在一個簡單的神經網絡中,我們把一個三維圖像轉換成一維圖像,對吧?讓我們看一個例子來理解這一點:

        你能認出上面的圖像嗎?這似乎說不通,F在,讓我們看看下面的圖片:

        我們現在可以很容易地說,這是一只狗。如果我告訴你這兩個圖像是一樣的呢?相信我,他們是一樣的!唯一的區別是第一個圖像是一維的,而第二個圖像是相同圖像的二維表示。

        空間定位

        人工神經網絡也會丟失圖像的空間方向。讓我們再舉個例子來理解一下:

        你能分辨出這兩幅圖像的區別嗎?至少我不能。由于這是一個一維的表示,因此很難確定它們之間的區別,F在,讓我們看看這些圖像的二維表示:

        在這里,圖像某些定位已經改變,但我們無法通過查看一維表示來識別它。

        這就是人工神經網絡的問題——它們失去了空間定位。

        大量參數

        神經網絡的另一個問題是參數太多。假設我們的圖像大小是28*28*3 -所以這里的參數是2352。如果我們有一個大小為224*224*3的圖像呢?這里的參數數量為150,528。

        這些參數只會隨著隱藏層的增加而增加。因此,使用人工神經網絡的兩個主要缺點是:

        1.丟失圖像的空間方向

        2.參數的數量急劇增加

        那么我們如何處理這個問題呢?如何在保持空間方向的同時減少可學習參數?

        這就是卷積神經網絡真正有用的地方。CNNs有助于從圖像中提取特征,這可能有助于對圖像中的目標進行分類。它首先從圖像中提取低維特征(如邊緣),然后提取一些高維特征(如形狀)。

        我們使用濾波器從圖像中提取特征,并使用池技術來減少可學習參數的數量。

        在本文中,我們不會深入討論這些主題的細節。如果你希望了解濾波器如何幫助提取特征和池的工作方式,我強烈建議你從頭開始學習卷積神經網絡的全面教程。

        三、理解問題陳述:識別服裝

        理論部分已經鋪墊完了,開始寫代碼吧。我們將討論與第一篇文章相同的問題陳述。這是因為我們可以直接將我們的CNN模型的性能與我們在那里建立的簡單神經網絡進行比較。

        你可以從這里下載“識別”Apparels問題的數據集。

        https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch

        讓我快速總結一下問題陳述。我們的任務是通過觀察各種服裝形象來識別服裝的類型。我們總共有10個類可以對服裝的圖像進行分類:

        Label

        Description

        0

        T-shirt/top

        1

        Trouser

        2

        Pullover

        3

        Dress

        4

        Coat

        5

        Sandal

        6

        Shirt

        7

        Sneaker

        8

        Bag

        9

        Ankle boot

        數據集共包含70,000張圖像。其中60000張屬于訓練集,其余10000張屬于測試集。所有的圖像都是大。28*28)的灰度圖像。數據集包含兩個文件夾,—一個用于訓練集,另一個用于測試集。每個文件夾中都有一個.csv文件,該文件具有圖像的id和相應的標簽;

        準備好開始了嗎?我們將首先導入所需的庫:

        # 導入庫
        import pandas as pd
        import numpy as np
        # 讀取與展示圖片
        from skimage.io import imread
        import matplotlib.pyplot as plt
        %matplotlib inline
        # 創建驗證集
        from sklearn.model_selection import train_test_split
        # 評估模型
        from sklearn.metrics import accuracy_score
        from tqdm import tqdm
        # Pytorch的相關庫
        import torch
        from torch.autograd import Variable
        from torch.nn import Linear, ReLU, CrossEntropyLoss, Sequential, Conv2d, MaxPool2d, Module, Softmax, BatchNorm2d, Dropout
        from torch.optim import Adam, SGD

        加載數據集

        現在,讓我們加載數據集,包括訓練,測試樣本:

        # 加載數據集
        train = pd.read_csv('train_LbELtWX/train.csv')
        test = pd.read_csv('test_ScVgIM0/test.csv')
        sample_submission = pd.read_csv('sample_submission_I5njJSF.csv')
        train.head()

        該訓練文件包含每個圖像的id及其對應的標簽

        另一方面,測試文件只有id,我們必須預測它們對應的標簽

        樣例提交文件將告訴我們預測的格式

        我們將一個接一個地讀取所有圖像,并將它們堆疊成一個數組。我們還將圖像的像素值除以255,使圖像的像素值在[0,1]范圍內。這一步有助于優化模型的性能。

        讓我們來加載圖像:

        # 加載訓練圖像
        train_img = []
        for img_name in tqdm(train['id']):
           # 定義圖像路徑
           image_path = 'train_LbELtWX/train/' + str(img_name) + '.png'
           # 讀取圖片
           img = imread(image_path, as_gray=True)
           # 歸一化像素值
           img /= 255.0
           # 轉換為浮點數
           img = img.astype('float32')
           # 添加到列表
           train_img.append(img)
        # 轉換為numpy數組
        train_x = np.array(train_img)
        # 定義目標
        train_y = train['label'].values
        train_x.shape

        如你所見,我們在訓練集中有60,000張大小(28,28)的圖像。由于圖像是灰度格式的,我們只有一個單一通道,因此形狀為(28,28)。

        現在讓我們研究數據和可視化一些圖像:

        # 可視化圖片
        i = 0
        plt.figure(figsize=(10,10))
        plt.subplot(221), plt.imshow(train_x[i], cmap='gray')
        plt.subplot(222), plt.imshow(train_x[i+25], cmap='gray')
        plt.subplot(223), plt.imshow(train_x[i+50], cmap='gray')
        plt.subplot(224), plt.imshow(train_x[i+75], cmap='gray')

        以下是來自數據集的一些示例。我鼓勵你去探索更多,想象其他的圖像。接下來,我們將把圖像分成訓練集和驗證集。

        創建驗證集并對圖像進行預處理

        # 創建驗證集
        train_x, val_x, train_y, val_y = train_test_split(train_x, train_y, test_size = 0.1)
        (train_x.shape, train_y.shape), (val_x.shape, val_y.shape)

        我們在驗證集中保留了10%的數據,在訓練集中保留了10%的數據。接下來將圖片和目標轉換成torch格式:

        # 轉換為torch張量
        train_x = train_x.reshape(54000, 1, 28, 28)
        train_x  = torch.from_numpy(train_x)
        # 轉換為torch張量
        train_y = train_y.astype(int);
        train_y = torch.from_numpy(train_y)
        # 訓練集形狀
        train_x.shape, train_y.shape

        同樣,我們將轉換驗證圖像:

        # 轉換為torch張量
        val_x = val_x.reshape(6000, 1, 28, 28)
        val_x  = torch.from_numpy(val_x)
        # 轉換為torch張量
        val_y = val_y.astype(int);
        val_y = torch.from_numpy(val_y)
        # 驗證集形狀
        val_x.shape, val_y.shape

        我們的數據現在已經準備好了。最后,是時候創建我們的CNN模型了!

        四、使用PyTorch實現CNNs

        我們將使用一個非常簡單的CNN架構,只有兩個卷積層來提取圖像的特征。然后,我們將使用一個完全連接的Dense層將這些特征分類到各自的類別中。

        讓我們定義一下架構:

        class Net(Module):  
           def __init__(self):
               super(Net, self).__init__()
               self.cnn_layers = Sequential(
                   # 定義2D卷積層
                   Conv2d(1, 4, kernel_size=3, stride=1, padding=1),
                   BatchNorm2d(4),
                   ReLU(inplace=True),
                   MaxPool2d(kernel_size=2, stride=2),
                   # 定義另一個2D卷積層
                   Conv2d(4, 4, kernel_size=3, stride=1, padding=1),
                   BatchNorm2d(4),
                   ReLU(inplace=True),
                   MaxPool2d(kernel_size=2, stride=2),
               )
               self.linear_layers = Sequential(
                   Linear(4 * 7 * 7, 10)
               )
           # 前項傳播
           def forward(self, x):
               x = self.cnn_layers(x)
               x = x.view(x.size(0), -1)
               x = self.linear_layers(x)
               return x

        現在我們調用這個模型,定義優化器和模型的損失函數:

        # 定義模型
        model = Net()
        # 定義優化器
        optimizer = Adam(model.parameters(), lr=0.07)
        # 定義loss函數
        criterion = CrossEntropyLoss()
        # 檢查GPU是否可用
        if torch.cuda.is_available():
           model = model.cuda()
           criterion = criterion.cuda()
        print(model)

        這是模型的架構。我們有兩個卷積層和一個線性層。接下來,我們將定義一個函數來訓練模型:

        def train(epoch):
           model.train()
           tr_loss = 0
           # 獲取訓練集
           x_train, y_train = Variable(train_x), Variable(train_y)
           # 獲取驗證集
           x_val, y_val = Variable(val_x), Variable(val_y)
           # 轉換為GPU格式
           if torch.cuda.is_available():
               x_train = x_train.cuda()
               y_train = y_train.cuda()
               x_val = x_val.cuda()
               y_val = y_val.cuda()
           # 清除梯度
           optimizer.zero_grad()
           # 預測訓練與驗證集
           output_train = model(x_train)
           output_val = model(x_val)
           # 計算訓練集與驗證集損失
           loss_train = criterion(output_train, y_train)
           loss_val = criterion(output_val, y_val)
           train_losses.append(loss_train)
           val_losses.append(loss_val)
           # 更新權重
           loss_train.backward()
           optimizer.step()
           tr_loss = loss_train.item()
           if epoch%2 == 0:
               # 輸出驗證集loss
               print('Epoch : ',epoch+1, ' ', 'loss :', loss_val)

        最后,我們將對模型進行25個epoch的訓練,并存儲訓練和驗證損失:

        # 定義輪數
        n_epochs = 25
        # 空列表存儲訓練集損失
        train_losses = []
        # 空列表存儲驗證集損失
        val_losses = []
        # 訓練模型
        for epoch in range(n_epochs):
           train(epoch)

        可以看出,隨著epoch的增加,驗證損失逐漸減小。讓我們通過繪圖來可視化訓練和驗證的損失:

        # 畫出loss曲線
        plt.plot(train_losses, label='Training loss')
        plt.plot(val_losses, label='Validation loss')
        plt.legend()
        plt.show()

        啊,我喜歡想象的力量。我們可以清楚地看到,訓練和驗證損失是同步的。這是一個好跡象,因為模型在驗證集上進行了很好的泛化。

        讓我們在訓練和驗證集上檢查模型的準確性:

        # 訓練集預測
        with torch.no_grad():
           output = model(train_x.cuda())
        softmax = torch.exp(output).cpu()
        prob = list(softmax.numpy())
        predictions = np.argmax(prob, axis=1)
        # 訓練集精度
        accuracy_score(train_y, predictions)

        訓練集的準確率約為72%,相當不錯。讓我們檢查驗證集的準確性:

        # 驗證集預測
        with torch.no_grad():
           output = model(val_x.cuda())
        softmax = torch.exp(output).cpu()
        prob = list(softmax.numpy())
        predictions = np.argmax(prob, axis=1)
        # 驗證集精度
        accuracy_score(val_y, predictions)

        正如我們看到的損失,準確度也是同步的-我們在驗證集得到了72%的準確度。

        為測試集生成預測

        最后是時候為測試集生成預測了。我們將加載測試集中的所有圖像,執行與訓練集相同的預處理步驟,最后生成預測。

        所以,讓我們開始加載測試圖像:

        # 載入測試圖
        test_img = []
        for img_name in tqdm(test['id']):
           # 定義圖片路徑
           image_path = 'test_ScVgIM0/test/' + str(img_name) + '.png'
           # 讀取圖片
           img = imread(image_path, as_gray=True)
           # 歸一化像素
           img /= 255.0
           # 轉換為浮點數
           img = img.astype('float32')
           # 添加到列表
           test_img.append(img)
        # 轉換為numpy數組
        test_x = np.array(test_img)
        test_x.shape

        現在,我們將對這些圖像進行預處理步驟,類似于我們之前對訓練圖像所做的:

        # 轉換為torch格式
        test_x = test_x.reshape(10000, 1, 28, 28)
        test_x  = torch.from_numpy(test_x)
        test_x.shape

        最后,我們將生成對測試集的預測:

        # 生成測試集預測
        with torch.no_grad():
           output = model(test_x.cuda())
        softmax = torch.exp(output).cpu()
        prob = list(softmax.numpy())
        predictions = np.argmax(prob, axis=1)

        用預測替換樣本提交文件中的標簽,最后保存文件并提交到排行榜:

        # 用預測替換
        sample_submission['label'] = predictions
        sample_submission.head()

        # 保存文件
        sample_submission.to_csv('submission.csv', index=False)

        你將在當前目錄中看到一個名為submission.csv的文件。你只需要把它上傳到問題頁面的解決方案檢查器上,它就會生成分數。鏈接:https://datahack.analyticsvidhya.com/contest/practice-problem-identify-the-apparels/?utm_source=blog&utm_medium=building-image-classification-models-cnn-pytorch

        我們的CNN模型在測試集上給出了大約71%的準確率,這與我們在上一篇文章中使用簡單的神經網絡得到的65%的準確率相比是一個很大的進步。

        結尾

        在這篇文章中,我們研究了CNNs是如何從圖像中提取特征的。他們幫助我們將之前的神經網絡模型的準確率從65%提高到71%,這是一個重大的進步。

        你可以嘗試使用CNN模型的超參數,并嘗試進一步提高準確性。要調優的超參數可以是卷積層的數量、每個卷積層的濾波器數量、epoch的數量、全連接層的數量、每個全連接層的隱藏單元的數量等。

        聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯系舉報。

        發表評論

        0條評論,0人參與

        請輸入評論內容...

        請輸入評論/評論長度6~500個字

        您提交的評論過于頻繁,請輸入驗證碼繼續

        暫無評論

        暫無評論

          人工智能 獵頭職位 更多
          掃碼關注公眾號
          OFweek人工智能網
          獲取更多精彩內容
          文章糾錯
          x
          *文字標題:
          *糾錯內容:
          聯系郵箱:
          *驗 證 碼:

          粵公網安備 44030502002758號

          主站蜘蛛池模板: 欧美人妖性爱| 88XV日韩| 开江县| 久久久婷| 克东县| 三级片久久| 楚雄市| 日本a网| 亚洲AV日韩AV永久无码网站| 91视频精选| 大同县| 人妻无码中出| 久久66| 青青操影院| av狼友| AV免费网站| 亚洲xxxxxx| 全州县| 性交大片| 国产V^在线| 通州区| A片地址| 国产人妖网站| 国模精品视频一区二区| 91碰碰| 晋州市| 婷婷色小说| 亚洲精品影院| 江永县| 日韩OL丝袜无码AV啪啪| 熟女中文字幕精品| 日屄屄| 国产性在线| 久久久性爱| 美腿丝袜中文字幕精品| 内射视频在线观看| 亚洲国内自拍| 清徐县| 亚洲成人电影院| 草肥熟老熟妇600部| 亚洲色图综合|