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

带后台的php网站模板海外网站服务器网址

带后台的php网站模板,海外网站服务器网址,丽水做网站企业,项目管理系统开发目录 一、准备 1#xff09;使用pytorch 2#xff09;安装pytorch 3#xff09;准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1#xff09;导入库 2#xff09;数据预处理 3#xff09;加载数据 4#xff09;构建一个卷积神经网络 5#xff0…目录 一、准备 1使用pytorch 2安装pytorch 3准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1导入库 2数据预处理 3加载数据 4构建一个卷积神经网络 5模型训练 6模型测试 四、测试结果  五、模型导出 1保存模型的状态参数 2保存完整模型 六、总结 一、准备 1使用pytorch 为什么建议使用pytorch来构建卷积神经网络呢因为pytorch是基于python开发的一个神经网络工具包它已经实现了激活函数定义、权重矩阵定义、卷积计算、正向传播、反向传播、权重矩阵更新等神经网络的基本操作而不需要我们再去编写代码实现这些功能只需调用相应的函数就可以搭建好我们所需的网络结构。pytorch极大方便了我们构建神经网络加快了神经网络开发速度我们只需要关注网络的结构层次而不用关心所建立的网络具体训练和预测过程。 2安装pytorch pytorch有CPU版和GPU版GPU版需要使用到英伟达的显卡来加快网络速度安装过程也稍显复杂。本文重点是对python卷积神经网络示例解析因此安装CPU版。在pycharm开发工具的终端中直接执行命令pip install torch torchvision torchaudio即可完成pytorch的CPU版本安装。 3准备训练和测试资源 因为使用pytorch开发卷积神经网络实现人脸识别pytorch对数据存放有一定要求因此需要将相关资源放在特定的目录结构下。训练目录和测试目录结构如下图所示在文件夹中放入相应的图片资源即可。文件路径可以自行定义但是同一个人的照片必须放在同一个文件夹下pytorch根据该文件夹的名称自动将相应的图片资源归于一类。 二、卷积神经网络的基本结构 一个简单的卷积神经网络包括输入层、卷积层、池化层、扁平化层和全连接层。网络的复杂度体现在卷积、池化层的大小和数量上。卷积神经网络主要用于处理有大量数据输入的情景如图像识别是最好的例子可以极大减少运算量。下面以一个人脸识别的实际例子详细讲解卷积神经网络的搭建流程。 三、代码实现 1导入库 使用PyCharm工具新建一个.py文件在文件中导入下面需要使用到的相关库。在导入下面的库前需要确保已经安装好了pytorch相关依赖包。 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader 2数据预处理 以下定义了一组针对图片进行预处理的方法包括3个。第一个是将图像调整为100*100像素大小这样我们就可以输入任何大小图片并能保证数据输入到网络中的大小是一致的。第二个是将图像数据转换为张量格式这时pytorch自定义的一种数据格式可以简单理解为类似于多维向量。第三个是对图像进行归一化处理其目的是使数据的均值为 0标准差为 1。这样做可以加速模型的训练过程提高模型的稳定性和收敛速度。函数参数如下 mean一个长度为 3 的列表分别代表图像三个通道RGB的均值。这里 [0.485, 0.456, 0.406] 是在 ImageNet 数据集上统计得到的三个通道的均值。 std一个长度为 3 的列表分别代表图像三个通道RGB的标准差。[0.229, 0.224, 0.225] 是在 ImageNet 数据集上统计得到的三个通道的标准差。 参数的取值可以直接使用上面提供的经验值。对于输入图像的每个像素RGB值 归一化后的像素RGB值 按照以下公式计算 其中mean 和 std 分别是对应通道的均值和标准差。 transform transforms.Compose([transforms.Resize((100, 100)), # 调整图像大小transforms.ToTensor(), # 将图像转换为张量transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) # 归一化 ]) 3加载数据 使用dataset.ImageFolder()加载需要的训练图像和测试凸显数据。这里的数据路径需要注意并没有到具体的文件名。比如在D:/zhaopian/train目录下程序会自动读取该目录下的子文件夹并将子文件夹中的图像数据归集到以该子文件夹命名的类别中。参数transformtransform就是调用上述第二步定义的数据预处理方法集在读取每一张图像数据时将自动依次执行上述3个方法。并将最终转换好的数据返回。 创建数据加载器是为了便于网络训练时分批次加载数据避免一次加载所有图像数据导致内存不足。 batch_size32指定每个批次中包含的数据样本数量。这里设置为 32表示每次从 train_dataset 中取出 32 个样本组成一个批次进行训练。batch_size 的选择会影响模型的训练速度和性能较大的 batch_size 可以加快训练速度但可能会导致内存不足较小的 batch_size 可以增加模型的泛化能力但训练速度会变慢。 shuffleTrue一个布尔值用于指定是否在每个训练周期epoch开始时打乱数据集的顺序。设置为 True 可以增加数据的随机性避免模型学习到数据的特定顺序有助于提高模型的泛化能力。 train_dataset datasets.ImageFolder(rootD:/zhaopian/train, transformtransform) test_dataset datasets.ImageFolder(rootD:/zhaopian/test, transformtransform) all_samples test_dataset.samples print(数据集中的类别:, train_dataset.classes)# 创建数据加载器 train_loader DataLoader(train_dataset, batch_size32, shuffleTrue) test_loader DataLoader(test_dataset, batch_size32, shuffleFalse) 4构建一个卷积神经网络 自定义一个卷积神经网络类FaceCNN继承自nn.Module。该网络包含两个卷积层两个池化层两个全连接层。在卷积层和全连接层之间均使用了相同的激活函数ReLU 函数 nn.Conv2d(3, 16, kernel_size3, padding1) 的作用是定义一个二维卷积层参数3表示输入的数据是3个通道这里对应的是彩色图像的RGB三组数据即每张图会有3个100*100的矩阵输入到该卷积层中。参数16表示该卷积层有16个卷积核每个核的大小均是3*3参数kernel_size3确定的的矩阵这16个3*3的卷积核初始值是随机的它的值是通过模型训练最终确定的也就是神经网络中的权重矩阵。定义16个卷积核意味着什么呢当一幅彩色图像输入该卷积层时该图像有3组矩阵每组矩阵与一个卷积核进行卷积得到3个卷积后的矩阵然后在将这3个卷积后的矩阵对应位置取平均值得到一个最终的卷积均值矩阵。16个卷积核依次执行上述操作则经过该卷积层后会得到16个卷积均值矩阵。参数padding1表示对输入数据进行扩充1表示在数据四周加一行填充的目的通常是为了保持输入和输出特征图的尺寸一致。那么经过该卷积层后最终会得到16个100*100的卷积均值矩阵。 函数nn.MaxPool2d(2)的作用是定义一个2*2的二维池化层该池化层输出池中的最大值。在最大池化操作中池化窗口会在输入特征图上滑动对每个窗口内的元素进行操作。这里设置为 2表示使用一个 2x2 的池化窗口。当池化窗口在特征图上滑动时会选取每个 2x2 区域内的最大值作为该区域的输出值。此处需要注意的是经过2*2的二维池化层后输出的矩阵变为了50*50因为池化层的步幅等于它的大小这与卷积不同卷积默认步幅为1。 函数nn.Conv2d(16, 32, kernel_size3, padding1) 用于定义第二个二维卷积层。在该卷积层中前面两个参数分别是16和32,16对应的是前面的16个卷积核因为一幅图像经过第一层卷积后会输出16组数据所以此处第二层卷积时输入的数据就是16组。32表示第二层卷积后输出32组50*50的矩阵。 函数nn.Linear(32 * 25 * 25, 128)的作用是定义一个全连接层全连接层的每个神经元都与前一层的所有神经元相连接通过对输入进行线性变换加权求和并加上偏置实现从输入特征到输出特征的映射。第一个参数32 * 25 * 2520000表示输入数据的数量128表示输出数据的数量。全连接层线性变换公式为 其中 x是输入向量W 是权重矩阵b 是偏置向量 y是输出向量。权重矩阵W的形状为 (20000, 128) b的形状为 (128,1)。W和b都是在模型训练中需要更新的矩阵。 在建立的神经网络中还定义了前向传播函数forward()它由开发者自行设计数据在网络中传播的方向。图像数据首先经过第一个卷积层然后通过激活函数再进入第一个池化层随后依次进入第二个卷积层第二个激活函数第二个池化层。x x.view(-1, 32 * 25 * 25)的作用是将得到的数据展平为一维数据。从前面的输出可知x是一组由32个25*25矩阵组成的数据集x.view会将该数据集整合为一个一维数组数组的元素总量保持不变。 数据在经过展平后进入了第一全连接层由网络结构可知第一个全连接层输出的是一个128个元素的数组数据量被极大压缩了。然后再次经过激活函数随后进入第二个全连接层第二个全连接层输出的数组由n个元素组成nlen(train_dataset.classes)就是我们训练模型时提供的n个人数。但需要注意的是此处输出的结果与人脸识别并无直接关系我们需要对该结果进行进一步处理让它与人脸对应起来。 class FaceCNN(nn.Module):def __init__(self):super(FaceCNN, self).__init__()self.conv1 nn.Conv2d(3, 16, kernel_size3, padding1) # 定义第一个二维卷积层self.relu1 nn.ReLU() # 定义第一个激活函数self.pool1 nn.MaxPool2d(2) # 定义第一个二维池化层self.conv2 nn.Conv2d(16, 32, kernel_size3, padding1) # 定义第二个二维卷积层self.relu2 nn.ReLU() # 定义第二个激活函数self.pool2 nn.MaxPool2d(2) # 定义第二个二维池化层self.fc1 nn.Linear(32 * 25 * 25, 128) # 定义第一个全连接层展平后输出128个特征量self.relu3 nn.ReLU() # 定义第三个激活函数self.fc2 nn.Linear(128, len(train_dataset.classes)) # 定义第二个全连接层展平后输出n个特征量n为人数def forward(self, x):x self.pool1(self.relu1(self.conv1(x)))x self.pool2(self.relu2(self.conv2(x)))x x.view(-1, 32 * 25 * 25)x self.relu3(self.fc1(x))x self.fc2(x)return x 5模型训练 首先用自己定义卷积神经网络类实例化一个对象。然后定义一个损失函数这里直接使用了pytorch库中提供的交叉熵损失函数对象交叉熵损失函数Cross-Entropy Loss是分类问题中常用的一种损失函数尤其适用于多分类任务。它能够有效衡量模型预测的概率分布与真实标签的概率分布之间的差异。该函数的具体实现比较复杂如果不做算法研究可以暂时不用管其具体实现只需要知道在分类问题中适用该函数。 optimizer optim.Adam(model.parameters(), lr0.001) 这行代码在 PyTorch 中用于创建一个 Adam 优化器对象 optimizer该优化器将用于更新模型 model 的参数。AdamAdaptive Moment Estimation是一种常用的优化算法它结合了 AdaGrad 和 RMSProp 两种算法的优点。Adam 算法能够自适应地调整每个参数的学习率同时利用梯度的一阶矩估计均值和二阶矩估计方差来更新参数。它具有收敛速度快、对不同类型的数据集和模型都有较好表现等优点因此在深度学习中得到了广泛应用。我们同样也不需要去关心它的具体实现PyTorch已经帮我们完成了相应的操作。其中的参数定义如下 model.parameters()这是 optim.Adam 的第一个参数它是一个生成器用于返回模型 model 中所有需要更新的参数。在 PyTorch 中模型的参数通常是可学习的张量通过调用 model.parameters() 可以获取这些参数优化器将根据这些参数的梯度信息来更新它们。 lr0.001lr 是学习率learning rate的缩写它是 optim.Adam 的一个重要超参数用于控制每次参数更新的步长。学习率决定了模型在训练过程中朝着损失函数最小值前进的速度。这里将学习率设置为 0.001表示每次更新参数时参数的变化量是梯度乘以 0.001。如果学习率设置得过大模型可能会跳过损失函数的最小值导致无法收敛如果学习率设置得过小模型的训练速度会变得很慢。 # 初始化模型 model FaceCNN()# 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001)# 训练模型 num_epochs 20 # 训练10次 for epoch in range(num_epochs):model.train() # 将模型设置为训练模式。running_loss 0.0for i, (images, labels) in enumerate(train_loader):optimizer.zero_grad() # 每次反向传播之前将优化器中所有参数的梯度清零outputs model(images) # 自动调用模型的 forward 方法loss criterion(outputs, labels) # 计算损失值loss.backward() # 调用 loss.backward() 开始反向传播过程计算每个可训练参数的梯度并将这些梯度存储在参数的 .grad 属性中。optimizer.step() # 优化器会根据存储在参数 .grad 属性中的梯度按照指定的优化算法更新模型的参数。running_loss loss.item() 6模型测试 模型测试的代码实现如下。测试时首先将模型设置为评估模式在这里同样使用批量传入测试图像数据的方式。 _, predicted torch.max(outputs.data, 1)用于找出在模型输出的结果outputs.data中每一行数据的最大值在该行中的索引位置torch.max 函数的第二个参数指定了在哪个维度上进行最大值查找。这里设置为 1表示在每一行即每个样本上查找最大值。需要进一步说明的是由于我们采用批量处理的方式outputs.data应是一个二维数组每一行表示模型对一张图的处理结果。根据前面网络结构定义可知若是输入3个人的人脸照片则每一行应该有3个元素。这里取最大值是因为模型输出的结果表征的是模型预测的概率概率越大说明输入图像是对应人脸的概率越大。而对应的人脸在labels中表征在本例中输入3个人的照片则它是一个包含3个元素[0,1,2]的数组每个值对应一个人。因此 torch.max找到最大值在每一行中的索引位置后该位置也就表征了对应的人。 # 测试模型 model.eval() # 将模型切换到评估模式。 correct 0 total 0 with torch.no_grad(): # 不计算导数for index, (images, labels) in enumerate(test_loader):outputs model(images)_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()labels_array labels.numpy()predicted_array predicted.numpy()# 计算当前批次的起始索引start_idx index * test_loader.batch_size# 计算当前批次的结束索引end_idx start_idx images.size(0)# 获取当前批次的图像文件路径batch_samples all_samples[start_idx:end_idx]# 提取图像文件名称batch_image_names [sample[0].split(\\)[2] for sample in batch_samples]for i in range(len(predicted_array)):print(f图名: {batch_image_names[i]}, f实际名字: {train_dataset.classes[labels_array[i]]},f预测名字: {train_dataset.classes[predicted_array[i]]}) print(f总测试数量: {total}, f正确识别数量: {correct}) print(fTest Accuracy: {100 * correct / total}%) 四、测试结果  从网络上随机下载了一些公开图片对网路进行了训练和测试得到结果如下。实际看神经网络的识别准确率还是比较高的。模型的完整代码和使用的资源可在这里下载。 五、模型导出 在完成神经网络模型训练后需要将训练好的模型导出以供后续使用具体方法有两种。 1保存模型的状态参数 在训练后的模型下加入下列代码则模型中的所有参数均会保存到对应的.pth文件中。 torch.save(model.state_dict(), model_state_dict.pth) 在重新使用模型时需要再次实例化模型对象然后加载保存的模型参数。因此重新使用时我们需要知道模型的结构定义即重写FaceCNN类。 # 加载模型的状态字典 loaded_model FaceCNN() loaded_model.load_state_dict(torch.load(model_state_dict.pth)) loaded_model.eval() # 设置为评估模式 2保存完整模型 我们也可以直接保存完整的模型文件在重新使用时直接加载该模型即可。这种方式简单但缺少灵活性。 # 保存整个模型 torch.save(model, whole_model.pth)# 加载整个模型 loaded_model torch.load(whole_model.pth) loaded_model.eval() # 设置为评估模式 六、总结 通过一个人脸识别示例详细说明了利用pytorch模块搭建卷积神经网络的实现流程并对代码进行了逐行解释。pytorch极大方便了神经网络开发让开发人员可以不用关注网络中具体的算法实现而更加侧重在网络模型搭建上。在本例试验测试中模型的训练次数和网络结构参数的调整均会对图像识别的准确造成大幅度影响仍需要通过大量测试优化网络结构参数。
http://www.dnsts.com.cn/news/96093.html

相关文章:

  • 网站备案 个体工商户muse做网站
  • php+mysql网站开发全程实例pdf评论凡科网站建设怎么样
  • 研究生做家教什么网站wordpress 文字插件下载
  • 江苏网络公司网站建设php网站开发视频教程
  • 温州住房与城乡建设部网站网站商城建设基本流程
  • 宜昌网站建设市场qq网站登录
  • 无锡网站建设哪家做的比较好seo优化推广公司
  • 餐饮行业做网站有什么好处知乎设计国外网站有哪些
  • 购买天猫店铺网站网站制度建设存在的问题
  • 找网站公司制作网站哪些网上订餐的网站做的好
  • 网站换域名影响吗wordpress应用的主题修改教程
  • 申请一个网站需要怎么做手机网页设计公司
  • 做好网站 怎么要版权消防设备网站建设
  • 嵌入字体的网站做景观设计比赛的网站
  • 做爰视频免费观看网站深圳安居房最新房源
  • 网站建设案例信息wordpress设置固定连接失败
  • 哈尔滨网站设计公司地址wordpress主题检测
  • 公司网站要多大空间教做吃的网站
  • 大众点评网站团购怎么做济南川芎网站建设
  • 网站首页跳出弹窗化妆品网站建设规划书范文
  • 外链网盘网站iis 发布网站 500
  • 网站域名空间续费合同深圳网站制作的公司哪家好
  • 做微网站需要域名吗注册网站好的平台
  • 网站右侧广告站外推广网站
  • 一级a做爰片不卡免费网站房地产公司起名字大全免费
  • wordpress网站怎样google浏览器官方下载
  • 营销网站售后调查harmonyos开发语言
  • 苏州新闻seo sem是什么职位
  • 假淘宝网站怎么做室内设计学校有哪些
  • 企业网站设计服务wordpress 两边