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

韩城建设局网站东莞网络公司代理

韩城建设局网站,东莞网络公司代理,网站如何推广营销,福州软件园知识点回顾#xff1a; 随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业#xff1a;对于day41的简单cnn#xff0c;看看是否可以借助调参指南进一步提高精度。 import torch import torch.nn as nn import torch.optim as optim from… 知识点回顾 随机种子内参的初始化神经网络调参指南 参数的分类调参的顺序各部分参数的调整心得 作业对于day41的简单cnn看看是否可以借助调参指南进一步提高精度。 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.5transforms.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 128 #优化调参点 由64 ————》128 train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse)# 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→16x16self.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]未激活直接输出logitsreturn x # 输出未经过Softmax的logits适用于交叉熵损失函数# 初始化模型 model CNN() model model.to(device) # 将模型移至GPU如果可用criterion nn.CrossEntropyLoss() # 交叉熵损失函数 optimizer optim.Adam(model.parameters(), lr0.001) # Adam优化器# 引入学习率调度器在训练过程中动态调整学习率--训练初期使用较大的 LR 快速降低损失训练后期使用较小的 LR 更精细地逼近全局最优解。 # 在每个 epoch 结束后需要手动调用调度器来更新学习率可以在训练过程中调用 scheduler.step() scheduler optim.lr_scheduler.ReduceLROnPlateau(optimizer, # 指定要控制的优化器这里是Adammodemin, # 监测的指标是最小化如损失函数patience3, # 如果连续3个epoch指标没有改善才降低LRfactor0.6 # 降低LR的比例新LR 旧LR × 0.6 )# 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.0correct 0total 0for batch_idx, (data, target) in enumerate(train_loader):data, target data.to(device), target.to(device) # 移至GPUoptimizer.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 / totaltrain_acc_history.append(epoch_train_acc)train_loss_history.append(epoch_train_loss)# 测试阶段model.eval() # 设置为评估模式test_loss 0correct_test 0total_test 0with 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_testtest_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 30 # 增加训练轮次以获得更好效果 优化调参 20 ————》30 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)# 9.对CNN模型进行优化调参 对batchsize、epoch调整学习率采用adamReduceLROnPlateau学习率0.001factor改为0.6 一、随机种子 1.torch中使用随机数的场景 1权重、偏置的随机初始化 2数据加载shuffling打乱与批次加载随机批次加载的随机化 3数据增强的随机化随机旋转、缩放、平移、裁剪等 4随机正则化dropout 5优化器中的随机性 2.随机种子作用 1python的随机种子需要确保random模块、以及一些无序数据结构的一致性 2numpy的随机种子控制数组的随机性 3torch的随机种子控制张量的随机性在cpu和gpu上均适用 4cuDNNCUDA Deep Neural Network library CUDA 深度神经网络库的随机性针对cuda的优化算法的随机性 二、参数初始化 避免梯度消失或爆炸如果神经网络的权重初始化过大或过小会导致梯度在反向传播过程中迅速消失或爆炸。例如当权重初始化为非常小的值时激活函数的导数可能接近于零使得梯度在传播过程中逐渐减小导致网络难以更新权重而当权重初始化为非常大的值时激活函数的导数可能变得非常大使得梯度在传播过程中迅速增大导致权重更新过于剧烈网络无法收敛。 打破对称性在多层神经网络中如果所有权重都初始化为相同的值那么在训练过程中每一层的神经元会以相同的方式更新权重导致网络无法学习到复杂的特征。通过随机初始化权重可以打破这种对称性使每个神经元能够学习到不同的特征从而提高网络的表达能力。 加速收敛合适的参数初始化可以使网络在训练初期更快地收敛到一个较好的状态减少训练所需的迭代次数提高训练效率。 三、神经网络调参 1.神经网络超参数类别 网络参数包括网络层之间的交互方式如相加、相乘或串接、卷积核的数量和尺寸、网络层数深度和激活函数等。 优化参数一般指学习率、批样本数量、不同优化器的参数及部分损失函数的可调参数。 正则化参数如权重衰减系数、丢弃比率dropout。 2.调参顺序 模型能训练基础配置→ 提升性能核心参数→ 最后抑制过拟合正则化 之前的模型主要都是停留在第一步先跑起来。如果想要更进一步提高精度就需要进一步调参。以下是进一步调参的流程 1参数初始化----有预训练的参数直接起飞         预训练参数是最好的参数初始化方法在训练前先找找类似的论文有无预训练参数其次是Xavir尤其是小数据集的场景多找论文找到预训练模型是最好的做法。关于预训练参数我们介绍过了优先动深层的参数因为浅层是通用的其次是学习率要采取分阶段的策略。         如果从0开始训练的话PyTorch 默认用 Kaiming 初始化适配 ReLU或 Xavier 初始化适配 Sigmoid/Tanh。 2batchsize---测试下能允许的最高值         当Batch Size 太小的时候模型每次更新学到的东西太少了很可能白学了因为缺少全局思维。所以尽可能高一点16的倍数即可越大越好。 3epoch---这个不必多说默认都是训练到收敛位置可以采取早停策略         学习率就是参数更新的步长LR 过大→不好收敛LR 过小→训练停滞陷入局部最优         一般最开始用adam快速收敛然后sgd收尾一般精度会高一点只能选一个就adam配合调度器使用。比如 CosineAnnealingLR余弦退火调度器、StepLR固定步长衰减调度器比较经典的搭配就是Adam ReduceLROnPlateauSGD CosineAnnealing或者Adam → SGD StepLR。 4学习率与调度器----收益最高因为鞍点太多了模型越复杂鞍点越多 5模型结构----消融实验或者对照试验         如卷积核尺寸等一般就是7*7、5*5、3*3这种奇数对构成其实我觉得无所谓最开始不要用太过分的下采样即可。         神经元的参数直接用 Kaiming 初始化适配 ReLUPyTorch 默认或 Xavier 初始化适配 Sigmoid/Tanh。 6损失函数---选择比较少试出来一个即可高手可以自己构建 大部分我们目前接触的任务都是单个损失函数构成的正常选即可 分类任务         1) 交叉熵损失函数Cross-Entropy Loss--多分类场景         2) 二元交叉熵损失函数Binary Cross-Entropy Loss--二分类场景         3) Focal Loss----类别不平衡场景 注意点 - CrossEntropyLoss内置 Softmax输入应为原始 logits非概率。 - BCEWithLogitsLoss内置 Sigmoid输入应为原始 logits。 - 若评价指标为准确率用交叉熵损失若为 F1 分数考虑 Focal Loss 或自定义损失。 回归任务         1) 均方误差MSE         2) 绝对误差MAE 也要根据场景和数据特点来选不同损失受到异常值的影响程度不同 7激活函数---选择同样较少         视情况选择一般默认relu或者其变体如leaky relu再或者用tanh。只有二分类任务最后的输出层用sigmoid多分类任务用softmax其他全部用relu即可。此外还有特殊场景下的比如GELU适配 Transformer 8正则化参数---主要是droupout等到过拟合了用上述所有步骤都为了让模型过拟合         droupout一般控制在0.2-0.5之间这里说一下小技巧先追求过拟合后追求泛化性。也就是说先把模型做到过拟合然后在慢慢增加正则化程度。         正则化中如果train的loss可以很低但是val的loss还是很高则说明泛化能力不强优先让模型过拟合在考虑加大正则化提高泛化能力可以分模块来droupout可以确定具体是那部分参数导致过拟合这里还有个小trick是引入残差链接后再利用droupout 注调参顺序并不固定而且也不是按照重要度来选择是按照方便程度来选择比如选择少的选完后会减小后续实验的成本。 浙大疏锦行
http://www.hkea.cn/news/14330777/

相关文章:

  • 遵化建设局网站wordpress 单 中
  • 网站开发如何进行管理茂名免费网站建设
  • 开发工程师网站开发工程师外包小程序开发技巧
  • 青海省住房和城乡建设网站网络营销又称为
  • 网站规划与建设规划书江门网站快速排名
  • 外贸服装网站建设内乡网站建设
  • 临沂做外贸网站的公司郑州网络运营平台有哪些
  • 做问卷调查赚钱的网站在线设计平台的销售
  • 如何评价一个网站做的是否好wordpress get locale
  • 简历电商网站开发经验介绍平面设计培训要多久
  • 淄博网络公司做网站的电话济南网站建设推荐企优互联不错
  • 苏州网站建设方式杭州工程建设网
  • 网站建设单页网站界面设计论文
  • 6.网站开发流程是什么wordpress采集文章教程
  • 英德住房和城乡建设部网站做网站必须原创吗
  • 网站分为哪些类型龙岩网站推广营销
  • 广州网站推广模板丰县网站建设
  • seo网站自动推广网站建设栏目设计
  • 烟台网站制作山海云昊杰南宫网站建设
  • 学网站建设设计要钱吗衡水建个网站多少钱
  • 西安网站架设公司dw怎么做网站布局
  • 校园网站建设中期报告网站开发公司 广告词
  • 网站建设费可以抵扣吗顺企网app下载
  • 杭州网站开发外包公司个人网站制作手机版
  • 哈尔滨模版建站公司推荐做兼职网站设计
  • 培训网站设计网站开发外包计入什么科目
  • wordpress页面镶嵌php西安抖音seo
  • 自己做网站要会什么安徽工程建设信息网站王开林
  • 黔南州建设局网站庆阳市建设局网站
  • 网站建设的现状分析天津网络关键词优化