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

网站建设如何不被忽悠重庆建设机电网站

网站建设如何不被忽悠,重庆建设机电网站,wordpress网页视频,深圳网络优化培训文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例#xff0c;我的环境具体如下#xff1a; … 文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例我的环境具体如下 pytorch2.0python3.8jupyter notebook 一、环境准备 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) device# 输出 device(typecuda)二、数据预处理 读取数据 import os,PIL,random,pathlibdata_dir dataset/ data_dir pathlib.Path(data_dir)data_paths list(data_dir.glob(*)) classeNames [str(path).split(\\)[1] for path in data_paths] classeNames# 输出 [cat, dog]数据处理 # 关于transforms.Compose的更多介绍可以参考https://blog.csdn.net/qq_38251616/article/details/124878863 train_transforms transforms.Compose([transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸# transforms.RandomHorizontalFlip(), # 随机水平翻转transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor并归一化到[0,1]之间transforms.Normalize( # 标准化处理--转换为标准正太分布高斯分布使模型更容易收敛mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225]) # 其中 mean[0.485,0.456,0.406]与std[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。 ])test_transform transforms.Compose([transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor并归一化到[0,1]之间transforms.Normalize( # 标准化处理--转换为标准正太分布高斯分布使模型更容易收敛mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225]) # 其中 mean[0.485,0.456,0.406]与std[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。 ])total_data datasets.ImageFolder(data_dir,transformtrain_transforms) total_data将数据集进行分类 total_data.class_to_idx# 输出 {cat: 0, dog: 1}划分数据集 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]) train_dataset, test_dataset数据集加载 batch_size 4train_dl torch.utils.data.DataLoader(train_dataset,batch_sizebatch_size,shuffleTrue) test_dl torch.utils.data.DataLoader(test_dataset,batch_sizebatch_size,shuffleTrue)查看数据集形状 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三、构建模型 Xception的具体网络结构如下所示 import math import torch.nn as nn import torch.nn.functional as F import torch.utils.model_zoo as model_zoo from torch.nn import init import torchclass SeparableConv2d(nn.Module):def __init__(self, in_channels, out_channels, kernel_size1, stride1, padding0, dilation1, biasFalse):super(SeparableConv2d, self).__init__()self.conv1 nn.Conv2d(in_channels, in_channels, kernel_size, stride, padding, dilation, groupsin_channels,biasbias)self.pointwise nn.Conv2d(in_channels, out_channels, 1, 1, 0, 1, 1, biasbias)def forward(self, x):x self.conv1(x)x self.pointwise(x)return xclass Block(nn.Module):def __init__(self, in_filters, out_filters, reps, strides1, start_with_reluTrue, grow_firstTrue):# :parm reps:块重复次数super(Block, self).__init__()# Middle flow无需做这一步而其余块需要以做跳连# 1)Middle flow输入输出特征图个数始终一致且Stride恒为1# 1其余快stride2这样可以将特征图尺寸减半获得与最大池化减半特征图尺寸同样的效果if out_filters ! in_filters or strides ! 1:self.skip nn.Conv2d(in_filters, out_filters, 1, stridestrides, biasFalse)self.skipbn nn.BatchNorm2d(out_filters)else:self.skip Noneself.relu nn.ReLU(inplaceTrue)rep []filters in_filtersif grow_first:rep.append(self.relu)# 这里的卷积不改变特征图尺寸rep.append(SeparableConv2d(in_filters, out_filters, 3, stride1, padding1, biasFalse))rep.append(nn.BatchNorm2d(out_filters))filters out_filtersfor i in range(reps - 1):rep.append(self.relu)rep.append(SeparableConv2d(filters, filters, 3, stride1, padding1, biasFalse))rep.append(nn.BatchNorm2d(filters))if not grow_first:rep.append(self.relu)rep.append(SeparableConv2d(in_filters, out_filters, 3, stride1, padding1, biasFalse))rep.append(nn.BatchNorm2d(out_filters))if not start_with_relu:rep rep[1:]else:rep[0] nn.ReLU(inplaceFalse)# Middle flow 的stride恒为1因此无需做池化而其余块需要# 其余块的stride2因此这里的最大池化可以将特征图尺寸减半if strides ! 1:rep.append(nn.MaxPool2d(3, strides, 1))self.rep nn.Sequential(*rep)def forward(self, inp):x self.rep(inp)if self.skip is not None:skip self.skip(inp)skip self.skipbn(skip)else:skip inpx skipreturn xclass Xception(nn.Module):def __init__(self, num_classes):super(Xception, self).__init__()self.num_classes num_classes # 总分类数###############################定义 Entry flow#################################self.conv1 nn.Conv2d(in_channels3, out_channels32, kernel_size3, stride2, padding0, biasFalse)self.bn1 nn.BatchNorm2d(32)self.relu nn.ReLU(inplaceTrue)self.conv2 nn.Conv2d(in_channels32, out_channels64, kernel_size3, stride1, padding0, biasFalse)self.bn2 nn.BatchNorm2d(64)# do relu here# Block中的参数顺序in_filters,out_filters,reps,stride,start_with_relu,grow_firstself.block1 Block(64, 128, 2, 2, start_with_reluFalse, grow_firstTrue)self.block2 Block(128, 256, 2, 2, start_with_reluTrue, grow_firstTrue)self.block3 Block(256, 728, 2, 2, start_with_reluTrue, grow_firstTrue)##############################定义 Middle flow################################self.block4 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block5 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block6 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block7 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block8 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block9 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block10 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)self.block11 Block(728, 728, 3, 1, start_with_reluTrue, grow_firstTrue)#############################定义 Exit flow###################################self.block12 Block(728, 1024, 2, 2, start_with_reluTrue, grow_firstFalse)self.conv3 SeparableConv2d(1024, 1536, 3, 1, 1)self.bn3 nn.BatchNorm2d(1536)# do relu hereself.conv4 SeparableConv2d(1536, 2048, 3, 1, 1)self.bn4 nn.BatchNorm2d(2048)self.fc nn.Linear(2048, num_classes)################################################################################--------------------init weights---------------------#for m in self.modules():if isinstance(m, nn.Conv2d):n m.kernel_size[0] * m.kernel_size[1] * m.out_channelsm.weight.data.normal_(0, math.sqrt(2. / n))elif isinstance(m, nn.BatchNorm2d):m.weight.data.fill_(1)m.bias.data.zero_()#----------------------------------------------------------------def forward(self, x):###########################定义 Entry flow ######################################x self.conv1(x)x self.bn1(x)x self.relu(x)x self.conv2(x)x self.bn2(x)x self.relu(x)x self.block1(x)x self.block2(x)x self.block3(x)######################## 定义 Middle flow#######################################x self.block4(x)x self.block5(x)x self.block6(x)x self.block7(x)x self.block8(x)x self.block9(x)x self.block10(x)x self.block11(x)######################### 定义 Exit flow #######################################x self.block12(x)x self.conv3(x)x self.bn3(x)x self.relu(x)x self.conv4(x)x self.bn4(x)x self.relu(x)x F.adaptive_avg_pool2d(x, (1,1))x x.view(x.size(0), -1)x self.fc(x)return x四、实例化模型 device cuda:0 if torch.cuda.is_available() else cpu print(Using {} device.format(device))xception Xception(num_classes 2) model xception.to(device) model五、训练模型 5.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) # 计算网络输出和真实值之间的差距targets为真实值计算二者差值即为损失# 反向传播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_loss5.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: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_loss5.3 开始正式训练 import copyoptimizer torch.optim.Adam(model.parameters(), lr 1e-3) loss_fn nn.CrossEntropyLoss() # 创建损失函数epochs 5train_loss [] train_acc [] test_loss [] test_acc []best_acc 0 # 设置一个最佳准确率作为最佳模型的判别指标for epoch in range(epochs):model.train()epoch_train_acc, epoch_train_loss train(train_dl, model, loss_fn, optimizer)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 ./best_model.pth # 保存的参数文件名 torch.save(best_model.state_dict(), PATH)print(Done)六、可视化精度和损失 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()七、个体预测 随便去网上找一张猫狗图片进行预测。 # 预测import matplotlib.pyplot as plt from PIL import Image from torchvision.transforms import transforms import torch import matplotlib.pyplot as pltplt.rcParams[font.sans-serif][SimHei] #解决中文显示乱码问题 plt.rcParams[axes.unicode_minus]False #解决坐标轴负数的负号显示问题data_transform transforms.Compose([transforms.Resize([224, 224]), # 将输入图片resize成统一尺寸transforms.ToTensor(), # 将PIL Image或numpy.ndarray转换为tensor并归一化到[0,1]之间transforms.Normalize( # 标准化处理--转换为标准正太分布高斯分布使模型更容易收敛mean[0.485, 0.456, 0.406],std[0.229, 0.224, 0.225]) # 其中 mean[0.485,0.456,0.406]与std[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。 ])img Image.open(cat.jpg) plt.imshow(img) img data_transform(img) img torch.unsqueeze(img, dim0) name[狗,猫] model_weight_path best_model.pth model Xception(num_classes 2) model.load_state_dict(torch.load(model_weight_path)) model.eval() with torch.no_grad():output torch.squeeze(model(img))predict torch.softmax(output, dim0)# 获得最大可能性索引predict_cla torch.argmax(predict).numpy()print(索引为, predict_cla) print(预测结果为{},置信度为: {}.format(name[predict_cla], predict[predict_cla].item())) plt.show()总结 Xception又称为 Extreme Inception是一种卷积神经网络架构在 2016 年由 Google 提出它的名字是由 ‘Extreme’ 和 ‘Inception’ 两个词汇组成的。Xception 基于 Inception V3 模型基础进行改进使用深度可分离卷积来代替传统的卷积从而更加有效地减少了模型的参数数量和计算复杂度。在传统的 Inception 模型中每个计算单元采用了两个卷积层一个 1x1 的卷积层用于降低特征图的通道数紧接着是一个 3x3 的卷积层用于进行特征提取。而 Xception 则将 1x1 和 3x3 卷积逐次分开使用了深度可分离卷积作为基本的计算单元。深度可分离卷积将标准卷积分解为两部分首先使用深度卷积来处理每个输入通道然后再使用 1x1 的逐点卷积来融合通道从而获得与标准卷积近似的特征提取效果。而深度可分离卷积相较于标准卷积而言可以明显降低参数量和训练计算量。而使用深度可分离卷积单元取代了传统的卷积操作之后Xception模型在计算效率模型大小上都相比 Inception V3 有大幅的提升。总之Xception模型的优势是在极大的减少了网络参数量和计算复杂度的同时可以保持卓越的性能表现。因此Xception模型已经被广泛地应用与图像分类、目标检测等任务中。
http://www.w-s-a.com/news/391824/

相关文章:

  • 中山网站建设哪家便宜在中国做外国网站怎么收钱
  • 网站优化大计孝感注册公司
  • 设计接单app平台有哪些在线网站seo诊断
  • 兰州网站建设推广现代营销手段有哪些
  • 郴州网站seo优化网络安全哪个培训班比较好
  • 做网站需要记哪些代码企业网站建设思路
  • 重庆自助建站模板网络服务器配置与管理
  • 外贸网站怎样做小程序买量平台
  • 中山精品网站建设机构海外留学网站建设方案
  • 长春网站建设工作如何取消wordpress页脚
  • 忻府网站建设排名网络管理系统官网
  • 张家港外贸网站建设国医堂网站平台建设
  • 水冶那里有做网站的对于网站链接优化有哪些建议
  • 宝安中心地铁站是几号线化妆品网站做的好的
  • 海宁营销型网站设计企业融资是什么意思
  • 淘宝客做网站要钱吗网站开发试题库
  • 10g空间网站做视频网站网站建设找超速云
  • 一元购网站怎么做企业网站源码cms
  • 域名不变 网站改版临沂企业网站建站模板
  • 天河网站建设信科网络外包公司和公司直招哪个好
  • 网站制作哈尔滨聊天系统源码
  • 网站建设朋友圈素材青白江建设网站
  • 红酒网站设计软件设计文档
  • 如何创建网站目录网站申请支付宝接口
  • 网站做区块链然后往里面投钱品牌设计公司收费标准
  • 2022互联网+创新创业项目呼和浩特企业网站排名优化
  • 电子商务类网站建设山西自助建站系统怎么用
  • odoo做网站网站设置专栏有什么好处
  • 局域网内个人网站建设查询企业的网站有哪些
  • 网站建设属于技术开发吗网页制作团队