如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」

2020年01月20日14:26:08 科技 1523

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Photo by Paul Skorupskas on Unsplash [Image [0]]


如何訓練你的神經網絡
這篇博客文章將帶您了解PyTorch中不同類型的CNN操作。在此博客文章中,我們將使用torch.nn實現一維和二維卷積。


什麼是CNN?

卷積神經網絡是一種神經網絡,主要用於圖像處理應用程序。 CNN的其他應用是在順序數據中,例如音頻,時間序列和NLP。 卷積是CNN的主要構建塊之一。 術語卷積是指兩個函數的數學組合以產生第三個函數。 它合併了兩組信息。

在這裡我們不會討論太多的理論。 在線上有很多很棒的資料可供選擇。

CNN操作的類型

CNN主要用於圍繞圖像,音頻,視頻,文本和時間序列建模的應用程序。 有3種類型的卷積運算。

  • 1D卷積-主要用於輸入是連續的(例如文本或音頻)的地方。
  • 2D卷積-主要用於輸入為圖像的情況。
  • 3D卷積-主要用於3D醫學成像或檢測視頻中的事件。 這超出了本博客文章的範圍。 我們將只關注前兩個。

一維輸入的一維卷積

過濾器沿單個尺寸滑動以產生輸出。 下圖來自該Stackoverflow答案。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

1D Convolution for 1D Input [Image [1]]

2D輸入的1D卷積

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

1D Convolution for 2D Input [Image [2]]

2D輸入的2D卷積

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

2D Convolution for 2D Input [Image [3]]

請查看此Stackoverflow答案,以獲取有關不同類型的CNN操作的更多信息。

幾個關鍵術語

解釋了2D卷積和2D輸入的術語。 圖片,因為我找不到1D卷積的相關可視化。

卷積運算

為了計算卷積運算後的輸出尺寸,我們可以使用以下公式。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Convolution Output Formula [Image [4]]

內核/濾波器如下圖所示在輸入信號上滑動。 您可以看到過濾器(綠色正方形)在我們的輸入(藍色正方形)上滑動,並且卷積的總和進入特徵圖(紅色正方形)。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Convolution Operation [Image [5]]

過濾器/內核

使用濾波器對輸入圖像執行卷積。 卷積的輸出稱為特徵圖。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Filter [Image [6]]

在CNN術語中,3×3矩陣稱為"過濾器"或"內核"或"特徵檢測器",通過在圖像上滑動過濾器並計算點積而形成的矩陣稱為"卷積特徵"或"激活" 地圖"或"功能地圖"。 重要的是要注意,濾鏡充當原始輸入圖像的特徵檢測器。

更多過濾器=更多功能圖=更多功能。

過濾器不過是數字矩陣。 以下是不同類型的過濾器-

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Different types of filters [Image [7]]

步幅

步幅指定在每個步驟中移動卷積過濾器多少。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Stride of 1 [Image [8]]

如果我們希望重疊減少,我們可以有更大的步幅。 由於我們跳過了潛在的位置,因此這也使得生成的特徵圖更小。 下圖演示了步幅為2。請注意,特徵圖變得更小。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Stride of 2 [Image [9]]

填充

在這裡,我們保留了來自邊界的更多信息,並保留了圖像的大小。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Padding [Image [10]]

我們看到特徵圖的大小小於輸入,因為卷積濾波器需要包含在輸入中。 如果要保持相同的尺寸,可以使用填充將輸入用零包圍。

池化

我們應用池化以減少維數。

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Max Pooling [Image [11]]

  • 合併可減小輸入的大小並使特徵尺寸更小。
  • 由於較小的空間大小,因此減少了網絡中的參數數量。 這有助於防止過度擬合。
  • 合併使網絡對於圖像中的失真具有魯棒性,因為我們採用鄰域中像素值的合計(最大值,總和,平均值等)。

導入庫

import numpy as npimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import Dataset, DataLoader


輸入數據

首先,我們定義一些輸入張量,我們將在整個博客文章中使用這些張量。

input_1d是一維浮點張量。 input_2d是一個二維浮點張量。 input_2d_img是表示圖像的3維浮點張量。

input_1d = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype = torch.float)input_2d = torch.tensor([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]], dtype = torch.float)input_2d_img = torch.tensor([[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]], dtype = torch.float)###################### OUTPUT ######################Input 1D:input_1d.shape:  torch.Size([10])input_1d:  tensor([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])====================================================================Input 2D:input_2d.shape:  torch.Size([2, 5])input_2d: tensor([[ 1.,  2.,  3.,  4.,  5.],        [ 6.,  7.,  8.,  9., 10.]])====================================================================input_2d_img:input_2d_img.shape:  torch.Size([3, 3, 10])input_2d_img: tensor([[[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]],        [[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]],        [[ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.],         [ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.]]])


一維卷積

nn.Conv1d()對輸入應用一維卷積。 nn.Conv1d()期望輸入為[batch_size,input_channels,signal_length]形狀。

您可以在PyTorch官方文檔中查看完整的參數列表。 必需的參數是—

  • in_channels(python:int)—輸入信號中的通道數。 這應該等於輸入張量中的通道數。
  • out_channels(python:int)—卷積產生的通道數。
  • kernel_size(python:int或元組)—卷積內核的大小。

Conv1d-輸入1d

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Conv1d-Input1d Example [Image [12]]


輸入是一維信號,由10個數字組成。 我們將其轉換為大小為[1,1,10]的張量。

input_1d = input_1d.unsqueeze(0).unsqueeze(0)input_1d.shape###################### OUTPUT ######################torch.Size([1, 1, 10])


CNN輸出,其中out_channels = 1,kernel_size = 3和stride = 1。

cnn1d_1 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3, stride=1)print("cnn1d_1: \n")print(cnn1d_1(input_1d).shape, "\n")print(cnn1d_1(input_1d))###################### OUTPUT ######################cnn1d_1: torch.Size([1, 1, 8]) tensor([[[-1.2353, -1.4051, -1.5749, -1.7447, -1.9145, -2.0843, -2.2541, -2.4239]]], grad_fn=<SqueezeBackward1>)


CNN輸出,其中out_channels = 1,kernel_size = 3和stride = 2。

cnn1d_2 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=3, stride=2)print("cnn1d_2: \n")print(cnn1d_2(input_1d).shape, "\n")print(cnn1d_2(input_1d))###################### OUTPUT ######################cnn1d_2: torch.Size([1, 1, 4]) tensor([[[0.5107, 0.3528, 0.1948, 0.0368]]], grad_fn=<SqueezeBackward1>)


CNN輸出,其中out_channels = 1,kernel_size = 2和stride = 1。

cnn1d_3 = nn.Conv1d(in_channels=1, out_channels=1, kernel_size=2, stride=1)print("cnn1d_3: \n")print(cnn1d_3(input_1d).shape, "\n")print(cnn1d_3(input_1d))###################### OUTPUT ######################cnn1d_3: torch.Size([1, 1, 9]) tensor([[[0.0978, 0.2221, 0.3465, 0.4708, 0.5952, 0.7196, 0.8439, 0.9683, 1.0926]]], grad_fn=<SqueezeBackward1>)


CNN輸出,其中out_channels = 5,kernel_size = 3,stride = 2。

cnn1d_4 = nn.Conv1d(in_channels=1, out_channels=5, kernel_size=3, stride=1)print("cnn1d_4: \n")print(cnn1d_4(input_1d).shape, "\n")print(cnn1d_4(input_1d))###################### OUTPUT ######################cnn1d_4: torch.Size([1, 5, 8]) tensor([[[-1.8410e+00, -2.8884e+00, -3.9358e+00, -4.9832e+00, -6.0307e+00,-7.0781e+00, -8.1255e+00, -9.1729e+00],         [-4.6073e-02, -3.4436e-02, -2.2799e-02, -1.1162e-02,  4.7439e-04,1.2111e-02,  2.3748e-02,  3.5385e-02],         [-1.5541e+00, -1.8505e+00, -2.1469e+00, -2.4433e+00, -2.7397e+00, -3.0361e+00, -3.3325e+00, -3.6289e+00],         [ 6.6593e-01,  1.2362e+00,  1.8066e+00,  2.3769e+00,  2.9472e+00, 3.5175e+00,  4.0878e+00,  4.6581e+00],         [ 2.0414e-01,  6.0421e-01,  1.0043e+00,  1.4044e+00,  1.8044e+00,2.2045e+00,  2.6046e+00,  3.0046e+00]]], grad_fn=<SqueezeBackward1>)


Conv1d-輸入2d

要將1D卷積應用於2d輸入信號,我們可以執行以下操作。 首先,我們定義大小為[1、2、5]的輸入張量,其中batch_size = 1,input_channels = 2和signal_length = 5。

input_2d = input_2d.unsqueeze(0)input_2d.shape###################### OUTPUT ######################torch.Size([1, 2, 5])


CNN輸出in_channels = 2,out_channels = 1,kernel_size = 3,stride = 1。

cnn1d_5 = nn.Conv1d(in_channels=2, out_channels=1, kernel_size=3, stride=1)print("cnn1d_5: \n")print(cnn1d_5(input_2d).shape, "\n")print(cnn1d_5(input_2d))###################### OUTPUT ######################cnn1d_5: torch.Size([1, 1, 3]) tensor([[[-6.6836, -7.6893, -8.6950]]], grad_fn=<SqueezeBackward1>)


CNN輸出in_channels = 2,out_channels = 1,kernel_size = 3,stride = 2。

cnn1d_6 = nn.Conv1d(in_channels=2, out_channels=1, kernel_size=3, stride=2)print("cnn1d_6: \n")print(cnn1d_6(input_2d).shape, "\n")print(cnn1d_6(input_2d))###################### OUTPUT ######################cnn1d_6: torch.Size([1, 1, 2]) tensor([[[-3.4744, -3.7142]]], grad_fn=<SqueezeBackward1>)


CNN輸出,其中in_channels = 2,out_channels = 1,kernel_size = 2,stride = 1。

cnn1d_7 = nn.Conv1d(in_channels=2, out_channels=1, kernel_size=2, stride=1)print("cnn1d_7: \n")print(cnn1d_7(input_2d).shape, "\n")print(cnn1d_7(input_2d))###################### OUTPUT ######################cnn1d_7: torch.Size([1, 1, 4]) tensor([[[0.5619, 0.6910, 0.8201, 0.9492]]], grad_fn=<SqueezeBackward1>)


CNN輸出,其中in_channels = 2,out_channels = 5,kernel_size = 3,stride = 1。

cnn1d_8 = nn.Conv1d(in_channels=2, out_channels=5, kernel_size=3, stride=1)print("cnn1d_8: \n")print(cnn1d_8(input_2d).shape, "\n")print(cnn1d_8(input_2d))###################### OUTPUT ######################cnn1d_8: torch.Size([1, 5, 3]) tensor([[[ 1.5024,  2.4199,  3.3373],         [ 0.2980, -0.0873, -0.4727],         [ 1.5443,  1.7086,  1.8729],         [ 2.6177,  3.2974,  3.9772],         [-2.5145, -2.2906, -2.0668]]], grad_fn=<SqueezeBackward1>)


2D卷積

nn.Conv2d()在輸入上應用2D卷積。 nn.Conv2d()希望輸入的形狀為[batch_size,input_channels,input_height,input_width]。

您可以在PyTorch官方文檔中查看完整的參數列表。 必需的參數是—

  • in_channels(python:int)— 2d輸入中的通道數,例如 圖片。
  • out_channels(python:int)—卷積產生的通道數。
  • kernel_size(python:int或元組)—卷積內核的大小

Conv2d-輸入2d

如何訓練神經網絡—CNN簡介 「Pytorch基礎知識」 - 天天要聞

Convolution with 3 channels [Image [13] credits]

要將2D卷積應用於2d輸入信號(例如圖像),我們可以執行以下操作。 首先,我們定義大小為[1、3、3、10]的輸入張量,其中batch_size = 1,input_channels = 3,input_height = 3,input_width = 10。

input_2d_img = input_2d_img.unsqueeze(0)input_2d_img.shape###################### OUTPUT ######################torch.Size([1, 3, 3, 10])


CNN輸出in_channels = 3,out_channels = 1,kernel_size = 3,stride = 1。

cnn2d_1 = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, stride=1)print("cnn2d_1: \n")print(cnn2d_1(input_2d_img).shape, "\n")print(cnn2d_1(input_2d_img))###################### OUTPUT ######################cnn2d_1: torch.Size([1, 1, 1, 8]) tensor([[[[-1.0716, -1.5742, -2.0768, -2.5793, -3.0819, -3.5844, -4.0870,-4.5896]]]], grad_fn=<MkldnnConvolutionBackward>)


CNN輸出in_channels = 3,out_channels = 1,kernel_size = 3,stride = 2。

cnn2d_2 = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=3, stride=2)print("cnn2d_2: \n")print(cnn2d_2(input_2d_img).shape, "\n")print(cnn2d_2(input_2d_img))###################### OUTPUT ######################cnn2d_2: torch.Size([1, 1, 1, 4]) tensor([[[[-0.7407, -1.2801, -1.8195, -2.3590]]]],       grad_fn=<MkldnnConvolutionBackward>)

CNN輸出,其中in_channels = 3,out_channels = 1,kernel_size = 2,stride = 1。

cnn2d_3 = nn.Conv2d(in_channels=3, out_channels=1, kernel_size=2, stride=1)print("cnn2d_3: \n")print(cnn2d_3(input_2d_img).shape, "\n")print(cnn2d_3(input_2d_img))###################### OUTPUT ######################cnn2d_3: torch.Size([1, 1, 2, 9]) tensor([[[[-0.8046, -1.5066, -2.2086, -2.9107, -3.6127, -4.3147, -5.0167, -5.7188, -6.4208],          [-0.8046, -1.5066, -2.2086, -2.9107, -3.6127, -4.3147, -5.0167,-5.7188, -6.4208]]]], grad_fn=<MkldnnConvolutionBackward>)


CNN輸出,其中in_channels = 3,out_channels = 5,kernel_size = 3,stride = 1。

cnn2d_4 = nn.Conv2d(in_channels=3, out_channels=5, kernel_size=3, stride=1)print("cnn2d_4: \n")print(cnn2d_4(input_2d_img).shape, "\n")print(cnn2d_4(input_2d_img))###################### OUTPUT ######################cnn2d_4: torch.Size([1, 5, 1, 8]) tensor([[[[-2.0868e+00, -2.7669e+00, -3.4470e+00, -4.1271e+00, -4.8072e+00, -5.4873e+00, -6.1673e+00, -6.8474e+00]],         [[-4.5052e-01, -5.5917e-01, -6.6783e-01, -7.7648e-01, -8.8514e-01, -9.9380e-01, -1.1025e+00, -1.2111e+00]],         [[ 6.6228e-01,  8.3826e-01,  1.0142e+00,  1.1902e+00,  1.3662e+00,1.5422e+00,  1.7181e+00,  1.8941e+00]],         [[-5.4425e-01, -1.2149e+00, -1.8855e+00, -2.5561e+00, -3.2267e+00, -3.8973e+00, -4.5679e+00, -5.2385e+00]],         [[ 2.0564e-01,  1.6357e-01,  1.2150e-01,  7.9434e-02,  3.7365e-02, -4.7036e-03, -4.6773e-02, -8.8842e-02]]]],       grad_fn=<MkldnnConvolutionBackward>)


感謝您的閱讀。 歡迎提出建議和建設性批評。 :) 您可以在LinkedIn上找到我。 您可以在此處查看完整的代碼。 在此處查看Github存儲庫,如果喜歡可以加註星標。


(本文翻譯自Akshaj Verma的文章《[Pytorch Basics] How to train your Neural Net — Intro to CNN》,參考:https://towardsdatascience.com/pytorch-basics-how-to-train-your-neural-net-intro-to-cnn-26a14c2ea29)

科技分類資訊推薦

雷軍微博設門檻,關注100天以上才能評論 - 天天要聞

雷軍微博設門檻,關注100天以上才能評論

深陷輿論漩渦,雷軍這是怎麼了?近日,有網友在評論雷軍微博時發現,其設置了只允許關注100天以上的粉絲進行評論。圖源網絡「過去一個多月,是我創辦小米以來最艱難的一段時間。」5月10日,雷軍發微博表露心聲。
充電樁十大品牌|中科智充上榜「2025中國充換電行業十大產品質量安全充電樁品牌」榜單 - 天天要聞

充電樁十大品牌|中科智充上榜「2025中國充換電行業十大產品質量安全充電樁品牌」榜單

近日,2025中國充換電行業十大技術實力品牌獎"正式發佈。安徽中科智充新能源科技有限公司憑藉顛覆性技術創新與全產業鏈布局優勢,以顯著技術代差榮登榜首,成為本年度唯一斬獲充電樁技術實力綜合評分全項滿分的行業標杆企業。 雙院賦能構築技術護城河作為唯一中國科學院、浙江大學雙技術賦能體系的新能源企業,中科智充依託...
前華為工程師入局小眾硬件賽道,年銷售額5億元 | Insight 全球 - 天天要聞

前華為工程師入局小眾硬件賽道,年銷售額5億元 | Insight 全球

摘要:個人用戶可能新鮮一陣,但小B端是持續造血的關鍵。 用手機拍攝一張手寫簽名,傳輸到一台手掌大的機器中。 3秒內,機器生成雕刻路徑,接着你可以在雞蛋殼上、在可樂罐上用激光刻下圖案。 海外用戶中,DIY設備一直算能穩定出貨、利潤不錯的賽道。2022年,激光雕刻機公司xTool,進入市場一年銷量就達到8億元,拿下數億元...
羅克萊以雙金屬複合堆焊技術引領行業革新 - 天天要聞

羅克萊以雙金屬複合堆焊技術引領行業革新

看似普通的管道系統,卻是能源輸送的「生命線」。從陸地油田到深海採油平台,從化工煉廠到核能制氫工程,耐腐蝕、高強度的管道承載着工業發展的澎湃動力。深耕管道行業二十餘載的蘇州羅克萊科技有限公司(以下簡稱:羅克萊),以「一輩子只干一件事」的韌勁兒,紮根管道行業,在創新實踐中,羅克萊從「一根管」闖出了一條高...
智造未來!先導智能攜全品類鋰電池整線及前沿解決方案亮相CIBF2025 - 天天要聞

智造未來!先導智能攜全品類鋰電池整線及前沿解決方案亮相CIBF2025

在全球積極推進能源轉型、加速邁向零碳未來的時代浪潮中,中國新能源產業正以破竹之勢崛起,從傳統的製造模式邁向創新驅動的智造新階段。第十七屆中國國際電池技術展覽會(CIBF 2025)即將盛大啟幕,在這場匯聚全球能源科技精英的盛會上,先導智能將攜全品類鋰電池整線及前沿解決方案驚艷亮相,以大國智造之姿,為全球能源...
佰宜康(深圳)科技有限公司正式啟航,打造全球智慧商貿生態標杆 - 天天要聞

佰宜康(深圳)科技有限公司正式啟航,打造全球智慧商貿生態標杆

‌2025年5月20日,深圳‌ —— 佰宜康(深圳)科技有限公司(以下簡稱「佰宜康」)今日宣布,公司已於2025年3月17日完成工商註冊,註冊資本5000萬元,並於5月12日全額實繳到位。作為粵港澳大灣區新興的科技驅動型商貿平台,佰宜康以「科技賦能全球商業」為核心理念,致力於通過供應鏈整合、數字化基建與國際資源聯動,構建...
中國品牌全球傳播力大會首設遊戲潮玩榜單 疊紙《戀與深空》上榜 - 天天要聞

中國品牌全球傳播力大會首設遊戲潮玩榜單 疊紙《戀與深空》上榜

5月12日,2025中國品牌全球傳播力大會在上海國際會議中心召開。為積極響應「探索文化和科技融合的有效機制,加快發展新型文化業態」政策精神,同時基於中國IP衍生「新業態」今年以來的高速發展成績,本屆大會首度設立遊戲潮玩品牌全球傳播力榜單。疊紙遊戲旗下產品《戀與深空》,因在遊戲IP領域的創新探索與全球影響力,成...
入門OpenTelemetry——部署OpenTelemetry - 天天要聞

入門OpenTelemetry——部署OpenTelemetry

OpenTelemetry 部署模式OpenTelemetry Collector 按部署方式分為 Agent 和Gateway 模式。Agent 模式在 Agent 模式下,OpenTelemetry 檢測的應用程序將數據發送到與應用程序