从全连接到卷积

一、全连接到卷积

1、卷积具有两个原则:

平移不变性:无论作用在哪个部分,它都要有相同的作用,而不会随着位置的改变而改变

局部性:卷积核作用处,作用域应该是核作用点的周围一小部分而不作用于更大的部分

2、卷积是一个特殊的全连接层。

(1)对输入输出:长度变化->高宽变化;

(2)对权重:之前输入输出都是一维,权重就是二维。现在输入输出都是二维,权重就是四维了;全连接层的权重矩阵的维度可以表示为 (n,m),其中 n 是输入神经元的数量,m 是输出神经元的数量。如果一个全连接层有 4 个输入维度和 3 个输出维度,那么它的权重矩阵的维度就是 4×3

(3)与全连接二维权重类似,只是从二维变成了四维

(4)把下标变一下,使得可以引出卷积

3、对应两个原则,处理上面的等式

(1)平移不变形

i,j变的时候,不能让w跟着变,即在别的维度都是一样的权重,否则失去平移不变性

平移不变性让我们对权重有一个限制,把ij的维度抹去,从四维变为二维

(2)局部性

4、权重是识别图片的识别器,

5、总结

(1)对全连接层使用平移不变性和局部性得到卷积层

(2)"卷积核在数值不变的情况下遍历整张图"、"卷积核不应该太大"

(3)这是卷积操作子的情况,后面会写卷积层的操作

二、卷积层

1、二维卷积层

(1)对输出Y:Kernel为2×2的矩阵,那么德尔塔就应该等于1

(2)卷积核与输入的位置无关,这叫做平移不变性;输出的一个窗口所用的只是一个2×2的矩阵,这说明了局部性

(3)w =其实就是kernel

(4)卷积核矩阵的大小,控制的是局部性;卷积为了保持局部性,不会随着输入维度的变大而使核变复杂

2、交叉相关与卷积

只是学出来的东西是反的,其他没有区别

3、一维与三维:一维交叉相关主要处理文本语言时序序列,而三维交叉相关会处理视频医学图像气象地图等。我们经常使用的二维交叉相关通常用于处理图像。

4、总结

三、代码

1、互相关运算

复制代码
import torch
from torch import nn
from d2l import torch as d2l

def corr2d(X, K):  #@save
    """计算二维互相关运算"""
    #卷积矩阵的长宽
    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]):
            #卷积核大小的X与卷积核相乘求和得到输出
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    return Y

2、卷积层

复制代码
#跟上述的功能相同,只是创建的继承nn.Module的卷积类
class Conv2D(nn.Module):
    def __init__(self, kernel_size):
        super().__init__()
        #生成kernel大小的权重矩阵
        self.weight = nn.Parameter(torch.rand(kernel_size))
        #偏置全部设为1
        self.bias = nn.Parameter(torch.zeros(1))

    def forward(self, x):
        return corr2d(x, self.weight) + self.bias

3、卷积核

复制代码
# 构造一个二维卷积层,它具有1个输出通道和形状为(1,2)的卷积核
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))
lr = 3e-2  # 学习率

for i in range(10):
    #使用卷积层对X进行前向传播,得到预测值Y_hat
    Y_hat = conv2d(X)
    #计算预测值和真实值之间的平方误差损失
    l = (Y_hat - Y) ** 2
    ## 将卷积层的梯度清零
    conv2d.zero_grad()
    #计算损失对卷积核的梯度
    l.sum().backward()
    # 迭代卷积核,使用梯度下降法
    conv2d.weight.data[:] -= lr * conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'epoch {i+1}, loss {l.sum():.3f}')
相关推荐
程序员脚趾5 小时前
GPT-5.6 上线:当 GPT 与 Codex 走向融合,AI 正从“回答问题”走向“完成工作”
人工智能
thubier(段新建)5 小时前
owtb 3pl 面向城市配送物流企业需求V0.2
大数据·人工智能
Token炼金师6 小时前
模型的防线:Prompt 注入防御、越狱攻击与对齐、红队测试、价值观对齐、对抗样本鲁棒性、安全评测与边界 —— 模型安全六防
人工智能·红队测试·prompt 注入防御·越狱攻击与对齐·价值观对齐·对抗样本鲁棒性·安全评测与边界
嘘神秘用6 小时前
布:AI 驱动的 Redis 客户端,更快、更直观
数据库·人工智能·redis
黒亱中旳6 小时前
Java AI 框架三国杀:Solon AI vs Spring AI vs LangChain4j 深度对比
java·人工智能·spring
小和尚同志6 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
alxraves7 小时前
医用超声远程会诊系统:会诊平台的核心架构与功能解析
java·人工智能·架构
jinggongszh7 小时前
智能硬件对接与系统落地:开发岗在制造现场的经验沉淀
大数据·人工智能
ZeekerLin7 小时前
AI 原生团队协作机制:角色、分工与工程文化变化
大数据·人工智能
城中南小7 小时前
零基础认识大语言模型(LLM)工作原理(5.Transformer的FFN模块到底是什么?)
人工智能·语言模型·transformer