李宏毅(深度学习)--(2)

一.区别DataLoader与Dataset

在代码中我们经常会看到:

python 复制代码
from torch.utils.data import  DataLoader
from  torch.utils.data import  Dataset

(1)Dataset

Dataset 是一个抽象类,用于表示数据集。它提供了一种通用的方式来访问和操作数据。你需要继承 Dataset 类并实现 __len____getitem__ 方法。

作用:
  • 定义如何从数据集中获取单个数据样本。
  • 提供数据集的长度信息。

(2) DataLoader

DataLoader 是一个迭代器,它封装了 Dataset 并提供了批量处理、打乱数据、并行加载等功能。它使得数据加载更加高效和灵活。

作用:
  • Dataset 中的数据分成小批量。
  • 提供数据打乱、并行加载等功能。

DatasetDataLoader 在 PyTorch 中扮演着不同的角色。Dataset 用于定义数据集的结构和访问方式,而 DataLoader 用于高效地加载数据集并提供批量处理等功能。通常,你会先定义一个自定义的 Dataset,然后使用 DataLoader 来加载数据并进行训练。

二 .shape()的理解

三,矩阵转置

python 复制代码
import  torch
start =torch.tensor([[2,3,2],[2,1,4]])
print(start)
s11=start.transpose(0,1)
print(s11)

#输出:
tensor([[2, 3, 2],
        [2, 1, 4]])
tensor([[2, 2],
        [3, 1],
        [2, 4]])

四 .squeeze()的作用

python 复制代码
from torch.utils.data import  DataLoader
from  torch.utils.data import  Dataset
import  torch
start =torch.tensor([[[2,3,2],[2,1,4]]])
print(start.size())

s12=start.squeeze(0)
print(s12.size())

#.squeeze() 的作用
# .squeeze() 的主要作用是 移除长度为 1 的维度,而不是移除指定的维度。
# 
# 如果你不指定 dim,它会移除所有长度为 1 的维度。
# 如果你指定 dim,它只会检查该维度是否长度为 1,如果是,则移除;否则,不做任何操作。


输出:
torch.Size([1, 2, 3])
torch.Size([2, 3])

五.矩阵的拼接:

六,梯度的理解

python 复制代码
import  torch
start =torch.tensor([[1.,0.],[-1.,1.]],requires_grad=True)
z = start.pow(2).sum()
z.backward()
print(start.grad)

输出:

python 复制代码
tensor([[ 2.,  0.],
        [-2.,  2.]])

注意:只有标量才能求梯度

七.depplearning全流程理解

八. model.eval()与model.train()

model.eval() 是一个简单的开关,用于告诉你的神经网络模型:"现在处于评估或推理阶段,请关闭所有只在训练时使用的特殊机制(如 Dropout 和 BN 的训练更新),以便我得到稳定可靠的输出。" 这对于获得准确的模型性能评估和可靠的预测结果至关重要。通常在训练循环之外,或者在准备进行推理之前调用它。

model.eval()主要作用和影响包括:

  1. 关闭 Dropout :在训练模式下(默认),Dropout 会在神经元之间随机断开连接,以防止过拟合。但在评估或推理时,我们需要使用完整的网络结构,因此 model.eval() 会关闭 Dropout 层,确保所有神经元都参与计算。

  2. 关闭 Batch Normalization 的训练更新:Batch Normalization (BN) 层在训练时,会根据当前 mini-batch 的数据计算均值和方差,并使用这些统计量进行归一化,同时还会维护一个移动平均来估计整个数据集的全局均值和方差。在评估模式下,BN 层会停止使用当前 mini-batch 的统计量,而是使用之前训练过程中积累的全局均值和方差来进行归一化,以保证评估结果的一致性。

  3. 保持模型状态:它不会改变模型学习到的参数(权重和偏置),只是改变了模型中某些层(如 Dropout 和 BN)的行为方式。

九,训练模型的保存与加载

python 复制代码
torch.save(model.state_dict(), path)
#这行代码将模型的参数字典(即模型中所有的可学习参数)保存到一个文件中。model.state_dict() 返回一个#包含模型参数的字典,torch.save 将这个字典序列化并保存到指定的路径 path。
ckpt = torch.load(path)
#这行代码从一个文件中加载之前保存的模型参数字典。torch.load 从指定的路径 path 加载一个字典,并将其#赋值给变量 ckpt。
model.load_state_dict(ckpt)
#这行代码将加载的参数字典 ckpt 加载回模型中。model.load_state_dict 将字典中的参数复制到模型的相应#参数中,使得模型恢复到保存时的状态。

十,super()的作用

python 复制代码
import torch.nn as nn
class Mymodel(nn.Module):
  def __init__(self):
    super(Mymodel,self).__init__()
    #super(Mymodel, self).__init__() 这行代码的作用是调用父类 nn.Module 的构造函数 __init__
    #等价于 nn.Module.__init__(self)

十一,矩阵运算到模型预算(神图!!!)

十二,激活函数softmax() 在输出层的应用及其原理

分类问题中,在输出层(如图)我们一般都会加上softmax()激活函数,为什么呢?

首先讲softmax()的函数知识:

因为隐藏层的激活函数会得到一个向量,该向量有可能会大于1,而我们输出层一般都是希望得到概率值小于1,所以基于softmax()特性加上softmax() 函数。

ps:sigmod函数适用于二分类,softmax函数适用于多酚类。


今天学到这啦

谢谢大家O(∩_∩)O哈哈~