【动手学深度学习v2】卷积层,一维,二维,四维的维度问题探讨,为什么V是W的重新索引?平移不变性和局部性原理如何理解?——李沐老师的课程笔记

深度学习,从零实现多层感知机——李沐老师的课程笔记

对于深度学习,非常推荐李沐老师的课程,受益匪浅

课程视频QA_哔哩哔哩_bilibili

这里对老师的讲解做一些注释,希望大家可以更好理解这里面的意思

没有基础不知道软件如何安装的可以看Python深度学习:安装Anaconda、PyTorch(GPU版)库与PyCharm_哔哩哔哩_bilibili

若有差错,请与我联系探讨

目录

卷积层

原则1-平移不变性

原则2-局部性


卷积层

首先说一维:有人认为w之前就是一维,那是w一般另一个维度是1,只输出一个结果,所以当成一维了,在softmax那章可以看出,w是二维,如(748,10)这个样子,因为有十类需要区分。
然后就是二维了:x是二维时,w首先就要有两个维度来分配权重,然后加了高和宽两个维度,变成了4维,这里i、j对应的是输出的值在输出矩阵上的位置,k、l对应的是输入的值在输入矩阵上的位置,所以这里就抽象成了一个4维的张量,之前的权重之所以是2维的张量是因为之前的输入输出都是一维的向量,也可以理解成第一维表示输出向量的位置,第二维表示输入向量的位置,这里因为又还原成了矩阵,所以输入输出都变成了二维向量,所以说权重也变成了4维的张量

这个变化:V是W的重新索引,也就是说x原来位置是k、l,现在是i+a、j+b,这两个值前后还是没有变化的,唯一变化的就是索引变化,即v的下标对应的量变化了,比如v(0,0)对应w(1,1)

引用b友评论
说白了就是当w变成二维的时候,输出图也从一维变二维了(所以才在第一个点上写输入和输出变形为矩阵),所以w是四维,如果二维输出成一维,那w就变成三维了(但是那样不如直接用多层感知机了)

原则1-平移不变性

到第二幅图这里就可以理解了,首先变化i+a,j+b是为了保留i和j的信息,然后这里为了让v不会因为x变化而一直变化,所以把v强行转变为一个二维的矩阵(表面上是二维,其实是四维,但是相同地方值一样)

原则2-局部性

局部性说明的是,权重只在i和j周边有参数,其他远的地方参数直接为0

第一个Y是维度大小,第二个Y是真的算式,其中的⭐是二维交叉操作子的如下图:

这里说明为了方便,卷积层并没有用数学上卷积的严格定义,而是取了方便,用相同的但是不反转的二维交叉相关来计算。所以说是说卷积层,但是实现使用交叉相关。
 

这里核矩阵就是权重,而这也就解决了最开始的问题“在如今识别一张大约360m像素的猫狗图片时,如果用多层感知机MLP的话,假设只用一层,100个输入,那么w权重所需要的参数也会到达惊人的3.6b,这个数量甚至多于所有猫狗的总和,还不知每个图片进行一个标记”
而这个问题的答案就是用核矩阵(核)来担当新的w权重,以前是全连接层是将每个元素对应相乘,现在卷积层是将核矩阵过一遍输入矩阵。

以下是代码部分:

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]):
#             这里是从i到i+h-1
            Y[i, j] = (X[i:i + h, j:j + w] * K).sum()
    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]])
corr2d(X, K)

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
X

K = torch.tensor([[1.0, -1.0]])

# 上图把1当白,0当黑就可以检测颜色边缘了
# 检测结果如下,颜色变化的地方是1和负1
Y = corr2d(X, K)
Y


# 当然,我们这个k不能检测横向的,也就是转置的矩阵
corr2d(X.t(), K)


conv2d = nn.Conv2d(1, 1, kernel_size = (1, 2), bias = False)
X = X.reshape(1,1,6,8)
Y = Y.reshape(1,1,6,7)

for i in range(10):
    Y_hat = conv2d(X)
    l = (Y_hat - Y)**2
#     这里还没有计算梯度,所以清零没有问题
    conv2d.zero_grad()
    l.sum().backward()
    conv2d.weight.data[:] -= 3e-2*conv2d.weight.grad
    if (i + 1) % 2 == 0:
        print(f'batch {i+1}, loss {l.sum():.3f}')
        
        
conv2d.weight.data

  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《动手深度学习 v2》是一本介绍深度学习的教材,通过动手实践的方式帮助读者深入理解深度学习的理论和实践。这本书由李沐等人共同编写,内容包含了深度学习的基本概念、算法原理以及实际应用等方面。 这本书的优点之一是注重实践,通过大量的案例和代码实现,读者可以亲自动手搭建深度学习模型,并通过实际操作来理解算法的工作原理。此外,书中还涵盖了一些最新的深度学习技术和应用,帮助读者跟上深度学习领域的最新发展。 《动手深度学习 v2》也具有一定的难度,对于初者来说需要一定的数和编程基础才能更好地理解和实践。但是,书中的难点都有详细的解答和说明,读者可以在遇到困难时查看相关解析,提升习效果。 总的来说,《动手深度学习 v2》是一本非常实用的深度学习教材,适合有一定基础的读者习和实践。通过阅读这本书,读者可以系统地深度学习的基本概念和算法,掌握如何应用深度学习解决实际问题,进而在深度学习领域有更深入的理解和应用。 ### 回答2: 《动手深度学习 v2》pdf是一本深度学习入门的教程,适合初深度学习的理论和实践。这本教程由作者李沐、阿斯顿·张剑锋等人合作撰写,涵盖了深度学习的基本概念、神经网络的构建、常见深度学习模型、计算机视觉、自然语言处理等领域的应用。 这本教程的特点是注重实践,每个章节都提供了大量的代码示例和实验指导,让读者可以动手实践,巩固所知识。同时,教程还配有相应的代码库和数据集,读者可以下载使用。 教程通过讲解深度学习的基本概念和原理,帮助读者建立起对深度学习的整体认识。然后,通过实例演示和实践,教会读者如何使用深度学习框架搭建神经网络,并进行训练和优化。 另外,这本教程也介绍了一些常见的应用领域,如计算机视觉和自然语言处理。读者可以习到如何使用深度学习来解决图像分类、目标检测、文本生成等问题。 最后,这本教程还提供了一些深度学习的进阶内容,如深度生成模型和强化习等,供读者深入习和拓展。 总的来说,《动手深度学习 v2》pdf是一本很好的深度学习入门教程,通过动手实践和实例演示,帮助读者快速入门和掌握深度学习的基本知识和应用技巧。对于想要深度学习的初者来说,是一本非常有价值的教材。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值