Loading... ### 1 import ```python import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor ``` #### 1.1 `torch` 包包含用于多维张量的数据结构,并定义了对这些张量的数学运算。此外,它还提供了许多用于高效序列化张量和任意类型的实用程序,以及其他有用的实用程序。 #### 1.2 `torch.nn`是图的基本构建块。 #### 1.3 `torch.utils.data` 是 `PyTorch`提供的一个模块,用于处理和加载数据。该模块提供了一系列工具类和函数,用于创建、操作和批量加载数据集。 下面是 `torch.utils.data` 模块中一些常用的类和函数: `Dataset`: 定义了抽象的数据集类,用户可以通过继承该类来构建自己的数据集。Dataset 类提供了两个必须实现的方法:__getitem__ 用于访问单个样本,__len__ 用于返回数据集的大小。 `TensorDataset`: 继承自 Dataset 类,用于将张量数据打包成数据集。它接受多个张量作为输入,并按照第一个输入张量的大小来确定数据集的大小。 `DataLoader`: 数据加载器类,用于批量加载数据集。它接受一个数据集对象作为输入,并提供多种数据加载和预处理的功能,如设置批量大小、多线程数据加载和数据打乱等。 `Subset`: 数据集的子集类,用于从数据集中选择指定的样本。 `random_split`: 将一个数据集随机划分为多个子集,可以指定划分的比例或指定每个子集的大小。 `ConcatDataset`: 将多个数据集连接在一起形成一个更大的数据集。 `get_worker_info`: 获取当前数据加载器所在的进程信息。 #### 1.4 `torchvision.datasets`中是数据集,包含了以下数据集 * MNIST * COCO(用于图像标注和目标检测)(Captioning and Detection) * LSUN Classification * ImageFolder * Imagenet-12 * CIFAR10 and CIFAR100 * STL10 #### 1.5 `toTensor`的作用是把灰度范围从0-255变换到0-1之间 ### 2 Prepare dataset #### 2.1 下载训练数据集和测试数据集 ```python # Download training data from open datasets. training_data = datasets.FashionMNIST( root="data", train=True, download=True, transform=ToTensor(), ) # Download test data from open datasets. test_data = datasets.FashionMNIST( root="data", train=False, download=True, transform=ToTensor(), ) ``` #### 2.2 使用DataLoader创建数据加载器 ```python batch_size = 64 # Create data loaders. train_dataloader = DataLoader(training_data, batch_size=batch_size) test_dataloader = DataLoader(test_data, batch_size=batch_size) for X, y in test_dataloader: print(f"Shape of X [N, C, H, W]: {X.shape}") print(f"Shape of y: {y.shape} {y.dtype}") break ``` 以下是 `torch.utils.data.DataLoader` 的常用参数和功能: ```python DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, *, prefetch_factor=2, persistent_workers=False) ``` `dataset`: 数据集对象,可以是 `torch.utils.data.Dataset` 的子类对象。 `batch_size`: 每个批次的样本数量,默认为 1。 `shuffle`: 是否对数据进行打乱,默认为 `False`。在每个 epoch 时会重新打乱数据。 `num_workers`: 使用多少个子进程加载数据,默认为 0,表示在主进程中加载数据。其实在Windows系统里面都设置为0,但是在Linux中可以设置成大于0的数。 `collate_fn`: 在返回批次数据之前,对每个样本进行处理的函数。如果为 `None`,默认使用 `torch.utils.data._utils.collate.default_collate`函数进行处理。 `drop_last`: 是否丢弃最后一个样本数量不足一个批次的数据,默认为 `False`。 `pin_memory`: 是否将加载的数据存放在 CUDA 对应的固定内存中,默认为 `False`。 `prefetch_factor`: 预取因子,用于预取数据到设备,默认为 2。 `persistent_workers`: 如果为 `True`,则在每个 epoch 中使用持久的子进程进行数据加载,默认为 `False`。 ### 3 创建网络 ```python # Define model class NeuralNetwork(nn.Module): def __init__(self): super().__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10) ) def forward(self, x): x = self.flatten(x) logits = self.linear_relu_stack(x) return logits model = NeuralNetwork().to(device) ``` #### 3.1 Torch.nn ##### 容器 Module : 所有神经网络模块的基类 Sequential :一个顺序容器 ModuleList:在列表中保存子模块 ModuleDict:在字典中保存子模块 ParameterList:在列表中保存参数 ParameterDict:在字典中保存参数 ##### 卷积层 nn.Conv1d:一维卷积层,在PyTorch中,*nn.Conv1d*是一维卷积层的实现,它对输入数据进行卷积运算,常用于处理时间序列数据或一维空间序列(例如文本数据)。一维卷积层通过在输入数据上滑动卷积核(或滤波器)来提取特征。在PyTorch中,*nn.Conv1d*的参数定义了卷积操作的各个方面,包括输入通道数(*in\_channels*)、输出通道数(*out\_channels*)、卷积核大小(*kernel\_size*)、步长(*stride*)、填充(*padding*)、膨胀(*dilation*)、分组(*groups*)以及是否使用偏置(*bias*)。 <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-14140b4fbf147822fdb195e57f6da05617" aria-expanded="true"><div class="accordion-toggle"><span style="">示例</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-14140b4fbf147822fdb195e57f6da05617" class="collapse collapse-content"><p></p> 以下是一个*nn.Conv1d*的简单示例,展示了如何在PyTorch中定义和使用一维卷积层: ```python import torch import torch.nn as nn # 定义一维卷积层 conv1d = nn.Conv1d(in\_channels=256, out\_channels=100, kernel\_size=2) # 创建一个随机数据作为输入 input\_data = torch.randn(32, 256, 35) # batch\_size x in\_channels x sequence\_length # 调整输入数据的维度以匹配卷积层的期望格式 input\_data = input\_data.permute(0, 2, 1) # batch\_size x sequence\_length x in\_channels # 应用一维卷积 output = conv1d(input\_data) # 输出结果的维度 print(output.size()) # 输出: torch.Size([32, 100, 34]) ``` 在这个例子中,输入数据的维度是*(32, 256, 35)*,其中32是批次大小,256是输入通道数,35是序列长度。卷积层的输出通道数设置为100,卷积核大小为2。在应用卷积之前,输入数据的维度需要调整,以确保序列长度维度在最后。最终输出的维度是*(32, 100, 34)*,其中32是批次大小,100是输出通道数,34是经过卷积操作后的序列长度。 注意: * **输入格式**:*nn.Conv1d*期望的输入格式为*(batch\_size, in\_channels, sequence\_length)*,但在实际应用中,可能需要调整输入数据的维度以匹配这一格式。 * **输出维度**:输出的维度可以通过卷积层的参数和输入数据的维度计算得出。输出序列长度的计算公式为:*L\_out = (L\_in + 2 \* padding - dilation \* (kernel\_size - 1) - 1) / stride + 1*。 * **性能考虑**:在某些情况下,为了提高性能,PyTorch可能会选择非确定性的算法。如果需要确定性结果,可以设置*torch.backends.cudnn.deterministic = True*。 一维卷积在处理文本分类等任务时非常有用,因为它能够捕捉序列数据中的局部特征。通过调整*nn.Conv1d*的参数,可以实现不同的卷积操作,以适应特定的应用需求。 <p></p></div></div></div> nn.Conv2d:二维卷积层 nn.Conv3d:三维卷积层 nn.ConvTranspose1d: ### 参考资料 [torch.nn — PyTorch 2.5 文档 - PyTorch 中文](https://pytorch.ac.cn/docs/stable/nn.html#convolution-layers) [Pytorch的torch.utils.data中Dataset以及DataLoader等详解\_torch.utils.data.dataloader-CSDN博客](https://blog.csdn.net/m0_63007797/article/details/132385283) 最后修改:2024 年 10 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏