李宏毅(深度学习)--(2)
一.区别DataLoader与Dataset
在代码中我们经常会看到:
from torch.utils.data import DataLoader
from torch.utils.data import Dataset
(1)Dataset
Dataset
是一个抽象类,用于表示数据集。它提供了一种通用的方式来访问和操作数据。你需要继承 Dataset
类并实现 __len__
和 __getitem__
方法。
作用:
- 定义如何从数据集中获取单个数据样本。
- 提供数据集的长度信息。
(2) DataLoader
DataLoader
是一个迭代器,它封装了 Dataset
并提供了批量处理、打乱数据、并行加载等功能。它使得数据加载更加高效和灵活。
作用:
- 将
Dataset
中的数据分成小批量。 - 提供数据打乱、并行加载等功能。
Dataset
和 DataLoader
在 PyTorch 中扮演着不同的角色。Dataset
用于定义数据集的结构和访问方式,而 DataLoader
用于高效地加载数据集并提供批量处理等功能。通常,你会先定义一个自定义的 Dataset
,然后使用 DataLoader
来加载数据并进行训练。
二 .shape()的理解
三,矩阵转置
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()的作用
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])
五.矩阵的拼接:
六,梯度的理解
import torch
start =torch.tensor([[1.,0.],[-1.,1.]],requires_grad=True)
z = start.pow(2).sum()
z.backward()
print(start.grad)
输出:
tensor([[ 2., 0.],[-2., 2.]])
注意:只有标量才能求梯度
七.depplearning全流程理解
八. model.eval()与model.train()
model.eval()
是一个简单的开关,用于告诉你的神经网络模型:“现在处于评估或推理阶段,请关闭所有只在训练时使用的特殊机制(如 Dropout 和 BN 的训练更新),以便我得到稳定可靠的输出。” 这对于获得准确的模型性能评估和可靠的预测结果至关重要。通常在训练循环之外,或者在准备进行推理之前调用它。
model.eval()主要作用和影响包括:
关闭 Dropout:在训练模式下(默认),Dropout 会在神经元之间随机断开连接,以防止过拟合。但在评估或推理时,我们需要使用完整的网络结构,因此
model.eval()
会关闭 Dropout 层,确保所有神经元都参与计算。关闭 Batch Normalization 的训练更新:Batch Normalization (BN) 层在训练时,会根据当前 mini-batch 的数据计算均值和方差,并使用这些统计量进行归一化,同时还会维护一个移动平均来估计整个数据集的全局均值和方差。在评估模式下,BN 层会停止使用当前 mini-batch 的统计量,而是使用之前训练过程中积累的全局均值和方差来进行归一化,以保证评估结果的一致性。
保持模型状态:它不会改变模型学习到的参数(权重和偏置),只是改变了模型中某些层(如 Dropout 和 BN)的行为方式。
九,训练模型的保存与加载
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()的作用
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哈哈~