二維互相關(cross-correlation)運算的輸入是乙個二維輸入陣列和乙個二維核(kernel)陣列,輸出也是乙個二維陣列,其中核陣列通常稱為卷積核或過濾器(filter)。卷積核的尺寸通常小於輸入陣列,卷積核在輸入陣列上滑動,在每個位置上,卷積核與該位置處的輸入子陣列按元素相乘並求和,得到輸出陣列中相應位置的元素。圖1展示了乙個互相關運算的例子,陰影部分分別是輸入的第乙個計算區域、核陣列以及對應的輸出。
下面我們用corr2d
函式實現二維互相關運算,它接受輸入陣列x
與核陣列k
,並輸出陣列y
。
import torch
import torch.nn as nn
def corr2d(x, k):
h, w = x.shape
h, w = k.shape
y = torch.zeros(h - h + 1, w - 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 y
構造上圖中的輸入陣列x
、核陣列k
來驗證二維互相關運算的輸出。
下面我們看乙個例子,我們構造一張\(6 \times 8\)的影象,中間4列為黑(0),其餘為白(1),希望檢測到顏色邊緣。我們的標籤是乙個\(6 \times 7\)的二維陣列,第2列是1(從1到0的邊緣),第6列是-1(從0到1的邊緣)。
x = torch.ones(6, 8)
y = torch.zeros(6, 7)
x[:, 2: 6] = 0
y[:, 1] = 1
y[:, 5] = -1
print(x)
print(y)
我們希望學習乙個\(1 \times 2\)卷積層,通過卷積層來檢測顏色邊緣。
conv2d = conv2d(kernel_size=(1, 2))
step = 30
lr = 0.01
for i in range(step):
y_hat = conv2d(x)
l = ((y_hat - y) ** 2).sum()
l.backward()
# 梯度下降
conv2d.weight.data -= lr * conv2d.weight.grad
conv2d.bias.data -= lr * conv2d.bias.grad
# 梯度清零
conv2d.weight.grad.zero_()
conv2d.bias.grad.zero_()
if (i + 1) % 5 == 0:
print('step %d, loss %.3f' % (i + 1, l.item()))
print(conv2d.weight.data)
print(conv2d.bias.data)
筆記 動手學深度學習
在求數值解的優化演算法中,小批量隨機梯度下降 mini batch stochastic gradient descent 在深度學習中被廣泛使用。它的演算法很簡單 先選取一組模型引數的初始值,如隨機選取 接下來對引數進行多次迭代,使每次迭代都可能降低損失函式的值。在每次迭代中,先隨機均勻取樣乙個由...
深度學習 動手學深度學習筆記 12
g是乙個生成的網路,它接收乙個隨機的雜訊z,通過這個雜訊生成,記做g z d是乙個判別網路,判別一張是不是 真實的 它的輸入引數是x,x代表一張,輸出d x 代表x為真實的概率,如果為1,就代表100 是真實的,而輸出為0,就代表不可能是真實的。在訓練過程中,生成網路g的目標就是盡量生成真實的去欺騙...
動手學深度學習筆記2
part1 模型選擇1 誤差與資料集 訓練誤差 training error 模型在訓練集上表現出的誤差。泛化誤差 generalization error 在任意乙個測試資料樣本上表現出的誤差的期望。舉個栗子,訓練誤差就是做往屆試卷 訓練 的錯誤率,泛化誤差則可以通過真正參加考試 測試 時的答題錯...