8.卷积神经网络基础

发布于:2025-07-15 ⋅ 阅读:(20) ⋅ 点赞:(0)

8.1 卷积核计算

import torch 
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):
    #计算二维互相关运算
    h,w=k.shape#卷积核的长和宽
    Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-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()#不指定dim的话是全部都加载一起
            #print(X[i:i+h,j:j+w]*k)
    return Y
X = 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]])
Y=corr2d(X, K)

8.2 卷积核边缘计算

import torch 
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):
    #计算二维互相关运算
    h,w=k.shape#卷积核的长和宽
    Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-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()#不指定dim的话是全部都加载一起
            #print(X[i:i+h,j:j+w]*k)
    return Y
X = torch.ones((6, 8))
X[:, 2:6] = 0
K=torch.tensor([[1.0,-1.0]])
Y=corr2d(X,K)#这样检测之后如果两个水平相邻的元素相同则输出为0,否则则是非0元素
print(Y)

8.3 卷积核学习设计

#卷积层设计--学习卷积核
import torch 
from torch import nn
import matplotlib.pyplot as plt
def corr2d(X,k):
    #计算二维互相关运算
    h,w=k.shape#卷积核的长和宽
    Y=torch.zeros((X.shape[0]-h+1,X.shape[1]-w+1))#创建(X-H+1,X-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()#不指定dim的话是全部都加载一起
            #print(X[i:i+h,j:j+w]*k)
    return Y
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
K=torch.tensor([[1.0,-1.0]])
Y = corr2d(X, K)
conv2d=Conv2D(kernel_size=(1,2))
optimizer=torch.optim.SGD(conv2d.parameters(),lr=0.05)
for epoch in range(500):
    out=conv2d(X)
    loss=((out-Y)**2).mean()
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    print(f"Epoch {epoch+1}, loss = {loss.item():.4f}")
print(conv2d.weight.data)
print(conv2d.bias.data)

8.4 Q&A

在这里插入图片描述

1.没有什么本质区别,两者其实是一样的
2.权重变形只是数学算法上推理理解的概念,重新索引是指将权重矩阵的坐标与卷积结果的位置匹配上,所以要用到i,j,a,b四个维度的坐标。
3.图像输入进来就是矩阵了,在前面只不过是由于机器学习分类器的缘故必须做flatten操作,卷积神经网络就没有必要做这个操作了,本质上其就是个二维矩阵。
4.没有特定的要求一般不用可变卷积
5.感受野是局部的感受,但是随着卷积肯定能看完所有的图像信息,那我不妨把感受野设计小一些,让模型看的更仔细,然后在深层网络中一步一步提取逐渐变深。
6.当然可以了,有相关的文章。
7.-号在数学中相当于卷积核反过来计算,这样的结果可能有些不一样了,但可能只是和FFT公示推导有关系,深度学习的卷积是正常的做corr相关计算的。
8.平移不变指的是卷积核的数是在这一卷积操作过程中平移不变的,卷积核的大小体现了局部性。