目录
代码在我的资源里或者通过迅雷看分享文件:深度学习
链接:https://pan.xunlei.com/s/VO3QcnPu5-YT5myVAbC6RAKMA1?pwd=dy8f#
复制这段内容后打开手机迅雷App,查看更方便
先了解他的基本组件:
PyTorch 的基本组件:
-
张量(Tensor):核心数据结构,类似于NumPy的ndarray,它可以在GPU上运行以加速计算。
-
自动求导(Autograd):自动求导系统可以自动计算张量操作的梯度,这对于训练神经网络至关重要。
-
神经网络模块(nn.Module):继承
nn.Module
并定义前向传播来构建的。通过组合不同的层(如卷积层、全连接层等)来构建复杂的网络。 -
优化器(Optimizer):提供多种优化算法(如SGD、Adam等),用于在训练过程中更新网络的权重。
-
数据加载(DataLoader):提供了一个可迭代的对象,用于批量加载数据。
加载数据
torch.utils.data.DataLoader
类,它可以封装任何给定的Dataset
对象。
Dataset
是一个抽象类,表示一个数据集。
通过继承这个类并实现两个主要方法(__len__
和__getitem__
)来创建自己的数据集。
__len__
方法应该返回数据集中的样本数。__getitem__
方法应该支持索引,并返回单个样本。对于图像,这通常是一个图像张量和一个标签。
代码案例:略(在我的文件分享里有)
插入:内置的数据集类torchvision.datasets.CIFAR10
已经实现了Dataset
接口,可以直接使用。后面会用到说明。
TensorBoard 的使用
TensorBoard 是 一个可视化工具,可视化模型训练过程中的各种指标,查看训练数据。
SummaryWriter
类来记录数据。(保存位置)
启动:tensorboard --logdir=runs --port=6007(任意数)端口数
Transforms 的使用
用于在数据加载到模型之前对数据进行预处理。transforms
包含了各种图像处理操作,如裁剪、缩放、归一化等。
定义 Transforms
transform = transforms.Compose([ | |
transforms.Resize((224, 224)), # 缩放图像到 224x224 | |
transforms.ToTensor(), # 将 PIL Image 或 numpy.ndarray 转换为 torch.Tensor | |
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), # 归一化 | |
]) |
在 Dataset 中使用 Transforms
使用 torchvision.datasets.CIFAR10
时,可以直接传递 transform
参数。
from torchvision import datasets | |
# 加载 CIFAR10 数据集,并应用上面定义的 transforms | |
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) |
自定义 Transforms
你也可以通过继承 torchvision.transforms.transforms.Transform
类来创建自定义的 transforms。
常见的transforms方法
transforms
模块中的常见方法包括但不限于:
- 裁剪
RandomCrop
:随机裁剪图像。
- 翻转和旋转
RandomRotation
:随机旋转图像。
- 图像变换
Resize
:调整图像大小。Normalize
:用均值和标准差归一化图像。ToTensor
:将PIL图像或Numpy数组转换为Tensor,并将像素值从[0, 255]缩放到[0.0, 1.0]。
- 组合变换
Compose
:将多个变换组合在一起,按顺序对图像进行预处理。
代码案例:略(在我的文件里有)
torchvision中的数据集使用
使用加载器时,通常可以指定数据集的路径、是否用于训练、转换操作等。
加载CIFAR10数据集的示例:
代码案例:略(在我的文件里有)
DataLoad的使用
DataLoader
是一个迭代器,它封装了Dataset
,并提供了一个简单的API来批量加载数据。
代码案例:略(在我的文件里有)
参数介绍:
-
dataset (
test_data
): 这是一个Dataset
对象,它代表了你想要加载的数据集。test_data
就是你想要加载并用于测试的数据集。 -
batch_size (64): 这个参数指定了每个批次(batch)应该包含的样本数。
-
shuffle (False): 这个参数控制是否在每个epoch开始时打乱数据。设置为
True
时,数据在每个epoch开始时会被随机打乱。 -
num_workers (0): 这个参数指定了用于数据加载的子进程数。设置为0意味着数据将在主进程中加载。
-
drop_last (False): 这个参数决定了是否丢弃最后一个不完整的批次。
True
,丢弃;False
,保留。
神经网络的基本骨架-nn.Module的使用
在PyTorch中,nn.Module
是所有神经网络模块的基类,它为神经网络提供了一个基本的骨架。通过继承nn.Module
并定义自己的神经网络层,可以构建出各种复杂的神经网络模型。
基本步骤
-
定义神经网络类:
继承nn.Module
,并在类中定义网络层。class Net(nn.Module): def __init__(self): super(Net, self).__init__() def forward(self, input): output = input+1 return output
-
实例化网络并训练:
net = Net() x = torch.tensor(1.0) output = net(x) print(output)
卷积操作
在深度学习中,特别是在卷积神经网络(CNN)中,卷积操作主要用于图像处理领域,用于提取图像中的特征。
代码案例:略(在我的文件里有)
参数介绍:
-
input:输入数据,通常是一个四维张量(Tensor),形状为
(N, C_, H, W)
,N
是批量大小(batch size),C
是通道数,H
是高度,W
是宽度。 -
weight(
kernel
):卷积核,是一个四维张量,形状为(out_channels, C/groups, kH, kW)
,out_channels
是输出通道数,C/groups
是每个卷积核的输入通道数(如果使用了分组卷积,则为每个组的输入通道数),kH
和kW
分别是卷积核的高度和宽度。 -
bias=None:每个输出通道的可选偏置项。如果提供了偏置项,它应该是一个一维张量,形状为
(out_channels,)
。在默认情况下,不添加偏置项(即bias=None
)。 -
dilation=1:卷积核元素之间的间距。
-
groups=1:控制输入和输出之间的连接。
groups
参数将输入和输出通道分成groups
个组,并且每个组的输入通道仅与对应组的输出通道连接。这可以用于实现分组卷积,其中每个输入通道组仅与对应的输出通道组进行卷积。
神经网络-卷积层
卷积层是卷积神经网络(CNN)中的核心组件,它通过卷积运算对输入数据进行特征提取。
代码案例:略(在我的文件里有)
参数介绍:
Conv2d
是二维卷积层的一个类
-
in_channels=3:指定了输入数据的通道数。
-
out_channels=6:指定了卷积层输出的通道数,也就是卷积层将会使用多少个卷积核。
-
kernel_size=3:定义了卷积核的大小。
-
stride=1:这个参数指定了卷积核在特征图上滑动的步长。
-
padding=0:这个参数指定了在输入数据的周围需要填充多少层零(或其他值)。
最大池化(Max Pooling)
是一种常用的下采样技术,主要用于减少数据,保留重要特征,减少计算量,并有助于防止过拟合。
最大池化的参数
通过MaxPool2d
等函数实现,其主要参数包括:
- kernel_size:池化核的大小。
- stride:池化核的步长,即池化核在输入特征图上移动的距离。默认值为
kernel_size
,即池化核每次移动与自身大小相同的距离。 - padding:在输入特征图的边界上填充的零的层数。
- dilation:空洞卷积的参数,用于控制池化核内元素之间的距离。
- ceil_mode:当设置为
True
时,输出特征图的大小将使用向上取整的方式计算,否则使用向下取整。
代码案例:略(在我的文件里有)
非线性激活函数
一、非线性激活函数的作用
没有激活函数的神经网络实际上是线性可加的,那么多线性层其实可以归为一层。只具有线性的神经网络表达能力极其有限。
提高泛化能力
(我的理解)激活以后直线就变弯了,很多弯曲的线可以拟合十分复杂的曲线。不激活的话,再多直线变来变去还是直线,还是只有原来那点能力
二、常见的非线性激活函数
- ReLU
- 公式:f(x) = max(0, x)
- 特点:当输入为正数时,输出等于输入;当输入为负数时,输出为0。
- Sigmoid
- 公式:f(x) = 1 / (1 + e^(-x))
- 特点:Sigmoid函数将输入映射到(0, 1)区间内,这使得它非常适合用于二分类问题的输出层。
当图像三个通道的取值都是0-255,用relu等于没有变化,用sigmoid才能映射到0-1的区间。
线性层(Linear Layer)
线性层(全连接层)它的主要作用是对输入数据进行线性变换,即通过矩阵乘法和加上偏置来实现。
线性层在神经网络中的位置比较灵活,既可以作为输入层与隐藏层之间的连接,也可以作为隐藏层与输出层之间的连接。
代码案例:略(在我的文件里有)
参数介绍:
-
输入特征数 (
in_features=196608
):这是该层期望的输入张量的最后一个维度的大小。在这个例子中,它期望输入张量的形状类似于[batch_size, 196608]
,其中batch_size
是批量中样本的数量,而196608
是每个样本的特征数。 -
输出特征数 (
out_features=10
):这是该层输出的特征数,也是输出张量最后一个维度的大小。10
对应于输出的特征数。 -
线性层工作: 它接受一个输入张量
x{
形状为[batch_size, in_features]},
通过矩阵乘法和加上偏置bias
来计算输出 {输出的形状将是[batch_size, out_features]}
。
常见的其他层:Recurrent Layer(循环层)、Transformer Layer、Spare Layer(稀疏层)、输入层(Input Layer)、隐藏层(Hidden Layer)、卷积层(Convolutional Layer)、池化层(Pooling Layer)、输出层(Output Layer)。