自学网站编程邢台网站建设联系电话

张小明 2026/1/12 9:20:54
自学网站编程,邢台网站建设联系电话,个人简历网页简单模板,栖霞建设采购网站一、数据增强 在图像数据预处理环节#xff0c;为提升数据多样性#xff0c;可采用数据增强#xff08;数据增广#xff09;策略。该策略通常不改变单次训练的样本总数#xff0c;而是通过对现有图像进行多样化变换#xff0c;使每次训练输入的样本呈现更丰富的形态差异…一、数据增强在图像数据预处理环节为提升数据多样性可采用数据增强数据增广策略。该策略通常不改变单次训练的样本总数而是通过对现有图像进行多样化变换使每次训练输入的样本呈现更丰富的形态差异从而有效扩展模型训练的样本空间多样性。常见的修改策略包括以下几类1. 几何变换如旋转、缩放、平移、剪裁、裁剪、翻转2. 像素变换如修改颜色、亮度、对比度、饱和度、色相、高斯模糊模拟对焦失败、增加噪声、马赛克3. 语义增强暂时不用mixup对图像进行结构性改造、cutout随机遮挡等此外在数据极少的场景长常常用生成模型来扩充数据集如GAN、VAE等。import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np # 设置中文字体支持 plt.rcParams[font.family] [SimHei] plt.rcParams[axes.unicode_minus] False # 解决负号显示问题 # 检查GPU是否可用 device torch.device(cuda if torch.cuda.is_available() else cpu) print(f使用设备: {device}) # 1. 数据预处理 # 训练集使用多种数据增强方法提高模型泛化能力 train_transform transforms.Compose([ # 随机裁剪图像从原图中随机截取32x32大小的区域 transforms.RandomCrop(32, padding4), # 随机水平翻转图像概率0.5 transforms.RandomHorizontalFlip(), # 随机颜色抖动亮度、对比度、饱和度和色调随机变化 transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2, hue0.1), # 随机旋转图像最大角度15度 transforms.RandomRotation(15), # 将PIL图像或numpy数组转换为张量 transforms.ToTensor(), # 标准化处理每个通道的均值和标准差使数据分布更合理 transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)) ]) # 测试集仅进行必要的标准化保持数据原始特性标准化不损失数据信息可还原 test_transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)) ]) # 2. 加载CIFAR-10数据集 train_dataset datasets.CIFAR10( root./data, trainTrue, downloadTrue, transformtrain_transform # 使用增强后的预处理 ) test_dataset datasets.CIFAR10( root./data, trainFalse, transformtest_transform # 测试集不使用增强 ) # 3. 创建数据加载器 batch_size 64 train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)二、CNN模型卷积的本质通过卷积核在输入通道上的滑动乘积提取跨通道的空间特征。所以只需要定义几个参数即可1. 卷积核大小卷积核的大小如3x3、5x5、7x7等。2. 输入通道数输入图片的通道数如1单通道图片、3RGB图片、4RGBA图片等。3. 输出通道数卷积核的个数即输出的通道数。如本模型中通过 32→64→128 逐步增加特征复杂度4. 步长stride卷积核的滑动步长默认为1。# 4. 定义CNN模型的定义替代原MLP class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() # 继承父类初始化 # ---------------------- 第一个卷积块 ---------------------- # 卷积层1输入3通道RGB输出32个特征图卷积核3x3边缘填充1像素 self.conv1 nn.Conv2d( in_channels3, # 输入通道数图像的RGB通道 out_channels32, # 输出通道数生成32个新特征图 kernel_size3, # 卷积核尺寸3x3像素 padding1 # 边缘填充1像素保持输出尺寸与输入相同 ) # 批量归一化层对32个输出通道进行归一化加速训练 self.bn1 nn.BatchNorm2d(num_features32) # ReLU激活函数引入非线性公式max(0, x) self.relu1 nn.ReLU() # 最大池化层窗口2x2步长2特征图尺寸减半32x32→16x16 self.pool1 nn.MaxPool2d(kernel_size2, stride2) # stride默认等于kernel_size # ---------------------- 第二个卷积块 ---------------------- # 卷积层2输入32通道来自conv1的输出输出64通道 self.conv2 nn.Conv2d( in_channels32, # 输入通道数前一层的输出通道数 out_channels64, # 输出通道数特征图数量翻倍 kernel_size3, # 卷积核尺寸不变 padding1 # 保持尺寸16x16→16x16卷积后→8x8池化后 ) self.bn2 nn.BatchNorm2d(num_features64) self.relu2 nn.ReLU() self.pool2 nn.MaxPool2d(kernel_size2) # 尺寸减半16x16→8x8 # ---------------------- 第三个卷积块 ---------------------- # 卷积层3输入64通道输出128通道 self.conv3 nn.Conv2d( in_channels64, # 输入通道数前一层的输出通道数 out_channels128, # 输出通道数特征图数量再次翻倍 kernel_size3, padding1 # 保持尺寸8x8→8x8卷积后→4x4池化后 ) self.bn3 nn.BatchNorm2d(num_features128) self.relu3 nn.ReLU() # 复用激活函数对象节省内存 self.pool3 nn.MaxPool2d(kernel_size2) # 尺寸减半8x8→4x4 # ---------------------- 全连接层分类器 ---------------------- # 计算展平后的特征维度128通道 × 4x4尺寸 128×162048维 self.fc1 nn.Linear( in_features128 * 4 * 4, # 输入维度卷积层输出的特征数 out_features512 # 输出维度隐藏层神经元数 ) # Dropout层训练时随机丢弃50%神经元防止过拟合 self.dropout nn.Dropout(p0.5) # 输出层将512维特征映射到10个类别CIFAR-10的类别数 self.fc2 nn.Linear(in_features512, out_features10) def forward(self, x): # 输入尺寸[batch_size, 3, 32, 32]batch_size批量大小3通道数32x32图像尺寸 # ---------- 卷积块1处理 ---------- x self.conv1(x) # 卷积后尺寸[batch_size, 32, 32, 32]padding1保持尺寸 x self.bn1(x) # 批量归一化不改变尺寸 x self.relu1(x) # 激活函数不改变尺寸 x self.pool1(x) # 池化后尺寸[batch_size, 32, 16, 16]32→16是因为池化窗口2x2 # ---------- 卷积块2处理 ---------- x self.conv2(x) # 卷积后尺寸[batch_size, 64, 16, 16]padding1保持尺寸 x self.bn2(x) x self.relu2(x) x self.pool2(x) # 池化后尺寸[batch_size, 64, 8, 8] # ---------- 卷积块3处理 ---------- x self.conv3(x) # 卷积后尺寸[batch_size, 128, 8, 8]padding1保持尺寸 x self.bn3(x) x self.relu3(x) x self.pool3(x) # 池化后尺寸[batch_size, 128, 4, 4] # ---------- 展平与全连接层 ---------- # 将多维特征图展平为一维向量[batch_size, 128*4*4] [batch_size, 2048] x x.view(-1, 128 * 4 * 4) # -1自动计算批量维度保持批量大小不变 x self.fc1(x) # 全连接层2048→512尺寸变为[batch_size, 512] x self.relu3(x) # 激活函数复用relu3与卷积块3共用 x self.dropout(x) # Dropout随机丢弃神经元不改变尺寸 x self.fc2(x) # 全连接层512→10尺寸变为[batch_size, 10]未激活直接输出logits return x # 输出未经过Softmax的logits适用于交叉熵损失函数 # 初始化模型 model CNN() model model.to(device) # 将模型移至GPU如果可用上述定义CNN模型中1. 使用三层卷积池化结构提取图像特征2. 每层卷积后添加BatchNorm加速训练并提高稳定性3. 使用Dropout减少过拟合可以把全连接层前面的不理解为神经网络的一部分单纯理解为特征提取器他们的存在就是帮助模型进行特征提取的。2.1 batch归一化Batch 归一化是深度学习中常用的一种归一化技术加速模型收敛并提升泛化能力。通常位于卷积层后。卷积操作常见流程如下1. 输入 → 卷积层 → Batch归一化层可选 → 池化层 → 激活函数 → 下一层2. Flatten - Dense (with Dropout可选) - Dense (Output)其中BatchNorm 应在池化前对空间维度的特征完成归一化以确保归一化统计量基于足够多的样本空间位置避免池化导致的统计量偏差旨在解决深度神经网络训练中的内部协变量偏移问题深层网络中随着前层参数更新后层输入分布会发生变化导致模型需要不断适应新分布训练难度增加。就好比你在学新知识知识体系的基础一直在变你就得不断重新适应模型训练也是如此这就导致训练变得困难这就是内部协变量偏移问题。通过对每个批次的输入数据进行标准化均值为 0、方差为 1想象把一堆杂乱无章、分布不同的数据规整到一个标准的样子。1. 使各层输入分布稳定让数据处于激活函数比较合适的区域缓解梯度消失 / 爆炸问题;2. 因为数据分布稳定了所以允许使用更大的学习率提升训练效率。深度学习的归一化有2类1. Batch Normalization一般用于图像数据因为图像数据通常是批量处理有相对固定的 Batch Size 能利用 Batch 内数据计算稳定的统计量均值、方差 来做归一化。2. Layer Normalization一般用于文本数据本数据的序列长度往往不同像不同句子长短不一很难像图像那样固定 Batch Size 。如果用 Batch 归一化不同批次的统计量波动大效果不好。层归一化是对单个样本的所有隐藏单元进行归一化不依赖批次。ps这个操作在结构化数据中其实是叫做标准化但是在深度学习领域习惯把这类对网络中间层数据进行调整分布的操作都叫做归一化 。2.2 特征图卷积层输出的叫做特征图通过输入尺寸和卷积核的尺寸、步长可以计算出输出尺寸。可以通过可视化中间层的特征图理解 CNN 如何从底层特征如边缘逐步提取高层语义特征如物体部件、整体结构。MLP是不输出特征图的因为他输出的一维向量无法保留空间维度2.3 调度器criterion nn.CrossEntropyLoss() # 交叉熵损失函数 optimizer optim.Adam(model.parameters(), lr0.001) # Adam优化器 # 引入学习率调度器在训练过程中动态调整学习率--训练初期使用较大的 LR 快速降低损失训练后期使用较小的 LR 更精细地逼近全局最优解。 # 在每个 epoch 结束后需要手动调用调度器来更新学习率可以在训练过程中调用 scheduler.step() scheduler optim.lr_scheduler.ReduceLROnPlateau( optimizer, # 指定要控制的优化器这里是Adam modemin, # 监测的指标是最小化如损失函数 patience3, # 如果连续3个epoch指标没有改善才降低LR factor0.5 # 降低LR的比例新LR 旧LR × 0.5 )ReduceLROnPlateau调度器适用于当监测的指标如验证损失停滞时降低学习率。是大多数任务的首选调度器尤其适合验证集波动较大的情况这种学习率调度器的方法相较于之前只有单纯的优化器是一种超参数的优化方法它通过调整学习率来优化模型。常见的优化器有 adam、SGD、RMSprop 等而除此之外学习率调度器有 lr_scheduler.StepLR、lr_scheduler.ExponentialLR、lr_scheduler.CosineAnnealingLR 等。可以把优化器和调度器理解为调参手段学习率是参数注意优化器如adam虽然也在调整学习率但是他的调整是相对值计算步长后根据基础学习率来调整。但是调度器是直接调整基础学习率。# 5. 训练模型记录每个 iteration 的损失 def train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs): model.train() # 设置为训练模式 # 记录每个 iteration 的损失 all_iter_losses [] # 存储所有 batch 的损失 iter_indices [] # 存储 iteration 序号 # 记录每个 epoch 的准确率和损失 train_acc_history [] test_acc_history [] train_loss_history [] test_loss_history [] for epoch in range(epochs): running_loss 0.0 correct 0 total 0 for batch_idx, (data, target) in enumerate(train_loader): data, target data.to(device), target.to(device) # 移至GPU optimizer.zero_grad() # 梯度清零 output model(data) # 前向传播 loss criterion(output, target) # 计算损失 loss.backward() # 反向传播 optimizer.step() # 更新参数 # 记录当前 iteration 的损失 iter_loss loss.item() all_iter_losses.append(iter_loss) iter_indices.append(epoch * len(train_loader) batch_idx 1) # 统计准确率和损失 running_loss iter_loss _, predicted output.max(1) total target.size(0) correct predicted.eq(target).sum().item() # 每100个批次打印一次训练信息 if (batch_idx 1) % 100 0: print(fEpoch: {epoch1}/{epochs} | Batch: {batch_idx1}/{len(train_loader)} f| 单Batch损失: {iter_loss:.4f} | 累计平均损失: {running_loss/(batch_idx1):.4f}) # 计算当前epoch的平均训练损失和准确率 epoch_train_loss running_loss / len(train_loader) epoch_train_acc 100. * correct / total train_acc_history.append(epoch_train_acc) train_loss_history.append(epoch_train_loss) # 测试阶段 model.eval() # 设置为评估模式 test_loss 0 correct_test 0 total_test 0 with torch.no_grad(): for data, target in test_loader: data, target data.to(device), target.to(device) output model(data) test_loss criterion(output, target).item() _, predicted output.max(1) total_test target.size(0) correct_test predicted.eq(target).sum().item() epoch_test_loss test_loss / len(test_loader) epoch_test_acc 100. * correct_test / total_test test_acc_history.append(epoch_test_acc) test_loss_history.append(epoch_test_loss) # 更新学习率调度器 scheduler.step(epoch_test_loss) print(fEpoch {epoch1}/{epochs} 完成 | 训练准确率: {epoch_train_acc:.2f}% | 测试准确率: {epoch_test_acc:.2f}%) # 绘制所有 iteration 的损失曲线 plot_iter_losses(all_iter_losses, iter_indices) # 绘制每个 epoch 的准确率和损失曲线 plot_epoch_metrics(train_acc_history, test_acc_history, train_loss_history, test_loss_history) return epoch_test_acc # 返回最终测试准确率 # 6. 绘制每个 iteration 的损失曲线 def plot_iter_losses(losses, indices): plt.figure(figsize(10, 4)) plt.plot(indices, losses, b-, alpha0.7, labelIteration Loss) plt.xlabel(IterationBatch序号) plt.ylabel(损失值) plt.title(每个 Iteration 的训练损失) plt.legend() plt.grid(True) plt.tight_layout() plt.show() # 7. 绘制每个 epoch 的准确率和损失曲线 def plot_epoch_metrics(train_acc, test_acc, train_loss, test_loss): epochs range(1, len(train_acc) 1) plt.figure(figsize(12, 4)) # 绘制准确率曲线 plt.subplot(1, 2, 1) plt.plot(epochs, train_acc, b-, label训练准确率) plt.plot(epochs, test_acc, r-, label测试准确率) plt.xlabel(Epoch) plt.ylabel(准确率 (%)) plt.title(训练和测试准确率) plt.legend() plt.grid(True) # 绘制损失曲线 plt.subplot(1, 2, 2) plt.plot(epochs, train_loss, b-, label训练损失) plt.plot(epochs, test_loss, r-, label测试损失) plt.xlabel(Epoch) plt.ylabel(损失值) plt.title(训练和测试损失) plt.legend() plt.grid(True) plt.tight_layout() plt.show() # 8. 执行训练和测试 epochs 20 # 增加训练轮次以获得更好效果 print(开始使用CNN训练模型...) final_accuracy train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs) print(f训练完成最终测试准确率: {final_accuracy:.2f}%) # # 保存模型 # torch.save(model.state_dict(), cifar10_cnn_model.pth) # print(模型已保存为: cifar10_cnn_model.pth)三、对模型进行调整# 实验2基础CNN StepLR固定步长衰减 model2 CNN_Base().to(device) criterion2 nn.CrossEntropyLoss() optimizer2 optim.Adam(model2.parameters(), lr0.001) scheduler2 optim.lr_scheduler.StepLR(optimizer2, step_size3, gamma0.5) # 每3epoch衰减50% print(\n 实验2基础CNN StepLR ) results_dict[基础CNNStepLR] train_model( model2, train_loader, test_loader, criterion2, optimizer2, scheduler2, device, epochs, 实验2 ) # 实验3轻量化CNN ReduceLROnPlateau model3 CNN_Light().to(device) criterion3 nn.CrossEntropyLoss() optimizer3 optim.Adam(model3.parameters(), lr0.001) scheduler3 optim.lr_scheduler.ReduceLROnPlateau(optimizer3, modemin, patience2, factor0.5) print(\n 实验3轻量化CNN ReduceLROnPlateau ) results_dict[轻量化CNNReduceLROnPlateau] train_model( model3, train_loader, test_loader, criterion3, optimizer3, scheduler3, device, epochs, 实验3 ) 各实验最终测试准确率汇总 基础CNNReduceLROnPlateau: 76.71% 基础CNNStepLR: 77.13% 轻量化CNNReduceLROnPlateau: 72.44%图 1不同配置下的 acc 对比横轴Epoch训练轮次从 1 到 10纵轴准确率模型预测正确的比例%曲线分组红色系基础 CNNStepLR训练 / 测试准确率提升最快最终测试准确率接近 76%表现最好蓝色系基础 CNNReduceLROnPlateau训练 / 测试准确率稳步提升最终测试准确率约 74%绿色系轻量化 CNNReduceLROnPlateau训练 / 测试准确率提升相对平缓最终测试准确率约 68%表现稍弱。图 2不同配置下的 loss 对比横轴Epoch训练轮次从 1 到 10纵轴损失值模型预测结果与真实值的误差值越小越好曲线分组红色系基础 CNNStepLR训练 / 测试损失下降最快最终测试损失最低和 acc 结果对应表现最优蓝色系基础 CNNReduceLROnPlateau训练 / 测试损失稳步下降最终测试损失略高于红色系绿色系轻量化 CNNReduceLROnPlateau训练 / 测试损失下降较慢且中间有波动最终测试损失最高和 acc 结果对应表现稍弱。结论在这 3 种配置中“基础 CNNStepLR” 的学习率策略效果最好训练过程中准确率提升快、损失下降明显最终测试集的准确率和损失都优于另外两种配置而 “轻量化 CNN” 虽然模型更简洁但性能略逊于基础 CNN 架构。勇闯python的第42天浙大疏锦行
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

html网站用什么空间运维网站制作

Navicat加密密码恢复工具使用手册 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 在数据库管理工作中,Navicat作为广受欢迎的工具软件&#x…

张小明 2026/1/9 6:54:18 网站建设

怎么创造软件app网站优化 seo

Qwen-Image-Lightning:8步极速文生图,消费级GPU轻松部署的AI绘画新标杆 【免费下载链接】Qwen-Image-Lightning 项目地址: https://ai.gitcode.com/hf_mirrors/lightx2v/Qwen-Image-Lightning 在AI绘画技术日新月异的今天,传统文生图…

张小明 2026/1/9 6:54:13 网站建设

网站收录优化携程: 2023年旅行搜索上涨超900%

Windows权限提升防护技术深度解析与最佳实践 【免费下载链接】UACME Defeating Windows User Account Control 项目地址: https://gitcode.com/gh_mirrors/ua/UACME 随着企业数字化转型的深入,Windows系统权限管理已成为网络安全防护的关键环节。Windows权限…

张小明 2026/1/10 23:17:36 网站建设

投资理财网站开发制作营销网

哔哩下载姬DownKyi:零基础也能轻松掌握的B站视频下载宝典 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&am…

张小明 2026/1/11 1:20:56 网站建设

简历免费在线制作网站常德网站建设技术

制造业成本管理常面临“一锅粥”困境:成本核算粗略,无法精确归属到具体订单、产品或工序;浪费点隐藏在生产细节中,难以定位和衡量。实现精细化成本管控,必须将财务数据与业务数据深度融合。助睿BI能够打通ERP成本数据与…

张小明 2026/1/10 16:11:53 网站建设

投资集团网站建设做设计的有什么网站

在数字化转型日益深入的今天,企业IT基础设施的复杂度持续攀升,尤其是在当前经济形势下,运维团队普遍面临着 "预算紧缩"与"要求提高" 的双重压力。根据Gartner的报告,2025年全球信息安全支出仍在增长&#xff…

张小明 2026/1/10 9:57:40 网站建设