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

哪个网站可以做店招济南手机网站建设电话

哪个网站可以做店招,济南手机网站建设电话,品牌策划大赛获奖案例,网页设计实验报告实验原理文章目录 引言1. 环境准备和数据加载1.1 下载MNIST数据集1.2 数据可视化 2. 数据预处理3. 设备配置4. 构建卷积神经网络模型5. 训练和测试函数5.1 训练函数5.2 测试函数 6. 模型训练和评估6.1 初始化损失函数和优化器6.2 训练过程 7. 关键点解析8. 完整代码9. 总结 引言 手写数… 文章目录 引言1. 环境准备和数据加载1.1 下载MNIST数据集1.2 数据可视化 2. 数据预处理3. 设备配置4. 构建卷积神经网络模型5. 训练和测试函数5.1 训练函数5.2 测试函数 6. 模型训练和评估6.1 初始化损失函数和优化器6.2 训练过程 7. 关键点解析8. 完整代码9. 总结 引言 手写数字识别是计算机视觉和深度学习领域的经典入门项目。本文将详细介绍如何使用PyTorch框架构建一个卷积神经网络(CNN)来实现MNIST手写数字识别任务。我们将从数据加载、模型构建到训练和测试一步步解析整个过程。 1. 环境准备和数据加载 首先我们需要导入必要的PyTorch模块 import torch from torch import nn from torch.utils.data import DataLoader from torchvision import datasets from torchvision.transforms import ToTensor1.1 下载MNIST数据集 MNIST数据集包含60,000个训练样本和10,000个测试样本每个样本都是一个28x28像素的灰度手写数字图像。 # 下载训练数据集 training_data datasets.MNIST(rootdata,trainTrue,downloadTrue,transformToTensor(), )# 下载测试数据集 test_data datasets.MNIST(rootdata,trainFalse,downloadTrue,transformToTensor(), )1.2 数据可视化 我们可以使用matplotlib库来查看数据集中的一些样本 from matplotlib import pyplot as pltfigure plt.figure() for i in range(9):img, label training_data[i59000] # 提取后几张图片figure.add_subplot(3,3,i1)plt.title(label)plt.axis(off)plt.imshow(img.squeeze(), cmapgray) plt.show()2. 数据预处理 为了高效训练模型我们需要使用DataLoader将数据集分批次加载 train_dataloader DataLoader(training_data, batch_size64) test_dataloader DataLoader(test_data, batch_size64)3. 设备配置 PyTorch支持在CPU、NVIDIA GPU和苹果M系列芯片上运行我们可以自动检测最佳可用设备 device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu print(fUsing {device} device)4. 构建卷积神经网络模型 我们定义一个CNN类来实现手写数字识别 class CNN(nn.Module):def __init__(self):super(CNN, self).__init__()self.conv1 nn.Sequential(nn.Conv2d(1, 8, 3, 1, 1), # (8,28,28)nn.ReLU(),nn.MaxPool2d(2), # (8,14,14))self.conv2 nn.Sequential(nn.Conv2d(8, 16, 3, 1, 1), # (16,14,14)nn.ReLU(),nn.MaxPool2d(2), # (16,7,7))self.out nn.Linear(16*7*7, 10)def forward(self, x):x self.conv1(x)x self.conv2(x)x x.view(x.size(0), -1) # flatten操作output self.out(x)return outputmodel CNN().to(device)这个CNN模型包含 两个卷积层每个卷积层后接ReLU激活函数和最大池化层一个全连接输出层输入大小(1,28,28)输出大小10对应0-9的数字类别 5. 训练和测试函数 5.1 训练函数 def train(dataloader, model, loss_fn, optimizer):model.train()batch_size_num 1for 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()if batch_size_num % 100 0:print(floss: {loss.item():7f} [number:{batch_size_num}])batch_size_num 15.2 测试函数 def Test(dataloader, model, loss_fn):size len(dataloader.dataset)num_batches len(dataloader)model.eval()test_loss, correct 0, 0with torch.no_grad():for X, y in dataloader:X, y X.to(device), y.to(device)pred model(X)test_loss loss_fn(pred, y).item()correct (pred.argmax(1) y).type(torch.float).sum().item()test_loss / num_batchescorrect / sizeprint(fTest result: \n Accuracy:{(100*correct)}%, Avg loss:{test_loss})6. 模型训练和评估 6.1 初始化损失函数和优化器 loss_fn nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr0.01)6.2 训练过程 # 初始训练和测试 train(train_dataloader, model, loss_fn, optimizer) Test(test_dataloader, model, loss_fn)# 多轮训练 epochs 10 for t in range(epochs):print(fepoch {t1}\n---------------)train(train_dataloader, model, loss_fn, optimizer) print(Done!)# 最终测试 Test(test_dataloader, model, loss_fn)7. 关键点解析 数据转换使用ToTensor()将图像数据转换为PyTorch张量并自动归一化到[0,1]范围。 批处理DataLoader的batch_size参数控制每次训练使用的样本数量影响内存使用和训练速度。 模型结构 卷积层提取空间特征ReLU激活函数引入非线性最大池化层降低特征图尺寸全连接层输出分类结果 训练模式切换model.train()和model.eval()分别用于训练和测试阶段影响某些层(如Dropout和BatchNorm)的行为。 优化过程Adam优化器结合了动量法和自适应学习率的优点通常能获得较好的训练效果。 8. 完整代码 import torch from torch import nn #导入神经网络模块 from torch.utils.data import DataLoader #数据包管理工具打包数据 from torchvision import datasets #封装了很多与图像相关的模型数据集 from torchvision.transforms import ToTensor #数据转换张量将其他类型的数据转换为tensor张量numpy array下载训练数据集包含训练图片标签 training_data datasets.MNIST( #跳转到函数的内部源代码pycharm按下ctrl 鼠标点击rootdata, #表示下载的手写数字 到哪个路径。60000trainTrue, #读取下载后的数据中的训练集downloadTrue, #如果你之前已经下载过了就不用下载transformToTensor(), #张量图片是不能直接传入神经网络模型) #对于pytorch库能够识别的数据一般是tensor张量下载测试数据集包含训练图片标签 test_data datasets.MNIST( #跳转到函数的内部源代码pycharm按下ctrl 鼠标点击rootdata, #表示下载的手写数字 到哪个路径。60000trainFalse, #读取下载后的数据中的训练集downloadTrue, #如果你之前已经下载过了就不用下载transformToTensor(), #Tensor是在深度学习中提出并广泛应用的数据类型) #Numpy数组只能在CPU上运行。Tensor可以在GPU上运行。这在深度学习应用中可以显著提高计算速度。 print(len(training_data))展示手写数字图片把训练集中的59000张图片展示 from matplotlib import pyplot as plt figure plt.figure() for i in range(9):img,label training_data[i59000] #提取第59000张图片figure.add_subplot(3,3,i1) #图像窗口中创建多个小窗口小窗口用于显示图片plt.title(label)plt.axis(off) #plt.show(I) 显示矢量plt.imshow(img.squeeze(),cmapgray) #plt.imshow()将Numpy数组data中的数据显示为图像并在图形窗口中显示a img.squeeze() #img.squeeze()从张量img中去掉维度为1的如果该维度的大小不为1则张量不会改变 plt.show()创建数据DataLoader数据加载器 # batch_size:将数据集分为多份每一份为batch_size个数据 # 优点可以减少内存的使用提高训练速度train_dataloader DataLoader(training_data,batch_size64) test_dataloader DataLoader(test_data,batch_size64)判断当前设备是否支持GPU其中mps是苹果m系列芯片的GPU device cuda if torch.cuda.is_available() else mps if torch.backends.mps.is_available() else cpu print(fUsing {device} device) #字符串的格式化CUDA驱动软件的功能pytorch能够去执行cuda的命令 # 神经网络的模型也需要传入到GPU1个batch_size的数据集也需要传入到GPU才可以进行训练 定义神经网络 类的继承这种方式 class CNN(nn.Module): #通过调用类的形式来使用神经网络神经网络的模型nn.mdouledef __init__(self): #输入大小(1,28,28)super(CNN,self).__init__() #初始化父类self.conv1 nn.Sequential( #将多个层组合成一起创建了一个容器将多个网络组合在一起nn.Conv2d( # 2d一般用于图像3d用于视频数据多一个时间维度1d一般用于结构化的序列数据in_channels1, # 图像通道个数1表示灰度图确定了卷积核 组中的个数out_channels8, # 要得到多少个特征图卷积核的个数kernel_size3, # 卷积核大小 3×3stride1, # 步长padding1, # 一般希望卷积核处理后的结果大小与处理前的数据大小相同效果会比较好), # 输出的特征图为(8,28,28)nn.ReLU(), # Relu层不会改变特征图的大小nn.MaxPool2d(kernel_size2), # 进行池化操作(2×2操作),输出结果为(8,14,14))self.conv2 nn.Sequential(nn.Conv2d(8,16,3,1,1), #输出(16,14,14)nn.ReLU(), #Relu层 (16,14,14)nn.MaxPool2d(kernel_size2), #池化层输出结果为(16,7,7))self.out nn.Linear(16*7*7,10) # 全连接层得到的结果def forward(self,x): #前向传播你得告诉它 数据的流向 是神经网络层连接起来函数名称不能改x self.conv1(x)x self.conv2(x)x x.view(x.size(0),-1) # flatten操作结果为(batch_size,64 * 7 * 7)output self.out(x)return output model CNN().to(device) #把刚刚创建的模型传入到GPU print(model)def train(dataloader,model,loss_fn,optimizer):model.train() #告诉模型我要开始训练模型中w进行随机化操作已经更新w在训练过程中w会被修改的 # pytorch提供2种方式来切换训练和测试的模式分别是model.train() 和 mdoel.eval() # 一般用法是在训练开始之前写上model.train(),在测试时写上model.eval()batch_size_num 1for X,y in dataloader: #其中batch为每一个数据的编号X,y X.to(device),y.to(device) #把训练数据集和标签传入cpu或GPUpred model.forward(X) # .forward可以被省略父类种已经对此功能进行了设置loss loss_fn(pred,y) # 通过交叉熵损失函数计算损失值loss# Backpropagation 进来一个batch的数据计算一次梯度更新一次网络optimizer.zero_grad() # 梯度值清零loss.backward() # 反向传播计算得到每个参数的梯度值woptimizer.step() # 根据梯度更新网络w参数loss_value loss.item() # 从tensor数据种提取数据出来tensor获取损失值if batch_size_num %100 0:print(floss: {loss_value:7f} [number:{batch_size_num}])batch_size_num 1def Test(dataloader,model,loss_fn):size len(dataloader.dataset) #10000num_batches len(dataloader) # 打包的数量model.eval() #测试w就不能再更新test_loss,correct 0,0with torch.no_grad(): #一个上下文管理器关闭梯度计算。当你确认不会调用Tensor.backward()的时候for X,y in dataloader:X,y X.to(device),y.to(device)pred model.forward(X)test_loss loss_fn(pred,y).item() #test_loss是会自动累加每一个批次的损失值correct (pred.argmax(1) y).type(torch.float).sum().item()a (pred.argmax(1) y) #dim1表示每一行中的最大值对应的索引号dim0表示每一列中的最大值对应的索引号b (pred.argmax(1) y).type(torch.float)test_loss / num_batches #能来衡量模型测试的好坏correct / size #平均的正确率print(fTest result: \n Accuracy:{(100*correct)}%, Avg loss:{test_loss})loss_fn nn.CrossEntropyLoss() #创建交叉熵损失函数对象因为手写字识别一共有十种数字输出会有10个结果 # optimizer torch.optim.Adam(model.parameters(),lr0.01) #创建一个优化器SGD为随机梯度下降算法 # # params要训练的参数一般我们传入的都是model.parameters() # # lr:learning_rate学习率也就是步长 # # # loss表示模型训练后的输出结果与样本标签的差距。如果差距越小就表示模型训练越好越逼近真实的模型 train(train_dataloader,model,loss_fn,optimizer) #训练1次完整的数据。多轮训练 Test(test_dataloader,model,loss_fn)epochs 10 for t in range(epochs):print(fepoch {t1}\n---------------)train(train_dataloader,model,loss_fn,optimizer) print(Done!) Test(test_dataloader,model,loss_fn)9. 总结 通过本文我们学习了如何使用PyTorch实现一个完整的手写数字识别项目。从数据加载、模型构建到训练和评估每个步骤都展示了PyTorch框架的简洁和强大。这个简单的CNN模型在MNIST数据集上可以达到很高的准确率为进一步学习更复杂的计算机视觉任务打下了良好基础。 未来可以尝试 调整网络结构(增加层数、改变通道数)尝试不同的优化器和学习率添加数据增强技术在更复杂的数据集上应用类似方法 希望这篇教程能帮助你入门PyTorch和计算机视觉领域
http://www.dnsts.com.cn/news/114357.html

相关文章:

  • wordpress菜单链接地址seo网站优化教程
  • 张槎建网站公司惠东网站设计
  • 广告人网站网站怎么做二维码
  • 学校网站建设培训心得网站建设制度制定情况
  • 优秀网站设计的标准跳转到手机网站代码
  • 建设网站 法律责任做装潢网站
  • 福州网站建设费用企业年金什么时候可以提取
  • 南通专业网站制作公司深圳教育网站建设
  • 网站基础建设和管理wordpress查看ip帐号密码
  • 小网站模板下载地址网站域名备案认证
  • 建设网站实训报告网站制作 手机
  • 上海单位网站建设泉州网站建设怎么收费
  • 房山做网站公司wordpress一句话木马
  • 开封市住房和城乡建设网站专业做淘宝网站公司
  • 现在网站后台有哪几种模板形式陇城科技网站建设
  • 网站服务器租用价格表海淀做网站的网络公司
  • 三亚网站运营托管介绍网站建设公司美工如何找
  • 淡水网络公司做网站wordpress英文改为中文
  • 南充哪里做网站wordpress模板位置
  • 天津医疗行业网站建设国内酒店网站建设
  • 河南省监理协会官方网站建设遵义网络科技公司
  • 自己制作网页的网站网页设计作业选材
  • psd网站首页图片wordpress ftp账户
  • wordpress怎么做响应式网站曲靖网站网站建设
  • 自己如何制作网站营销策划推广公司
  • 宣城网站建设 有限公司wordpress 批量分类
  • windows和linux 做网站wordpress flv
  • 试用网站 源码做婚姻网站赚钱
  • 网站风险解除如何搜名字搜到自己做的网站
  • 大连 做网站凡高网站建设