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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PyTorch中的nn.Conv1d与nn.Conv2d

發(fā)布時間:2024/2/28 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PyTorch中的nn.Conv1d与nn.Conv2d 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文主要介紹PyTorch中的nn.Conv1d和nn.Conv2d方法,并給出相應(yīng)代碼示例,加深理解。

一維卷積nn.Conv1d

一般來說,一維卷積nn.Conv1d用于文本數(shù)據(jù),只對寬度進行卷積,對高度不卷積。通常,輸入大小為word_embedding_dim * max_length,其中,word_embedding_dim為詞向量的維度,max_length為句子的最大長度。卷積核窗口在句子長度的方向上滑動,進行卷積操作。

定義

class torch.nn.Conv1d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

主要參數(shù)說明:

  • in_channels:在文本應(yīng)用中,即為詞向量的維度
  • out_channels:卷積產(chǎn)生的通道數(shù),有多少個out_channels,就需要多少個一維卷積(也就是卷積核的數(shù)量)
  • kernel_size:卷積核的尺寸;卷積核的第二個維度由in_channels決定,所以實際上卷積核的大小為kernel_size * in_channels
  • padding:對輸入的每一條邊,補充0的層數(shù)

代碼示例

輸入:批大小為32,句子的最大長度為35,詞向量維度為256
目標(biāo):句子分類,共2類

conv1 = nn.Conv1d(in_channels=256, out_channels=100, kernel_size=2) input = torch.randn(32, 35, 256) input = input.permute(0, 2, 1) output = conv1(input)

假設(shè)window_size = [3, 4, 5, 6],即共有四個卷積核,基于上述代碼,具體計算過程如下:

  • 原始輸入大小為(32, 35, 256),經(jīng)過permute(0, 2, 1)操作后,輸入的大小變?yōu)?32, 256, 35);
  • 使用1個卷積核進行卷積,可得到1個大小為32 x 100 x 1的輸出,共4個卷積核,故共有4個大小為32 x 100 x 1的輸出;
  • 將上一步得到的4個結(jié)果在dim = 1上進行拼接,輸出大小為32 x 400 x 1;
  • view操作后,輸出大小變?yōu)?2 x 400;
  • 全連接,最終輸出大小為32 x 2,即分別預(yù)測為2類的概率大小。
  • 一維卷積過程圖解

    Yoon Kim在2014年發(fā)表的論文Convolutional Neural Networks for Sentence Classification中,給出了一個非常形象的圖,詮釋了文本卷積模型的框架,如下所示。

    nn.Conv1d詳細圖解(使用多個卷積核)

    二維卷積nn.Conv2d

    一般來說,二維卷積nn.Conv2d用于圖像數(shù)據(jù),對寬度和高度都進行卷積。

    定義

    class torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True)

    代碼示例

    假設(shè)現(xiàn)有大小為32 x 32的圖片樣本,輸入樣本的channels為1,該圖片可能屬于10個類中的某一類。CNN框架定義如下:

    class CNN(nn.Module):def __init__(self):nn.Model.__init__(self)self.conv1 = nn.Conv2d(1, 6, 5) # 輸入通道數(shù)為1,輸出通道數(shù)為6self.conv2 = nn.Conv2d(6, 16, 5) # 輸入通道數(shù)為6,輸出通道數(shù)為16self.fc1 = nn.Linear(5 * 5 * 16, 120)self.fc2 = nn.Linear(120, 84)self.fc3 = nn.Linear(84, 10)def forward(self, x):# 輸入x -> conv1 -> relu -> 2x2窗口的最大池化x = self.conv1(x)x = F.relu(x)x = F.max_pool2d(x, 2)# 輸入x -> conv2 -> relu -> 2x2窗口的最大池化x = self.conv2(x)x = F.relu(x)x = F.max_pool2d(x, 2)# view函數(shù)將張量x變形成一維向量形式,總特征數(shù)不變,為全連接層做準(zhǔn)備x = x.view(x.size()[0], -1)x = F.relu(self.fc1(x))x = F.relu(self.fc2(x))x = self.fc3(x)return x

    網(wǎng)絡(luò)整體結(jié)構(gòu):[conv + relu + pooling] * 2 + FC * 3
    原始輸入樣本的大小:32 x 32 x 1

  • 第一次卷積:使用6個大小為5 x 5的卷積核,故卷積核的規(guī)模為(5 x 5) x 6;卷積操作的stride參數(shù)默認值為1 x 1,32 - 5 + 1 = 28,并且使用ReLU對第一次卷積后的結(jié)果進行非線性處理,輸出大小為28 x 28 x 6;
  • 第一次卷積后池化:kernel_size為2 x 2,輸出大小變?yōu)?4 x 14 x 6;
  • 第二次卷積:使用16個卷積核,故卷積核的規(guī)模為(5 x 5 x 6) x 16;使用ReLU對第二次卷積后的結(jié)果進行非線性處理,14 - 5 + 1 = 10,故輸出大小為10 x 10 x 16;
  • 第二次卷積后池化:kernel_size同樣為2 x 2,輸出大小變?yōu)? x 5 x 16;
  • 第一次全連接:將上一步得到的結(jié)果鋪平成一維向量形式,5 x 5 x 16 = 400,即輸入大小為400 x 1,W大小為120 x 400,輸出大小為120 x 1;
  • 第二次全連接,W大小為84 x 120,輸入大小為120 x 1,輸出大小為84 x 1;
  • 第三次全連接:W大小為10 x 84,輸入大小為84 x 1,輸出大小為10 x 1,即分別預(yù)測為10類的概率值。
  • nn.Conv2d詳細圖解

    注意

  • 在PyTorch中,池化操作默認的stride大小與卷積核的大小一致;
  • 如果池化核的大小為一個方陣,則僅需要指明一個數(shù),即kernel_size參數(shù)為常數(shù)n,表示池化核大小為n x n。
  • 總結(jié)

    以上是生活随笔為你收集整理的PyTorch中的nn.Conv1d与nn.Conv2d的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。