深度学习笔记 —— 卷积层
生活随笔
收集整理的這篇文章主要介紹了
深度学习笔记 —— 卷积层
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
單隱藏層就已經需要14GB的參數了!
平移不變性:識別器不會因為像素的位置而發生改變
局部性:找Waldo只需要看局部的信息即可,不需要看全局的信息
個人理解:由前面的例子可知,全連接層需要的參數量會非常多,這也就使得MLP受到了限制。但是為了解決問題,提出了“平移不變性”和“局部性”兩個性質。我們從全連接層出發,應用兩種性質,對原本的計算方式做一些改進,也就得到了卷積層的計算方式。相較于全連接,平移不變性使得卷積的權重在一定范圍內,v是相同的;但是由于局部性的存在,當|a|,|b| > Δ的時候,v = 0。這樣就極大地優化了參數量。由此,卷積層是一個特殊的全連接層,那么卷積層自然也像全連接層一樣,能夠進行梯度計算和反向傳播從而學習到參數。
?
import torch from torch import nn from d2l import torch as d2ldef corr2d(X, K):"""計算二維互相關運算"""h, w = K.shapeY = torch.zeros((X.shape[0] - h + 1, X.shape[1] - w + 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i, j] = (X[i: i + h, j: j + w] * K).sum()return YX = torch.tensor([[0.0, 1.0, 2.0], [3.0, 4.0, 5.0], [6.0, 7.0, 8.0]]) K = torch.tensor([[0.0, 1.0], [2.0, 3.0]]) print(corr2d(X, K))# 實現二維卷積層 class Conv2D(nn.Module):def __init__(self, kernel_size):super().__init__()self.weight = nn.Parameter(torch.rand(kernel_size))self.bias = nn.Parameter(torch.zeros(1))def forward(self, x):return corr2d(x, self.weight) + self.bias# 簡單應用:檢測圖像中不同顏色的邊緣 X = torch.ones((6, 8)) X[:, 2: 6] = 0 print(X) K = torch.tensor([[1.0, -1.0]]) Y = corr2d(X, K) print(Y)# 學習由X生成Y的卷積核 conv2d = nn.Conv2d(1, 1, kernel_size=(1, 2), bias=False) # 兩個1分別表示批量大小數和通道數 X = X.reshape((1, 1, 6, 8)) Y = Y.reshape((1, 1, 6, 7))for i in range(10):Y_hat = conv2d(X)l = (Y_hat - Y) ** 2conv2d.zero_grad() # 梯度設置為0l.sum().backward()conv2d.weight.data[:] -= 3e-2 * conv2d.weight.grad # 學習率:3e-2if (i + 1) % 2 == 0:print(f'batch {i + 1}, loss {l.sum():.3f}')print(conv2d.weight.data.reshape((1, 2)))總結
以上是生活随笔為你收集整理的深度学习笔记 —— 卷积层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [react] React根据不同的环境
- 下一篇: 资本冬天已至,开发者却可以着眼未来