Conv2D 卷积层 卷积核的优化
卷积核卷积层的工作原理
卷积核通过与原图像进行二维互相关运算得到原图像中最有可能包含待检测目标的区域
二 维 互 相 运 算 : y [ i , j ] = ( X [ i : i + h , j : j + w ] ∗ K ) . s u m ( ) 其 中 X 为 原 图 像 的 矩 阵 K 为 核 矩 阵 h 和 w 是 核 矩 阵 的 大 小 二维互相运算:\\ y[i,j]=(X[i:i+h,j:j+w]*K).sum()\\ 其中X为原图像的矩阵\\ K为核矩阵\\ h和w是核矩阵的大小\\ 二维互相运算:y[i,j]=(X[i:i+h,j:j+w]∗K).sum()其中X为原图像的矩阵K为核矩阵h和w是核矩阵的大小
二维互相关运算的代码:
def corr2d(X,K):
h,w = K.shape
Y =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 Y
卷积层
卷积层的基本定义:
1. weight 权重参数
1. bias 偏移量
1. forward计算函数 利用已经保存的参数对输入矩阵进行二维互相关运算
卷积层的代码
class Conv2D(nn.Module):
def __init__(self,kernel_size):
super().__init__()
self.weight = nn.Parameter(torch.randn(kernel_size))
self.bias = nn.Parameter(torch.zeros(1))
# 定义向前计算
def forward(self,x):
return corr2d(x,self.weight)+self.bias
自动学习卷积核
面对一个图像的输入定义它所需要的卷积核是相当困难的,我们选择让它通过输入一个图像经过卷积层后输出一个图像和我们已知正确输出求差值,来找到比较合适的卷积核来对图像进行输出
卷积核的学习也是通过梯度来不断优化参数
for i in range (10):
Y_hat = conv2d(X) # 模型输出
l =(Y_hat - Y) ** 2 # 损失函数
conv2d.zero_grad() # 将模型参数的grad 先置为 0
l.sum().backward() # 反向传播计算
conv2d.weight.data[:] -= lr * conv2d.weight.grad
if (i+1) % 2 == 0:
print(f'epoch {i + 1}, loss {l.sum():.3f}')