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

长春网站排名优化公司织梦企业网站

长春网站排名优化公司,织梦企业网站,推广公司业务,wordpress调用列表文章#x1f368; 本文为#x1f517;365天深度学习训练营中的学习记录博客#x1f356; 原作者#xff1a;K同学啊|接辅导、项目定制 前面实现了ResNet和DenseNet的算法#xff0c;了解了它们有各自的特点#xff1a; ResNet#xff1a;通过建立前面层与后面层之间的“短路…   本文为365天深度学习训练营中的学习记录博客 原作者K同学啊|接辅导、项目定制 前面实现了ResNet和DenseNet的算法了解了它们有各自的特点 ResNet通过建立前面层与后面层之间的“短路连接”shortcu其特征则直接进行sum操作因此channel数不变DenseNet通过建立的是前面所有层与后面层的紧密连接dense connection其特征在channel维度上的直接concat来实现特征重用feature reuse因此channel数增加 1 DPN设计理念 本课题是将ResNet与DenseNet相结合而DPN则正是对它们俩进行了融合所谓dual path即一条path是ResNet另外一条是DenseNet。在《Dual Path Networks》中作者通过对ResNet和DenseNet的分解证明了ResNet更侧重于特征的复用而DenseNet则更侧重于特征的生成通过分析两个模型的优劣将两个模型有针对性的组合起来提出了DPN。 图中 (a)为ResNet(b)为Densely Connected Network其中每一次都可以访问之前所有的micro-block的输出。为了与(a)中的micro-block设计保持一致这里增加了一个1*1的卷积层图中带下划线的部分(c)通过在(b)中micro-block之间共享相同输出的第一个1*1连接密集连接的网络退化为一个残差网络即图中点线框中的部分(d)Dual Path结构的DPN(e)与(d)等价都表示DPN这里为其实现形式其中表示分割操作而表示元素相加 由上图可知ResNet复用了前面层的特征而每一层的特征会原封不动的传到下一层而在每一层通过卷积等操作后又会提取到不同的特征因此特征的冗余度较低。但DenseNet的每个1*1卷积参数不同前面提到的层不是被后面的层直接使用而是被重新加工后生成了新的特征因此这种结构很有可能会造成后面的层提取到的特征是前面的网络已经提取过的特征故而DenseNet是一个冗余度较高的网络。DPN以ResNet为主要框架保证特征的低冗余度并添加了一个非常小的DenseNet分支用于生成新的特征。 2 DPN代码实现 DPN网络结构 上图最左侧为DPN92的网络结构对比下图的ResNet不难看出DPN确是以ResNet为框架进行的改进。右侧是DPN主要模块的详细结构图其中粉色模块对应ResNet中的ConvBlock模块灰色模块对应ResNet中的IdentityBlock模块。但又由独特之处就是在两个模块中无论是直接shortcut还是经过一个Conc2dBN与ResNet的直接进行sum处理不同这里将两条支路的特征分别进行截取如图中红框和蓝框中所示将其特征分别截取成①和②部分以及③和④部分其中①③的尺寸一致②④的尺寸一致然后将①和③进行sum操作后再与②④进行concat操作这样便引入了DenseNet中的直接在channel维度上进行concat的思想。 ResNet网络结构 2.1 前期工作 2.1.1 开发环境 电脑系统ubuntu16.04 编译器Jupter Lab 语言环境Python 3.7 深度学习环境pytorch 2.1.2 设置GPU 如果设备上支持GPU就使用GPU否则注释掉这部分代码。 import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, datasets import os, PIL, pathlib, warningswarnings.filterwarnings(ignore) device torch.device(cuda if torch.cuda.is_available() else cpu)print(device) 2.1.3 导入数据 import os,PIL,random,pathlibdata_dir_str ../data/bird_photos data_dir pathlib.Path(data_dir_str) print(data_dir:, data_dir, \n)data_paths list(data_dir.glob(*)) classNames [str(path).split(/)[-1] for path in data_paths] print(classNames:, classNames , \n)train_transforms transforms.Compose([transforms.Resize([224, 224]), # resize输入图片transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换成tensortransforms.Normalize(mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225]) # 从数据集中随机抽样计算得到 ])total_data datasets.ImageFolder(data_dir_str, transformtrain_transforms) print(total_data) print(total_data.class_to_idx) 结果输出如图  2.1.4 划分数据集 train_size int(0.8 * len(total_data)) test_size len(total_data) - train_size train_dataset, test_dataset torch.utils.data.random_split(total_data, [train_size, test_size]) print(train_dataset, test_dataset)batch_size 4 train_dl torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size,shuffleTrue,num_workers1,pin_memoryFalse) test_dl torch.utils.data.DataLoader(test_dataset, batch_sizebatch_size,shuffleTrue,num_workers1,pin_memoryFalse)for X, y in test_dl:print(Shape of X [N, C, H, W]:, X.shape)print(Shape of y:, y.shape, y.dtype)break 结果输出如图 2.2 搭建DPN 2.2.1 DPN模块搭建 import torch import torch.nn as nnclass Block(nn.Module):param : in_channel--输入通道数mid_channel -- 中间经历的通道数out_channel -- ResNet部分使用的通道数sum操作这部分输出仍然是out_channel个通道dense_channel -- DenseNet部分使用的通道数concat操作这部分输出是2*dense_channel个通道groups -- conv2中的分组卷积参数is_shortcut -- ResNet前是否进行shortcut操作def __init__(self, in_channel, mid_channel, out_channel, dense_channel, stride, groups, is_shortcutFalse):super(Block, self).__init__()self.is_shortcut is_shortcutself.out_channel out_channelself.conv1 nn.Sequential(nn.Conv2d(in_channel, mid_channel, kernel_size1, biasFalse),nn.BatchNorm2d(mid_channel),nn.ReLU())self.conv2 nn.Sequential(nn.Conv2d(mid_channel, mid_channel, kernel_size3, stridestride, padding1, groupsgroups, biasFalse),nn.BatchNorm2d(mid_channel),nn.ReLU())self.conv3 nn.Sequential(nn.Conv2d(mid_channel, out_channeldense_channel, kernel_size1, biasFalse),nn.BatchNorm2d(out_channeldense_channel))if self.is_shortcut:self.shortcut nn.Sequential(nn.Conv2d(in_channel, out_channeldense_channel, kernel_size3, padding1, stridestride, biasFalse),nn.BatchNorm2d(out_channeldense_channel))self.relu nn.ReLU(inplaceTrue)def forward(self, x):a xx self.conv1(x)x self.conv2(x)x self.conv3(x)if self.is_shortcut:a self.shortcut(a)# a[:, :self.out_channel, :, :]x[:, :self.out_channel, :, :]是使用ResNet的方法即采用sum的方式将特征图进行求和通道数不变都是out_channel个通道# a[:, self.out_channel:, :, :], x[:, self.out_channel:, :, :]]是使用DenseNet的方法即采用concat的方式将特征图在channel维度上直接进行叠加通道数加倍即2*dense_channel# 注意最终是将out_channel个通道的特征ResNet方式与2*dense_channel个通道特征DenseNet方式进行叠加因此最终通道数为out_channel2*dense_channelx torch.cat([a[:, :self.out_channel, :, :]x[:, :self.out_channel, :, :], a[:, self.out_channel:, :, :], x[:, self.out_channel:, :, :]], dim1)x self.relu(x)return xclass DPN(nn.Module):def __init__(self, cfg):super(DPN, self).__init__()self.group cfg[group]self.in_channel cfg[in_channel]mid_channels cfg[mid_channels]out_channels cfg[out_channels]dense_channels cfg[dense_channels]num cfg[num]self.conv1 nn.Sequential(nn.Conv2d(3, self.in_channel, 7, stride2, padding3, biasFalse, padding_modezeros),nn.BatchNorm2d(self.in_channel),nn.ReLU(),nn.MaxPool2d(kernel_size3, stride2, padding0))self.conv2 self._make_layers(mid_channels[0], out_channels[0], dense_channels[0], num[0], stride1)self.conv3 self._make_layers(mid_channels[1], out_channels[1], dense_channels[1], num[1], stride2)self.conv4 self._make_layers(mid_channels[2], out_channels[2], dense_channels[2], num[2], stride2)self.conv5 self._make_layers(mid_channels[3], out_channels[3], dense_channels[3], num[3], stride2)self.pool nn.AdaptiveAvgPool2d((1,1))self.fc nn.Linear(cfg[out_channels][3] (num[3] 1) * cfg[dense_channels][3], cfg[classes]) # fc层需要计算def _make_layers(self, mid_channel, out_channel, dense_channel, num, stride):layers []# is_shortcutTrue表示进行shortcut操作则将浅层的特征进行一次卷积后与进行第三次卷积的特征图相加ResNet方式和concat(DeseNet方式)操作# 第一次使用Block可以满足浅层特征的利用后续重复的Block则不需要线层特征因此后续的Block的is_shortcutFalse(默认值)layers.append(Block(self.in_channel, mid_channel, out_channel, dense_channel, stridestride, groupsself.group, is_shortcutTrue))self.in_channel out_channel dense_channel*2for i in range(1, num):layers.append(Block(self.in_channel, mid_channel, out_channel, dense_channel, stride1, groupsself.group))# 由于Block包含DenseNet在叠加特征图所以第一次是2倍dense_channel后面每次都会多出1倍dense_channelself.in_channel dense_channelreturn nn.Sequential(*layers)def forward(self, x):x self.conv1(x)x self.conv2(x)x self.conv3(x)x self.conv4(x)x self.conv5(x)x self.pool(x)x torch.flatten(x, start_dim1)x self.fc(x)return x 2.2.2 DPN92和DPN98 def DPN92(n_class4):cfg {group : 32,in_channel : 64,mid_channels : (96, 192, 384, 768),out_channels : (256, 512, 1024, 2048),dense_channels : (16, 32, 24, 128),num : (3, 4, 20, 3),classes : (n_class)}return DPN(cfg)def DPN98(n_class4):cfg {group : 40,in_channel : 96,mid_channels : (160, 320, 640, 1280),out_channels : (256, 512, 1024, 2048),dense_channels : (16, 32, 32, 128),num : (3, 6, 20, 3),classes : (n_class)}return DPN(cfg)model DPN92().to(device) model 这里使用模型DPN92输出结果如下图所示由于结果太大只截取前后部分  (中间部分省略) 2.2.3 查看模型详情 # 统计模型参数量以及其他指标 import torchsummary as summary summary.summary(model, (3, 224, 224)) 结果输出如下由于结果太长只展示最前面和最后面 中间部分省略 2.3 训练模型 2.3.1 编写训练函数 # 训练循环 def train(dataloader, model, loss_fn, optimizer):size len(dataloader.dataset) # 训练集的大小num_batches len(dataloader) # 批次数目, (size/batch_size向上取整)train_loss, train_acc 0, 0 # 初始化训练损失和正确率for X, y in dataloader: # 获取图片及其标签X, y X.to(device), y.to(device)# 计算预测误差pred model(X) # 网络输出loss loss_fn(pred, y) # 计算网络输出pred和真实值y之间的差距y为真实值计算二者差值即为损失# 反向传播optimizer.zero_grad() # grad属性归零loss.backward() # 反向传播optimizer.step() # 每一步自动更新# 记录acc与losstrain_acc (pred.argmax(1) y).type(torch.float).sum().item()train_loss loss.item()train_acc / sizetrain_loss / num_batchesreturn train_acc, train_loss 2.3.2 编写测试函数 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: # 获取图片及其标签with torch.no_grad():imgs, target imgs.to(device), target.to(device)# 计算误差tartget_pred model(imgs) # 网络输出loss loss_fn(tartget_pred, target) # 计算网络输出和真实值之间的差距targets为真实值计算二者差值即为损失# 记录acc与losstest_loss loss.item()test_acc (tartget_pred.argmax(1) target).type(torch.float).sum().item()test_acc / sizetest_loss / num_batchesreturn test_acc, test_loss 2.3.3 正式训练 import copyoptimizer torch.optim.Adam(model.parameters(), lr 1e-4) loss_fn nn.CrossEntropyLoss() #创建损失函数epochs 40train_loss [] train_acc [] test_loss [] test_acc []best_acc 0 #设置一个最佳准确率作为最佳模型的判别指标if hasattr(torch.cuda, empty_cache):torch.cuda.empty_cache()for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, optimizer)#scheduler.step() #更新学习率调用官方动态学习率接口时使用model.eval()epoch_test_acc, epoch_test_loss test(test_dl, model, loss_fn)#保存最佳模型到best_modelif epoch_test_acc best_acc:best_acc epoch_test_accbest_model copy.deepcopy(model)train_acc.append(epoch_train_acc)train_loss.append(epoch_train_loss)test_acc.append(epoch_test_acc)test_loss.append(epoch_test_loss)#获取当前的学习率lr optimizer.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(epoch1, epoch_train_acc*100, epoch_train_loss, epoch_test_acc*100, epoch_test_loss, lr))PATH ./J3_best_model.pth torch.save(model.state_dict(), PATH)print(Done) 结果输出如下 2.4 结果可视化 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(epochs)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() 结果输出如下
http://www.hkea.cn/news/14539843/

相关文章:

  • 网站建设营销方案定制php网站挂到linux服务器上应该这么做
  • 设计最简单的企业网站广州网页设计软件培训
  • 公司网站建设与维护东莞专业网站建站设计
  • 建网站找哪家好南宁做网站
  • 广西柳州做网站wordpress js插件开发教程视频
  • 中小企业建站服务建设一个视频网站己18
  • 做PPT哪个网站的素材多点什么专业学网页设计
  • 给人做网站互联网舆情
  • 做的网站怎么联网生态环境工程公司网站建设
  • 抖音上做我女朋友网站网站二次开发公司
  • 网站建设怎么做账东莞建设网站平台
  • 兰州做网站维护的公司简单网站开发准备
  • 江宁区建设工程局网站进不去剪辑教学课程
  • 个体搞网站建设 经营范围app取代网站
  • 后端网站开发培训高清做视频在线观看网站
  • 网站价值评估 php初中信息技术 网站制作
  • 潍坊网站制作江门公司网站建设流程 知乎
  • 官网网站建设方案书wordpress客户案例
  • WordPress自定义上传目录南阳网站优化费用
  • 网站建设与管理以后工作方向it培训机构排名及学费
  • 南昌网站seo哪家公司好邵阳多用户商城网站建设
  • 精美网站制作网站设计分类
  • 吐槽做网站wordpress怎样制作vr全景
  • 云虚拟主机怎么做网站国际时事新闻2022最新
  • 焦作做网站优化wordpress redirect.php
  • 天眼查网站建设公司国外虚拟主机wordpress
  • 重庆市建设工程质量网站三维建设项目管理网站
  • 做外贸怎么网站找客户信息公司网站想维护服务器
  • 怎样做 云知梦 网站WordPress手机APP源码
  • 上海微信网站开发承德网站建设服务