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

哈密建设厅网站微信公众号网站开发模板

哈密建设厅网站,微信公众号网站开发模板,深圳建设银行网站首页,江苏商城网站制作公司#x1f368; 本文为#x1f517;365天深度学习训练营 中的学习记录博客#x1f356; 原作者#xff1a;K同学啊 一、实验目的#xff1a; 阅读ResNeXt论文#xff0c;了解作者的构建思路对比之前介绍的ResNet50V2、DenseNet算法使用ResNeXt-50算法完成猴痘病识别 二、实… 本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊 一、实验目的 阅读ResNeXt论文了解作者的构建思路对比之前介绍的ResNet50V2、DenseNet算法使用ResNeXt-50算法完成猴痘病识别 二、实验环境 语言环境python 3.8编译器Jupyter notebook深度学习环境Pytorch torch2.4.0cu124torchvision0.19.0cu124 三、模型介绍 ResNeXt是由何凯明团队在2017年CVPR会议上提出来的新型图像分类网络。ResNeXt是ResNet的升级版在ResNet的基础上引入了cardinality的概念类似于ResNetResNeXt也有ResNeXt-50ResNeXt-101的版本。 ResNeXt论文原文Aggregated Residual Transformations for Deep Neural Networks。 这篇文章介绍了一种用于图像分类的简单而有效的网络架构该网络采用了VGG/ResNets的策略通过重复层来增加深度和宽度并利用分裂-变换-合并策略以易于扩展的方式进行转换。文章还提出了一个新的维度——“基数”它是指转换集合的大小可以在保持复杂性不变的情况下提高分类准确性。作者在ImageNet-1K数据集上进行了实证研究证明了这种方法的有效性。 下图是ResNet左与ResNeXt右block的差异。在ResNet中输入的具有256个通道的特征经过1×1卷积压缩4倍到64个通道之后3×3的卷积核用于处理特征经1×1卷积扩大通道数与原特征残差连接后输出。 ResNeXt也是相同的处理策略但在ResNeXt中输入的具有256个通道的特征被分为32个组每组被压缩64倍到4个通道后进行处理。32个组相加后与原特征残差连接后输出。这里cardinatity指的是一个block中所具有的相同分支的数目。 分组卷积 ResNeXt中采用的分组卷机简单来说就是将特征图分为不同的组再对每组特征图分别进行卷积这个操作可以有效的降低计算量。 在分组卷积中每个卷积核只处理部分通道比如下图中红色卷积核只处理红色的通道绿色卷积核只处理绿色通道黄色卷积核只处理黄色通道。此时每个卷积核有2个通道每个卷积核生成一张特征图。 总结ResNeXt-50网络简单讲就是在ResNet结构的基础上采用了聚合残差结构和局部连接结构同时引入了Random Erasing和Mixup等数据增强和正则化方法。 Random Erasing是一种数据增强技术随机删除图像中的一些像素并用随机值填充从而增强模型的泛化性能。该技术可以防止模型过分关注图像中的一些细节和特定的区域从而更好地适应新的数据。此外Random Erasing还可以增加数据集的多样性从而降低过拟合的风险。Mixup则是一种数据增强和正则化技术将两张图像的像素按比例混合生成一张新的图像作为输入从而提高模型的鲁棒性和泛化性能。Mixup的基本思想是在训练过程中使用凸组合的方法将输入的不同样本进行线性组合从而生成一些新的数据样本。这种方法可以有效地增加数据集的多样性从而提高模型的泛化性能。此外Mixup还可以作为一种正则化技术可以降低模型的过拟合风险。 四、使用Pytorch实现ResNeXt-50 设置GPU、导入数据、划分数据集等步骤同前。 1. 构建模型 class Bottleneck(nn.Module):expansion 4def __init__(self, in_channel, out_channel, stride1, downsampleNone,groups1, width_per_group64):super(Bottleneck, self).__init__()width int(out_channel * (width_per_group / 64.)) * groupsself.conv1 nn.Conv2d(in_channelsin_channel, out_channelswidth,kernel_size1, stride1, biasFalse) # squeeze channelsself.bn1 nn.BatchNorm2d(width)# -----------------------------------------self.conv2 nn.Conv2d(in_channelswidth, out_channelswidth, groupsgroups,kernel_size3, stridestride, biasFalse, padding1)self.bn2 nn.BatchNorm2d(width)# -----------------------------------------self.conv3 nn.Conv2d(in_channelswidth, out_channelsout_channel*self.expansion,kernel_size1, stride1, biasFalse) # unsqueeze channelsself.bn3 nn.BatchNorm2d(out_channel*self.expansion)self.relu nn.ReLU(inplaceTrue)self.downsample downsampledef forward(self, x):identity xif self.downsample is not None:identity self.downsample(x)out self.conv1(x)out self.bn1(out)out self.relu(out)out self.conv2(out)out self.bn2(out)out self.relu(out)out self.conv3(out)out self.bn3(out)out identityout self.relu(out)return outclass ResNet(nn.Module):def __init__(self,block,blocks_num,num_classes1000,include_topTrue,groups1,width_per_group64):super(ResNet, self).__init__()self.include_top include_topself.in_channel 64self.groups groupsself.width_per_group width_per_groupself.conv1 nn.Conv2d(3, self.in_channel, kernel_size7, stride2,padding3, biasFalse)self.bn1 nn.BatchNorm2d(self.in_channel)self.relu nn.ReLU(inplaceTrue)self.maxpool nn.MaxPool2d(kernel_size3, stride2, padding1)self.layer1 self._make_layer(block, 64, blocks_num[0])self.layer2 self._make_layer(block, 128, blocks_num[1], stride2)self.layer3 self._make_layer(block, 256, blocks_num[2], stride2)self.layer4 self._make_layer(block, 512, blocks_num[3], stride2)if self.include_top:self.avgpool nn.AdaptiveAvgPool2d((1, 1)) # output size (1, 1)self.fc nn.Linear(512 * block.expansion, num_classes)for m in self.modules():if isinstance(m, nn.Conv2d):nn.init.kaiming_normal_(m.weight, modefan_out, nonlinearityrelu)def _make_layer(self, block, channel, block_num, stride1):downsample Noneif stride ! 1 or self.in_channel ! channel * block.expansion:downsample nn.Sequential(nn.Conv2d(self.in_channel, channel * block.expansion, kernel_size1, stridestride, biasFalse),nn.BatchNorm2d(channel * block.expansion))layers []layers.append(block(self.in_channel,channel,downsampledownsample,stridestride,groupsself.groups,width_per_groupself.width_per_group))self.in_channel channel * block.expansionfor _ in range(1, block_num):layers.append(block(self.in_channel,channel,groupsself.groups,width_per_groupself.width_per_group))return nn.Sequential(*layers)def forward(self, x):x self.conv1(x)x self.bn1(x)x self.relu(x)x self.maxpool(x)x self.layer1(x)x self.layer2(x)x self.layer3(x)x self.layer4(x)if self.include_top:x self.avgpool(x)x torch.flatten(x, 1)x self.fc(x)return xdef resnext50_32x4d(num_classes1000, include_topTrue):# 预训练权重https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pthgroups 32width_per_group 4return ResNet(Bottleneck, [3, 4, 6, 3],num_classesnum_classes,include_topinclude_top,groupsgroups,width_per_groupwidth_per_group)model resnext50_32x4d(num_classes4, include_topTrue) model.to(device)# 统计模型参数量以及其他指标 import torchsummary as summary summary.summary(model,(3,224,224))代码输出部分截图 2. 编写训练与测试函数 # 编写训练函数 def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset)num_batches len(dataloader)train_acc, train_loss 0, 0for X, y in dataloader:X, y X.to(device), y.to(device)pred model(X)loss loss_fn(pred, y)optimizer.zero_grad()loss.backward()optimizer.step()train_loss loss.item()train_acc (pred.argmax(1) y).type(torch.float).sum().item()train_loss / num_batchestrain_acc / sizereturn train_acc, train_loss# 编写测试函数 def test(dataloader, model, loss_fn):size len(dataloader.dataset) # 测试集的大小num_batches len(dataloader) # 批次数目, (size/batch_size向上取整)test_loss, test_acc 0, 0# 当不进行训练时停止梯度更新节省计算内存消耗with torch.no_grad():for imgs, target in dataloader:imgs, target imgs.to(device), target.to(device)# 计算losstarget_pred model(imgs)loss loss_fn(target_pred, target)test_loss loss.item()test_acc (target_pred.argmax(1) target).type(torch.float).sum().item()test_acc / sizetest_loss / num_batchesreturn test_acc, test_loss3. 设置损失函数和学习率 import copyloss_fn nn.CrossEntropyLoss() learn_rate 1e-4 opt torch.optim.Adam(model.parameters(), lrlearn_rate)scheduler torch.optim.lr_scheduler.StepLR(opt, step_size1, gamma0.9) # 定义学习率高度器epochs 100 # 设置训练模型的最大轮数为100但可能到不了100 patience 10 # 早停的耐心值即如果模型连续10个周期没有准确率提升则跳出训练train_loss [] train_acc [] test_loss [] test_acc [] best_acc 0 # 设置一个最佳的准确率作为最佳模型的判别指标 no_improve_epoch 0 # 用于跟踪准确率是否提升的计数器 epoch 0 # 用于统计最终的训练模型的轮数这里设置初始值为0为绘图作准备这里的绘图范围不是epochs 1004. 正式训练 # 开始训练 for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, opt)model.eval()epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn)if epoch_test_acc best_acc:best_acc epoch_test_accbest_model copy.deepcopy(model)no_improve_epoch 0 # 重置计数器# 保存最佳模型的检查点PATH J6_best_model.pthtorch.save({epoch: epoch,model_state_dict: best_model.state_dict(),optimizer_state_dict: opt.state_dict(),loss: epoch_test_loss,}, PATH)else:no_improve_epoch 1if no_improve_epoch patience:print(fEarly stop triggered at epoch {epoch 1})break # 早停train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)scheduler.step() # 更新学习率lr opt.state_dict()[param_groups][0][lr]template (Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E})print(template.format(epoch 1, epoch_train_acc * 100, epoch_train_loss, epoch_test_acc * 100, epoch_test_loss, lr))代码输出部分截图 5. 结果可视化 # 结果可视化 # Loss与Accuracy图import matplotlib.pyplot as plt # 隐藏警告 import warnings warnings.filterwarnings(ignore) # 忽略警告信息 plt.rcParams[font.sans-serif] [SimHei] # 用来正常显示中文标签 plt.rcParams[axes.unicode_minus] False # 用来正常显示负号 plt.rcParams[figure.dpi] 100 # 分辨率epochs_range range(epoch)plt.figure(figsize(12, 3)) plt.subplot(1, 2, 1)plt.plot(epochs_range, train_acc, labelTraining Accuracy) plt.plot(epochs_range, test_acc, labelTest Accuracy) plt.legend(loclower right) plt.title(Training and Validation Accuracy)plt.subplot(1, 2, 2) plt.plot(epochs_range, train_loss, labelTraining Loss) plt.plot(epochs_range, test_loss, labelTest Loss) plt.legend(locupper right) plt.title(Training and Validation Loss) plt.show()6. 预测 from PIL import Imageclasses list(total_data.class_to_idx)def predict_one_image(image_path, model, transform, classes):test_img Image.open(image_path).convert(RGB)plt.imshow(test_img) # 展示预测的图片test_img transform(test_img)img test_img.to(device).unsqueeze(0)model.eval()output model(img)_, pred torch.max(output, 1)pred_class classes[pred]print(f预测结果是{pred_class})import os from pathlib import Path import random#从所有的图片的随机选择一张图片image[] def image_path(data_dir):file_listos.listdir(data_dir) #列出四个分类标签data_file_dirfile_list #从四个分类标签中随机选择一个data_dirPath(data_dir)for i in data_file_dir:iPath(i)image_file_pathdata_dir.joinpath(i) #拼接路径data_file_pathsimage_file_path.iterdir() #罗列文件夹的内容data_file_pathslist(data_file_paths) #要转换为列表image.append(data_file_paths)filerandom.choice(image) #从所有的图像中随机选择一类filerandom.choice(file) #从选择的类中随机选择一张图片return filedata_dir./monkeypox_photos image_pathimage_path(data_dir)# 预测训练集中的某张照片 predict_one_image(image_pathimage_path,modelmodel,transformtrain_transforms,classesclasses)# 模型评估 # 将参数加载到model当中 best_model.load_state_dict(torch.load(PATH,map_locationdevice)) epoch_test_acc,epoch_test_losstest(test_dl,best_model,loss_fn) epoch_test_acc,epoch_test_loss(0.8508158508158508, 0.39013327977487017)总结 ResNeXt是在ResNet的网络架构上使用类似于Inception的分治思想即split-tranform-merge策略将模块中的网络拆开分组与Inception不同每组的卷积核大小一致这样其感受野一致但由于每组的卷积核参数不同提取的特征自然不同。然后将每组得到的特征进行concat操作后再与原输入特征x或者经过卷积等处理即进行非线性变换的特征进行Add操作。这样做的好处是在不增加参数复杂度的前提下提高准确率同时还能提高超参数的数量。 另外cardinality是基的意思将数个通道特征进行分组不同的特征组之间可以看作是由不同基组成的子空间每个组的核虽然一样但参数不同在各自的子空间中学到的特征就多种多样这点跟transformer中的Multi-head attention不谋而合Multi-head attention allows the model to jointly attend to information from different representation subspaces.而且分组进行特征提取使得学到的特征冗余度降低获取能起到正则化的作用。 ResNeXt-50与ResNet50V2、DenseNet的对比 网络结构 ResNeXt-50基于ResNet结构改进而来采用聚合残差结构和局部连接结构。它通过重复构建块来构建每个构建块聚合了一组具有相同拓扑结构的转换。引入了分组卷积的方法可以将不同的通道分组处理还使用了深度可分离卷积的方法进一步减少计算量。ResNet50V2是ResNet系列中的经典模型由50层卷积层、批量归一化、激活函数和池化层构成。引入了一种全新的残差块结构即bottleneck结构使得网络参数量大幅度降低同时精度也有所提升。DenseNet其特点是不同于传统的网络结构每一层的输出不仅和前一层的输出有关还和之前所有层的输出有关这种密集连接的结构可以有效地缓解梯度消失和参数稀疏问题提高了模型的泛化能力和精度。它由多个denseblock和transition层组成denseblock内部采用密集连接相邻denseblock之间通过transition层连接并降低特征图大小。 精度和计算量 ResNeXt-50在相同的深度下具有更高的精度并且在参数量和计算量上都显著降低。在较深的网络结构下优势更加明显可以达到更高的精度。ResNet50V2能在保持较低参数量的同时实现较高的精度。DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能通过特征在channel上的连接来实现特征重用减少了网络的参数总量但由于密集连接方式计算量相对较大。 适用范围 ResNeXt-50适用于各种图像分类任务在对精度要求较高且计算资源相对充足的场景下表现良好。ResNet50V2广泛适用于各种图像分类任务尤其在对模型复杂度和精度有一定平衡要求的场景中应用较多。DenseNet适用于对特征重用和模型紧凑性要求较高的任务例如图像分类、目标检测等但在计算资源有限的情况下可能需要对其进行适当的调整或优化。 它们各自的优点和创新之处如下 ResNeXt-50 优点在不明显增加参数量的情况下提升了准确率具有很好的可扩展性和可适应性超参数数量相对较少便于模型移植。创新提出aggregated residual transformations结构利用分组卷积构建平行堆叠相同拓扑结构的blocks代替原来ResNet的三层卷积的block同时引入了cardinality的概念即通过增加分组的数量基数可以在不增加模型复杂度的前提下提高性能实验表明增加基数比增加深度或宽度更有效。 ResNet50V2 优点通过改进残差结构先进行批量归一化和激活函数计算后再卷积并将addition后的ReLU计算放到残差结构内部提高了模型的精度同时降低了参数量。创新全新的残差块结构bottleneck结构减少了网络参数量使得在保持较高精度的同时模型更容易训练和优化这种结构上的创新为后续许多网络的设计提供了借鉴思路。 DenseNet 优点缓解了梯度消失问题加强了特征传播鼓励了特征复用极大地减少了网络的参数总量在参数较少的情况下能取得较好的性能而且通过密集连接方式提升了梯度的反向传播使得网络更容易训练对过拟合有一定的抑制作用。创新建立了前面所有层与后面层的密集连接机制实现了特征重用每个层都会与前面所有层在channel维度上连接并作为下一层的输入这一创新的连接方式充分利用了特征信息与传统的网络结构相比在相同性能下可以减少参数数量提高了模型的效率和泛化能力。此外在denseblock中使用bottleneck层来减少计算量以及在transition层采用特定的结构来处理特征图的尺寸匹配问题也是其重要的创新点。
http://www.hkea.cn/news/14409805/

相关文章:

  • 模版用iis在自己家电脑上做网站网站上的文章做参考文献
  • 宣讲家网站 家风建设手机网站上线左右滑动
  • 网站系统建设目标范本东莞黄江做网站公司
  • 网站优化建设安徽ip做网站域名
  • 优秀服装网站设计做网站初级教程
  • 网站虚拟主机哪个好php管理系统
  • 深圳做微信网站设计安顺市住房和城乡建设局网站
  • 网站手机访问 动易网站做不做账
  • 手机网站404页面汕尾市企业网站seo点击软件
  • 百度网站建设产品wordpress进入控制台
  • 网站文字规划wordpress 免费cdn
  • 无锡网站建设动态担保公司网站模板
  • 昆山外贸网站建设推广wordpress用户头像
  • 雅虎网站提交外包公司做的网站
  • 好的买手表网站怎么创建wordpress站点
  • 包装设计平台sem优化软件选哪家
  • 南京专业做网站公司地址购物网站需要哪些模块
  • 营销型建设网站实训总结召唤神龙网页小游戏在线玩
  • apache 网站建设ui设计是做什么的
  • 专业做网站多少钱东莞网站建设相关技术
  • 网站备案相关手续费WordPress链接加前缀
  • 大型网站制作需要什么设备wordpress付费下载
  • 养生网站模板做网站的女生多么
  • python网站开发详细步骤站长之家查询域名
  • 在线做网站免费黄搞上海网址推广
  • 专业制作网站图片商务
  • 成都企业网站制作哪家好wordpress多语言生成工具
  • 企业网站 个人备案物流官网
  • 如何解析域名关键词搜索排名优化
  • 查询网站dns服务器免费网站建设专业的公司