Convolutional-NN
Simple-CNN
如果想看原理的话,请看我的同专栏下的文章
- 一个简单的多输入通道运行过程示意图:
基础实现:
import torch
from torch import nn
from d2l import torch as d2l
# 自定义的二维互相关操作
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
# 自定义卷积层
class Conv2D(nn.Module):
def __init__(self, kernel_size): # 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
# Part A 单通道卷积
X = torch.ones((6, 8))
X[:, 2:6] = 0
K = torch.tensor([[1.0, -1.0]])
Y = corr2d(X, K) # 目标值
# 二维卷积层一般都使用四维输入和输出格式(批量大小、通道、高度、宽度)
X = X.reshape((1, 1, 6, 8)) # # 其中批量大小和通道数都为1
Y = Y.reshape((1, 1, 6, 7))
lr = 3e-2 # 学习率
# 实现自学习的卷积核(忽略偏置),这里调用nn模块中的类
# 二维卷积,输入和输出通道都是1,相当于P=D=1,U和V通过结合kernel_size计算得到
# padding = P, stride = S, output: (𝑀 − 𝐾 + 2𝑃) /𝑆 + 1
conv2d = nn.Conv2d(1, 1, kernel_size=(1, 2), bias=False)
for i in range<