内部卷网站怎么做的关注公众号赚钱

当前位置: 首页 > news >正文

内部卷网站怎么做的,关注公众号赚钱,网站基础建设,华宇网站建设PyTorch#xff08;一#xff09;模型训练过程 #c 总结 实践总结 该实践从「数据处理」开始到最后利用训练好的「模型」预测#xff0c;感受到了整个模型的训练过程。其中也有部分知识点#xff0c;例如定义神经网络#xff0c;只是初步的模仿#xff0c;有一个比较浅的…PyTorch一模型训练过程 #c 总结 实践总结 该实践从「数据处理」开始到最后利用训练好的「模型」预测感受到了整个模型的训练过程。其中也有部分知识点例如定义神经网络只是初步的模仿有一个比较浅的认识还需要继续学习原理。 整个流程 「准备数据」「创建数据加载器」「选择训练设备」「定义神经网络」「定义损失函数和优化器」「定义训练和测试函数」「迭代训练」「保存模型」「加载模型」「模型预测」。 相关知识点 1.Dataset与DataLoader 2.迭代器 3.模型定义 4.损失函数与优化器 5.模型训练与测试 6.模型保存加载与预测 1 数据处理 #d Dataset与DataLoader 在处理数据时PyTorch有两个基本的原语来与数据交互torch.utils.data.DataLoader 和 torch.utils.data.Dataset。Dataset 用于存储样本以及它们相应的标签而 DataLoader 围绕 Dataset 封装了一个「迭代器」。 Dataset 类通常用来定义数据集它包含了数据和标签。而 DataLoader 类则是用来批量加载数据集支持自动加载、打乱数据、多线程加载等功能使得数据的加载更加高效和灵活。 #e 导入库 Dataset与DataLoader import torch from torch import nn# 神经网络模块 from torch.utils.data import DataLoader# 数据加载器 from torchvision import datasets# 数据集 from torchvision.transforms import ToTensor# 图像转换为张量#c 补充 特定领域库 Dataset与DataLoader PyTorch 提供了特定领域的库比如 TorchText、TorchVision 和 TorchAudio它们都包含了Dataset。torchvision.datasets 模块包含了许多现实世界视觉数据集的 Dataset 对象例如 CIFAR、COCO。每个 TorchVision 的Dataset都包括两个参数transform 和 target_transform它们分别用来修改样本和标签。 #d 迭代器Iterable 迭代器Iterable是一种允许程序员遍历一个容器特别是列表等序列类型的对象。在Python中迭代器遵循迭代协议即它们实现了iter()方法该方法返回一个迭代器对象本身这个对象还需要实现next()方法该方法在每次迭代时返回容器中的下一个项目。通过提供一种统一、高效、按需处理数据的方式极大地简化了数据遍历和处理的复杂性。 「迭代器」解决的问题 统一的遍历接口迭代器提供了一种统一的方法来遍历各种类型的数据容器如列表、元组、字典等而不需要知道容器的内部结构。内存效率迭代器允许按需遍历元素而不是一次性将所有元素加载到内存中。这对于遍历大数据集特别有用因为它可以显著减少程序的内存使用。惰性计算迭代器支持惰性计算这意味着数据元素是在需要时才被计算和返回而不是在迭代器创建时。这可以提高计算效率特别是在处理复杂或无限的数据序列时。 没有「迭代器」的影响 遍历复杂性增加没有迭代器程序员需要为不同类型的数据结构编写不同的遍历代码这不仅增加了开发的复杂性也降低了代码的可重用性。内存效率降低在处理大型数据集时可能需要一次性将所有数据加载到内存中这会导致显著的内存消耗甚至可能导致内存不足的错误。减少惰性计算的机会没有迭代器机制很难实现按需计算数据元素的逻辑这可能导致不必要的计算开销特别是在只需要数据集一小部分或者在数据集很大时。 #e 吃自助餐 迭代器 想象一下你在一家餐厅吃自助餐。自助餐提供了一个装满不同菜肴的长桌子你拿着一个盘子从一端开始挨个检查每种菜肴决定是否将其加入你的盘子。在这个过程中你顾客就像一个迭代器而长桌子上的菜肴就像是一个可迭代的容器。你一次检查一个菜肴直到遍历完所有的菜肴或者你的盘子满了为止。 #e 迭代访问列表 迭代器 假设我们有一个列表Listnumbers [1, 2, 3, 4, 5]使用iter(numbers)创建了一个迭代器它能够遍历列表numbers中的每个元素。使用next(iterator)可以获取容器中的下一个元素。当所有元素都被遍历完毕时next()会抛出一个StopIteration异常表示没有更多元素可以访问这时我们结束循环。 numbers [1, 2, 3, 4, 5] # 可迭代的容器 iterator iter(numbers) # 创建迭代器while True:try:# 使用next()获取下一个元素number next(iterator)print(number)except StopIteration:# 如果所有元素都遍历完毕则结束循环break#c 关联 相关概念 「迭代器」影响的「概念」 可迭代对象Iterable任何实现了iter()方法的对象都是可迭代的该方法需要返回一个迭代器对象。迭代器本身也是可迭代的因为它实现了iter()方法并返回自身。 生成器Generator生成器是一种特殊类型的迭代器它使用函数加上yield语句来实现无需手动实现iter()和next()方法。生成器简化了迭代器的创建过程直接受到了迭代器概念的启发。 循环Loops例如for循环和while循环在Python中for循环内部实际上使用迭代器来遍历可迭代对象。 函数式编程工具如map()、filter()和reduce()等函数它们接受一个函数和一个可迭代对象作为输入内部通过迭代器遍历可迭代对象。
影响「迭代器」的概念 面向对象编程OOP迭代器模式是面向对象设计模式的一部分要求对象实现特定的接口如Python中的iter()和next()方法。面向对象的概念提供了迭代器实现的框架。 惰性计算Lazy Evaluation惰性计算是指仅在真正需要计算结果时才进行计算。迭代器天然支持惰性计算因为它们一次只处理集合中的一个元素。 函数式编程Functional Programming函数式编程强调使用函数来处理数据。迭代器与函数式编程紧密相关因为迭代器提供了一种遍历和处理数据集合的方法而不改变数据本身这与函数式编程的不可变性原则相吻合。
#c 说明 数据集的选择 本次实践使用 FashionMNIST 数据集。该数据集是一个用于衣物识别的数据集由Zalando一家欧洲的在线时尚零售商提供。它被设计为原始MNIST数据集的直接替代品用于在机器学习和计算机视觉领域的基准测试中。FashionMNIST包含了10个类别的衣物图片每个类别有7000张图片整个数据集分为60000张训练图片和10000张测试图片。每张图片都是28x28像素的灰度图。这些类别包括 T-shirt/topT恤/上衣Trouser裤子Pullover套衫Dress连衣裙Coat外套Sandal凉鞋Shirt衬衫Sneaker运动鞋Bag包Ankle boot短靴 #e 下载数据集 数据集的选择 如果是自行搜集数据比如利用爬虫获取自己想要的数据获取的数据需要进行「数据处理」例如「删除不符合数据」「统一数据格式」「去重」等方式。这里下载的数据已经是符合训练的数据格式所以不需要进行对应的数据处理的环节。

下载训练数据集

train_data datasets.FashionMNIST(rootdata, # 数据存储的路径trainTrue, # 指定下载的是训练数据集downloadTrue, # 如果数据不存在则通过网络下载transformToTensor() # 将图片转换为Tensor )# 下载测试数据集 test_data datasets.FashionMNIST(rootdata, # 数据存储的路径trainFalse, # 指定下载的是测试数据集downloadTrue, # 如果数据不存在则通过网络下载transformToTensor() # 将图片转换为Tensor )#d 数据加载 将 Dataset 作为参数传递给 DataLoader。DataLoader在dataset封装一个可迭代对象并且支持自动批处理、采样、多进程数据加载等。 #e 加载代码 数据加载 在这里定义了一个批量大小为64即 dataloader 可迭代对象中的每个元素将返回一个包含64个特征和标签的批次。 batch_size 64# 批大小# 创建数据加载器 train_dataloader DataLoader(train_data, batch_sizebatch_size) #将dataset作为参数传入DataLoaderDataLoader会自动将数据分批打乱数据将数据加载到内存中 test_dataloader DataLoader(test_data, batch_sizebatch_size)for x,y in test_dataloader:print(fShape of x [N, C, H, W]: {x.shape})#x.shape是一个4维张量第一个维度是批大小第二个维度是通道数第三和第四维度是图像的高度和宽度print(fShape of y: {y.shape}, {y.dtype})Shape of x [N, C, H, W]: torch.Size([64, 1, 28, 28])Shape of y: torch.Size([64]), torch.int64break2 创建模型 #d 定义模型 在PyTorch中定义神经网络需创建一个继承自nn.Module的类并在init函数中定义神经网络的层在forward函数中定义数据在神经网络中的传播路径。为了加速神经网络的训练可以使用GPU或者MPS来训练模型。 #e 定义代码 定义模型 #使用cpugpumps的设备来训练模型 device (cudaif torch.cuda.is_available()else mpsif torch.backends.mps.is_available()else cpu ) print(fUsing {device} device) #Using cuda deviceclass NeuralNetwork(nn.Module):def init(self):#定义神经网络的层super().init()#调用父类的构造函数self.flatten nn.Flatten()#将28*28的图像展平为784的向量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)#将模型加载到设备上 print(model)NeuralNetwork((flatten): Flatten(start_dim1, end_dim-1)(linear_relu_stack): Sequential((0): Linear(in_features784, out_features512, biasTrue)(1): ReLU()(2): Linear(in_features512, out_features512, biasTrue)(3): ReLU()(4): Linear(in_features512, out_features10, biasTrue)) )3 优化模型参数 #d 定义训练参数 在训练模型之前需要定义「损失函数loss function」[ 和「优化器(optimizer)」。概念解释5 相关概念 在单个训练循环中模型会对分批提供它的「训练数据集」进行「预测」并通过「反向传播算法」预测误差以调整模型的参数。 检查模型在测试数据集上的性能以确保它在学习. 训练过程在多个迭代周期中进行。在每个周期中模型学习参数以做出更好的预测。在每个周期打印模型的准确率和损失希望看到准确率随着每个周期的增加而提高损失随着每个周期的减少。
#e 损失函数与优化器 loss_fn nn.CrossEntropyLoss()#使用交叉熵损失函数 #使用随机梯度下降优化器,model.parameters()返回模型的参数lr1e-3是学习率 optimizer torch.optim.SGD(model.parameters(), lr1e-3)#e 训练函数 def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset)#数据集的大小model.train()#将模型设置为训练模式for batch, (X, y) in enumerate(dataloader):#遍历数据集X, y X.to(device), y.to(device)#将数据加载到设备上# 计算预测误差pred model(X)#对输入的数据进行预测loss loss_fn(pred, y)#计算损失差异越小模型预测的越准确# 反向传播loss.backward()#反向传播算法optimizer.step()#优化器更新模型参数optimizer.zero_grad()#梯度清零if batch % 100 0:#每100个批次打印一次loss, current loss.item(), (batch1) * len(X)#打印损失和当前的批次的数据量print(floss: {loss:7f} [{current:5d}/{size:5d}]){loss:7f}表示损失值以浮点数形式打印总宽度为7位右对齐。{current:5d}表示当前处理的总数据量以整数形式打印总宽度为5位右对齐。{size:5d}表示整个数据集的大小以整数形式打印总宽度为5位右对齐#e 测试函数 def test(dataloader, model, loss_fn):size len(dataloader.dataset)#数据集的大小num_batches len(dataloader)#批次的数量model.eval()#将模型设置为评估模式test_loss, correct 0, 0#初始化损失和正确的数量with torch.no_grad():#关闭梯度计算for X, y in dataloader:X, y X.to(device), y.to(device)#将数据加载到设备上pred model(X)#对输入的数据进行预测test_loss loss_fn(pred, y).item()#计算损失correct (pred.argmax(1) y).type(torch.float).sum().item()#计算正确的数量pred.argmax(1)找出每个预测中概率最高的类别的索引 y判断这些索引是否与真实标签相等。结果是一个布尔Tensor通过.type(torch.float)转换为浮点数Tensor然后使用.sum().item()计算并累加正确预测的总数。test_loss / num_batches#计算平均损失correct / size#计算正确率print(fTest Error: \n Accuracy: {(100*correct):0.1f}%, Avg loss: {test_loss:8f} \n) #e 迭代训练 epochs 5#迭代次数 for t in range(epochs):print(fEpoch {t1}\n——————————-)train(train_dataloader, model, loss_fn, optimizer)#训练模型test(test_dataloader, model, loss_fn)#测试模型 print(Done!)#训练完成运行结果

Epoch 1

loss: 2.304268 [ 6460000] loss: 2.284021 [ 646460000] loss: 2.263621 [1286460000] loss: 2.259448 [1926460000] loss: 2.231920 [2566460000] loss: 2.221592 [3206460000] loss: 2.215944 [3846460000] loss: 2.191191 [4486460000] loss: 2.177027 [5126460000] loss: 2.141848 [5766460000]

Test Error: Accuracy: 58.7%, Avg loss: 2.137664Epoch 2

loss: 2.147467 [ 6460000] loss: 2.139907 [ 646460000] loss: 2.077062 [1286460000] loss: 2.094236 [1926460000] loss: 2.030329 [2566460000] loss: 1.982215 [3206460000] loss: 1.997371 [3846460000] loss: 1.923110 [4486460000] loss: 1.913458 [5126460000] loss: 1.835431 [5766460000] Test Error: Accuracy: 61.3%, Avg loss: 1.8397744 模型的保存 #d 保存方式 保存模型的一种常见方法是序列化内部状态字典包含模型参数。 #e 实现代码 保存方式 torch.save(model.state_dict(), ./model.pth) print(Saved PyTorch Model State to ./model.pth)Saved PyTorch Model State to ./model.pth5 模型加载与预测 #d 加载流程 加载模型的过程包括重新创建模型结构并将状态字典加载到其中。 #e 加载代码 加载流程 model NeuralNetwork().to(device)#创建模型,to(device)将模型加载到设备上 model.load_state_dict(torch.load(./model.pth))#加载模型#e 预测代码 #利用模型进行预测 classes [T-shirt/top,Trouser,Pullover,Dress,Coat,Sandal,Shirt,Sneaker,Bag,Ankle boot, ] model.eval()#将模型设置为评估模式 x, y test_data[0][0], test_data[0][1]#获取测试数据 with torch.no_grad():#关闭梯度计算pred model(x.to(device))#对输入的数据进行预测predicted, actual classes[pred[0].argmax(0)], classes[y]#获取预测的类别和真实的类别print(fPredicted: {predicted}, Actual: {actual})Predicted: Ankle boot, Actual: Ankle boot#c 备注 完整python文件 AI_series_learn/PyTorch/1.快速开始/basic.py at main · togetherhkl/AI_series_learn (github.com)