作者:CSDN @ _養(yǎng)樂多_
背景
一維卷積的運(yùn)算過程網(wǎng)上很多人說不清楚,示意圖畫的也不清楚。因此,本人針對一維卷積的過程,繪制了計(jì)算過程,以我的知識量解釋一下 pytorch 中 Conv1d() 函數(shù)的機(jī)理。
Conv1d() 計(jì)算過程
假設(shè)我們現(xiàn)在有 n 行,3列數(shù)據(jù)。n 行可以是 n 個點(diǎn),也可以是 n 個樣本數(shù)據(jù)。3列可以視為3列特征,即特征向量。我們想要通過 MLP 將其從3列升維度為6維度,就需要用 Conv1d() 函數(shù)。具體過程就是讓每一行數(shù)據(jù)點(diǎn)乘一個卷積核,得到一個數(shù),6個卷積核就是6個數(shù),這樣就把一個點(diǎn)的3列變成了6列。然后逐行遍歷每個點(diǎn),就可以得到新的得分矩陣。
備注: 從6列變成12列,就點(diǎn)乘12個卷積核。從12列變成6列,就點(diǎn)乘6個卷積核。
Conv1d() 計(jì)算過程圖示
①、第1行數(shù)據(jù)參與卷積(這里的 a 是樣本數(shù)據(jù),W 是卷積核,f 是結(jié)果。)
②、第2行數(shù)據(jù)參與卷積

③、第n行數(shù)據(jù)參與卷積

Conv1d() 代碼舉例
我們以 PointNet 中分類的主干模型 (多層感知機(jī),MLP) 來說,Conv1d(64, 128, 1) 其實(shí)就是用 128 個 64 行 1 列的卷積核和前面 n 行 64 列的矩陣逐行點(diǎn)積,升維到 128 列。
class STNkd(nn.Module):
def __init__(self, k=64):
super(STNkd, self).__init__()
self.conv1 = torch.nn.Conv1d(k, 64, 1)
self.conv2 = torch.nn.Conv1d(64, 128, 1)
self.conv3 = torch.nn.Conv1d(128, 1024, 1)
self.fc1 = nn.Linear(1024, 512)
self.fc2 = nn.Linear(512, 256)
self.fc3 = nn.Linear(256, k*k)
self.relu = nn.ReLU()
self.bn1 = nn.BatchNorm1d(64)
self.bn2 = nn.BatchNorm1d(128)
self.bn3 = nn.BatchNorm1d(1024)
self.bn4 = nn.BatchNorm1d(512)
self.bn5 = nn.BatchNorm1d(256)
self.k = k
def forward(self, x):
batchsize = x.size()[0]
x = F.relu(self.bn1(self.conv1(x)))
x = F.relu(self.bn2(self.conv2(x)))
x = F.relu(self.bn3(self.conv3(x)))
x = torch.max(x, 2, keepdim=True)[0]
x = x.view(-1, 1024)
x = F.relu(self.bn4(self.fc1(x)))
x = F.relu(self.bn5(self.fc2(x)))
x = self.fc3(x)
iden = Variable(torch.from_numpy(np.eye(self.k).flatten().astype(np.float32))).view(1,self.k*self.k).repeat(batchsize,1)
if x.is_cuda:
iden = iden.cuda()
x = x + iden
x = x.view(-1, self.k, self.k)
return x
Linear() 的原理
就是解 Y = X · A.T + b。其中的 A.T 是權(quán)重矩陣的轉(zhuǎn)置矩陣,b 為偏置矩陣。nn.Linear(1024, 512) 就是將 n 行 1024 列的 X 矩陣降維到 n 行 512 列的矩陣。只要 A.T 為 1024 行 512 列的矩陣,和 X 點(diǎn)乘,就可以得到 n 行 512 列的矩陣,達(dá)到降維的目的。
①、Linear() 計(jì)算 (忽略偏置矩陣)
Linear() 動圖
Conv1d() 和 Linear() 的區(qū)別
已經(jīng)有人比較了在相同輸入數(shù)據(jù)的條件下兩者之間的區(qū)別:(1)Linear() 比 conv1d() 的計(jì)算速度快;(2)Conv1d() 的精度比 Linear() 的高;(3)在反向傳播更新梯度的時(shí)候,數(shù)值有差異。
那么為什么這么設(shè)計(jì)呢?查了大量資料以后,我覺得這個答案最靠譜。當(dāng)你必須保留語義分割中的空間信息時(shí),使用卷積 Conv1d() 。當(dāng)你不需要做任何與空間信息相關(guān)的事情時(shí),比如在基本分類(mnist、貓狗分類器)中,使用線性層 Linear() 。文章來源:http://www.zghlxwxcb.cn/news/detail-455399.html
Conv1d | Linear | |
---|---|---|
先驗(yàn)知識 | 有 | 無 |
共享參數(shù) | 有 | 無 |
運(yùn)行速度 | 慢 | 快 |
空間信息 | 有 | 無 |
作用 | 特征工程 | 分類器 |
卷積核
以 PointNet 為例,將卷積核打印出來查看卷積核的形狀,請看本人的另一篇文章。鏈接如下,
https://blog.csdn.net/qq_35591253/article/details/127671790文章來源地址http://www.zghlxwxcb.cn/news/detail-455399.html
到了這里,關(guān)于CONV1D一維卷積神經(jīng)網(wǎng)絡(luò)運(yùn)算過程(舉例:n行3列?n行6列)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!