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

嘉兴简单建站网站开发人月薪

嘉兴简单建站,网站开发人月薪,绵阳网站设计公司,餐饮公司网站建设的特点Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练和测试训练代码… Pytorch | 从零构建MobileNet对CIFAR10进行分类 CIFAR10数据集MobileNet设计理念网络结构技术优势应用领域 MobileNet结构代码详解结构代码代码详解DepthwiseSeparableConv 类初始化方法前向传播 forward 方法 MobileNet 类初始化方法前向传播 forward 方法 训练和测试训练代码train.py测试代码test.py训练过程和测试结果 代码汇总mobilenet.pytrain.pytest.py 前面文章我们构建了AlexNet、Vgg、GoogleNet对CIFAR10进行分类 Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg对CIFAR10进行分类 Pytorch | 从零构建GoogleNet对CIFAR10进行分类 Pytorch | 从零构建ResNet对CIFAR10进行分类 这篇文章我们来构建MobileNet. CIFAR10数据集 CIFAR-10数据集是由加拿大高级研究所CIFAR收集整理的用于图像识别研究的常用数据集基本信息如下 数据规模该数据集包含60,000张彩色图像分为10个不同的类别每个类别有6,000张图像。通常将其中50,000张作为训练集用于模型的训练10,000张作为测试集用于评估模型的性能。图像尺寸所有图像的尺寸均为32×32像素这相对较小的尺寸使得模型在处理该数据集时能够相对快速地进行训练和推理但也增加了图像分类的难度。类别内容涵盖了飞机plane、汽车car、鸟bird、猫cat、鹿deer、狗dog、青蛙frog、马horse、船ship、卡车truck这10个不同的类别这些类别都是现实世界中常见的物体具有一定的代表性。 下面是一些示例样本 MobileNet MobileNet是由谷歌在2017年提出的一种轻量级卷积神经网络主要用于移动端和嵌入式设备等资源受限的环境中进行图像识别和分类任务以下是对其的详细介绍 设计理念 深度可分离卷积其核心创新是采用了深度可分离卷积Depthwise Separable Convolution来替代传统的卷积操作。深度可分离卷积将标准卷积分解为一个深度卷积Depthwise Convolution和一个逐点卷积Pointwise Convolution大大减少了计算量和模型参数同时保持了较好的性能。 网络结构 标准卷积层输入层为3通道的彩色图像首先经过一个普通的卷积层conv1将通道数从3变为32同时进行了步长为2的下采样操作以减小图像尺寸。深度可分离卷积层包含了一系列的深度可分离卷积层dsconv1至dsconv13这些层按照一定的规律进行排列通道数逐渐增加同时通过不同的步长进行下采样以提取不同层次的特征。池化层和全连接层在深度可分离卷积层之后通过一个自适应平均池化层avgpool将特征图转换为1x1的大小然后通过一个全连接层fc将特征映射到指定的类别数完成分类任务。 技术优势 模型轻量化通过深度可分离卷积的使用大大减少了模型的参数量和计算量使得模型更加轻量化适合在移动设备和嵌入式设备上运行。计算效率高由于减少了计算量MobileNet在推理时具有较高的计算效率可以快速地对图像进行分类和识别满足实时性要求较高的应用场景。性能表现较好尽管模型轻量化但MobileNet在图像识别任务上仍然具有较好的性能表现能够在保持较高准确率的同时大大降低模型的复杂度。 应用领域 移动端视觉任务广泛应用于各种移动端设备如智能手机、平板电脑等用于图像分类、目标检测、人脸识别等视觉任务。嵌入式设备视觉在嵌入式设备如智能摄像头、自动驾驶汽车等领域MobileNet可以为这些设备提供高效的视觉处理能力实现实时的图像分析和决策。物联网视觉应用在物联网设备中MobileNet可以帮助实现对图像数据的快速处理和分析为智能家居、智能安防等应用提供支持。 MobileNet结构代码详解 结构代码 import torch import torch.nn as nnclass DepthwiseSeparableConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1, biasFalse):super(DepthwiseSeparableConv, self).__init__()self.depthwise nn.Conv2d(in_channels, in_channels, kernel_size, stride, padding, groupsin_channels, biasbias)self.bn1 nn.BatchNorm2d(in_channels)self.relu1 nn.ReLU6(inplaceTrue)self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1, biasbias)self.bn2 nn.BatchNorm2d(out_channels)self.relu2 nn.ReLU6(inplaceTrue)def forward(self, x):out self.depthwise(x)out self.bn1(out)out self.relu1(out)out self.pointwise(out)out self.bn2(out)out self.relu2(out)return outclass MobileNet(nn.Module):def __init__(self, num_classes):super(MobileNet, self).__init__()self.conv1 nn.Conv2d(3, 32, kernel_size3, stride2, padding1, biasFalse)self.bn1 nn.BatchNorm2d(32)self.relu nn.ReLU6(inplaceTrue)self.dsconv1 DepthwiseSeparableConv(32, 64, stride1)self.dsconv2 DepthwiseSeparableConv(64, 128, stride2)self.dsconv3 DepthwiseSeparableConv(128, 128, stride1)self.dsconv4 DepthwiseSeparableConv(128, 256, stride2)self.dsconv5 DepthwiseSeparableConv(256, 256, stride1)self.dsconv6 DepthwiseSeparableConv(256, 512, stride2)self.dsconv7 DepthwiseSeparableConv(512, 512, stride1)self.dsconv8 DepthwiseSeparableConv(512, 512, stride1)self.dsconv9 DepthwiseSeparableConv(512, 512, stride1)self.dsconv10 DepthwiseSeparableConv(512, 512, stride1)self.dsconv11 DepthwiseSeparableConv(512, 512, stride1)self.dsconv12 DepthwiseSeparableConv(512, 1024, stride2)self.dsconv13 DepthwiseSeparableConv(1024, 1024, stride1)self.avgpool nn.AdaptiveAvgPool2d((1, 1))self.fc nn.Linear(1024, num_classes)def forward(self, x):out self.conv1(x)out self.bn1(out)out self.relu(out)out self.dsconv1(out)out self.dsconv2(out)out self.dsconv3(out)out self.dsconv4(out)out self.dsconv5(out)out self.dsconv6(out)out self.dsconv7(out)out self.dsconv8(out)out self.dsconv9(out)out self.dsconv10(out)out self.dsconv11(out)out self.dsconv12(out)out self.dsconv13(out)out self.avgpool(out)out out.view(out.size(0), -1)out self.fc(out)return out代码详解 以下是对上述代码的详细解释 DepthwiseSeparableConv 类 这是一个自定义的深度可分离卷积层类继承自 nn.Module。 初始化方法 参数说明 in_channels输入通道数指定输入数据的通道数量。out_channels输出通道数即卷积操作后输出特征图的通道数量。kernel_size卷积核大小默认为3用于定义卷积操作中卷积核的尺寸。stride步长默认为1控制卷积核在输入特征图上滑动的步长。padding填充大小默认为1在输入特征图周围添加的填充像素数量以保持特征图尺寸在卷积过程中合适变化。bias是否使用偏置默认为 False决定卷积层是否添加偏置项。 构建的层及作用 self.depthwise这是一个深度卷积层nn.Conv2d通过设置 groupsin_channels实现了深度可分离卷积中的深度卷积部分它对每个输入通道分别进行卷积操作有效地减少了计算量。self.bn1批归一化层nn.BatchNorm2d用于对深度卷积后的输出进行归一化处理加速模型收敛并提升模型的泛化能力。self.relu1激活函数层nn.ReLU6采用 ReLU6 激活函数输出值限定在0到6之间并且设置 inplaceTrue意味着直接在输入的张量上进行修改节省内存空间增加非线性特性。self.pointwise逐点卷积层nn.Conv2d卷积核大小为1用于将深度卷积后的特征图在通道维度上进行融合改变通道数到指定的 out_channels。self.bn2又是一个批归一化层对逐点卷积后的输出进行归一化处理。self.relu2同样是 ReLU6 激活函数层进一步增加非线性处理逐点卷积归一化后的结果。 前向传播 forward 方法 定义了数据在该层的前向传播过程 首先将输入 x 通过深度卷积层 self.depthwise 进行深度卷积操作得到输出特征图。然后将深度卷积的输出依次经过批归一化层 self.bn1 和激活函数层 self.relu1。接着把经过处理后的特征图通过逐点卷积层 self.pointwise 进行逐点卷积改变通道数等特征。最后再经过批归一化层 self.bn2 和激活函数层 self.relu2并返回最终的输出结果。 MobileNet 类 这是定义的 MobileNet 网络模型类同样继承自 nn.Module。 初始化方法 参数说明 num_classes分类的类别数量用于最后全连接层输出对应类别数的预测结果。 构建的层及作用 self.conv1普通的二维卷积层nn.Conv2d输入通道数为3通常对应RGB图像的三个通道输出通道数为32卷积核大小为3步长为2用于对输入图像进行初步的特征提取和下采样减少特征图尺寸同时增加通道数。self.bn1批归一化层对 conv1 卷积后的输出进行归一化。self.relu激活函数层采用 ReLU6 激活函数给特征图增加非线性。一系列的 self.dsconv 层从 dsconv1 到 dsconv13都是前面定义的深度可分离卷积层 DepthwiseSeparableConv 的实例它们逐步对特征图进行更精细的特征提取、通道变换以及下采样等操作不同的 dsconv 层有着不同的输入输出通道数以及步长设置以此构建出 MobileNet 网络的主体结构不断提取和融合特征逐步降低特征图尺寸并增加通道数来获取更高级、更抽象的特征表示。self.avgpool自适应平均池化层nn.AdaptiveAvgPool2d将输入特征图转换为指定大小 (1, 1) 的输出起到全局平均池化的作用进一步压缩特征图信息同时保持特征图的维度一致性方便后续全连接层处理。self.fc全连接层nn.Linear输入维度为1024与前面网络结构最终输出的特征维度对应输出维度为 num_classes用于将经过前面卷积和池化等操作得到的特征向量映射到对应类别数量的预测分数上实现分类任务。 前向传播 forward 方法 定义了 MobileNet 模型整体的前向传播流程 首先将输入 x 通过 conv1 进行初始卷积、bn1 进行归一化以及 relu 激活。然后依次通过各个深度可分离卷积层dsconv1 到 dsconv13逐步提取和变换特征。接着经过自适应平均池化层 self.avgpool将特征图压缩为 (1, 1) 大小。再通过 out.view(out.size(0), -1) 操作将特征图展平为一维向量其中 out.size(0) 表示批量大小-1 表示自动计算剩余维度大小使其展平。最后将展平后的特征向量通过全连接层 self.fc 得到最终的分类预测结果并返回。 训练和测试 训练代码train.py import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from models import * import matplotlib.pyplot as pltimport ssl ssl._create_default_https_context ssl._create_unverified_context# 定义数据预处理操作 transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10训练集 trainset torchvision.datasets.CIFAR10(root./data, trainTrue,downloadFalse, transformtransform) trainloader torch.utils.data.DataLoader(trainset, batch_size128,shuffleTrue, num_workers2)# 定义设备GPU优先若可用 device torch.device(cuda if torch.cuda.is_available() else cpu)# 实例化模型 model_name MobileNet if model_name AlexNet:model AlexNet(num_classes10).to(device) elif model_name Vgg_A:model Vgg(cfg_vggA, num_classes10).to(device) elif model_name Vgg_A-LRN:model Vgg(cfg_vggA-LRN, num_classes10).to(device) elif model_name Vgg_B:model Vgg(cfg_vggB, num_classes10).to(device) elif model_name Vgg_C:model Vgg(cfg_vggC, num_classes10).to(device) elif model_name Vgg_D:model Vgg(cfg_vggD, num_classes10).to(device) elif model_name Vgg_E:model Vgg(cfg_vggE, num_classes10).to(device) elif model_name GoogleNet:model GoogleNet(num_classes10).to(device) elif model_name ResNet18:model ResNet18(num_classes10).to(device) elif model_name ResNet34:model ResNet34(num_classes10).to(device) elif model_name ResNet50:model ResNet50(num_classes10).to(device) elif model_name ResNet101:model ResNet101(num_classes10).to(device) elif model_name ResNet152:model ResNet152(num_classes10).to(device) elif model_name MobileNet:model MobileNet(num_classes10).to(device)criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001)# 训练轮次 epochs 15def train(model, trainloader, criterion, optimizer, device):model.train()running_loss 0.0correct 0total 0for i, data in enumerate(trainloader, 0):inputs, labels data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs model(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss loss.item()_, predicted outputs.max(1)total labels.size(0)correct predicted.eq(labels).sum().item()epoch_loss running_loss / len(trainloader)epoch_acc 100. * correct / totalreturn epoch_loss, epoch_accif __name__ __main__:loss_history, acc_history [], []for epoch in range(epochs):train_loss, train_acc train(model, trainloader, criterion, optimizer, device)print(fEpoch {epoch 1}: Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%)loss_history.append(train_loss)acc_history.append(train_acc)# 保存模型权重每5轮次保存到weights文件夹下if (epoch 1) % 5 0:torch.save(model.state_dict(), fweights/{model_name}_epoch_{epoch 1}.pth)# 绘制损失曲线plt.plot(range(1, epochs1), loss_history, labelLoss, markero)plt.xlabel(Epoch)plt.ylabel(Loss)plt.title(Training Loss Curve)plt.legend()plt.savefig(fresults\\{model_name}_train_loss_curve.png)plt.close()# 绘制准确率曲线plt.plot(range(1, epochs1), acc_history, labelAccuracy, markero)plt.xlabel(Epoch)plt.ylabel(Accuracy (%))plt.title(Training Accuracy Curve)plt.legend()plt.savefig(fresults\\{model_name}_train_acc_curve.png)plt.close()测试代码test.py import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms from models import *import ssl ssl._create_default_https_context ssl._create_unverified_context # 定义数据预处理操作 transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10测试集 testset torchvision.datasets.CIFAR10(root./data, trainFalse,downloadFalse, transformtransform) testloader torch.utils.data.DataLoader(testset, batch_size128,shuffleFalse, num_workers2)# 定义设备GPU优先若可用 device torch.device(cuda if torch.cuda.is_available() else cpu)# 实例化模型 model_name MobileNet if model_name AlexNet:model AlexNet(num_classes10).to(device) elif model_name Vgg_A:model Vgg(cfg_vggA, num_classes10).to(device) elif model_name Vgg_A-LRN:model Vgg(cfg_vggA-LRN, num_classes10).to(device) elif model_name Vgg_B:model Vgg(cfg_vggB, num_classes10).to(device) elif model_name Vgg_C:model Vgg(cfg_vggC, num_classes10).to(device) elif model_name Vgg_D:model Vgg(cfg_vggD, num_classes10).to(device) elif model_name Vgg_E:model Vgg(cfg_vggE, num_classes10).to(device) elif model_name GoogleNet:model GoogleNet(num_classes10).to(device) elif model_name ResNet18:model ResNet18(num_classes10).to(device) elif model_name ResNet34:model ResNet34(num_classes10).to(device) elif model_name ResNet50:model ResNet50(num_classes10).to(device) elif model_name ResNet101:model ResNet101(num_classes10).to(device) elif model_name ResNet152:model ResNet152(num_classes10).to(device) elif model_name MobileNet:model MobileNet(num_classes10).to(device)criterion nn.CrossEntropyLoss()# 加载模型权重 weights_path fweights/{model_name}_epoch_15.pth model.load_state_dict(torch.load(weights_path, map_locationdevice))def test(model, testloader, criterion, device):model.eval()running_loss 0.0correct 0total 0with torch.no_grad():for data in testloader:inputs, labels data[0].to(device), data[1].to(device)outputs model(inputs)loss criterion(outputs, labels)running_loss loss.item()_, predicted outputs.max(1)total labels.size(0)correct predicted.eq(labels).sum().item()epoch_loss running_loss / len(testloader)epoch_acc 100. * correct / totalreturn epoch_loss, epoch_accif __name__ __main__:test_loss, test_acc test(model, testloader, criterion, device)print(f{model_name} Test)print(fLoad Model Weights From: {weights_path})print(fTest Loss: {test_loss:.4f}, Test Acc: {test_acc:.2f}%)训练过程和测试结果 训练过程损失函数变化曲线 训练过程准确率变化曲线 测试结果 代码汇总 项目github地址 项目结构 |--data |--models|--__init__.py|-mobilenet.py|--... |--results |--weights |--train.py |--test.pymobilenet.py import torch import torch.nn as nnclass DepthwiseSeparableConv(nn.Module):def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1, biasFalse):super(DepthwiseSeparableConv, self).__init__()self.depthwise nn.Conv2d(in_channels, in_channels, kernel_size, stride, padding, groupsin_channels, biasbias)self.bn1 nn.BatchNorm2d(in_channels)self.relu1 nn.ReLU6(inplaceTrue)self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1, biasbias)self.bn2 nn.BatchNorm2d(out_channels)self.relu2 nn.ReLU6(inplaceTrue)def forward(self, x):out self.depthwise(x)out self.bn1(out)out self.relu1(out)out self.pointwise(out)out self.bn2(out)out self.relu2(out)return outclass MobileNet(nn.Module):def __init__(self, num_classes):super(MobileNet, self).__init__()self.conv1 nn.Conv2d(3, 32, kernel_size3, stride2, padding1, biasFalse)self.bn1 nn.BatchNorm2d(32)self.relu nn.ReLU6(inplaceTrue)self.dsconv1 DepthwiseSeparableConv(32, 64, stride1)self.dsconv2 DepthwiseSeparableConv(64, 128, stride2)self.dsconv3 DepthwiseSeparableConv(128, 128, stride1)self.dsconv4 DepthwiseSeparableConv(128, 256, stride2)self.dsconv5 DepthwiseSeparableConv(256, 256, stride1)self.dsconv6 DepthwiseSeparableConv(256, 512, stride2)self.dsconv7 DepthwiseSeparableConv(512, 512, stride1)self.dsconv8 DepthwiseSeparableConv(512, 512, stride1)self.dsconv9 DepthwiseSeparableConv(512, 512, stride1)self.dsconv10 DepthwiseSeparableConv(512, 512, stride1)self.dsconv11 DepthwiseSeparableConv(512, 512, stride1)self.dsconv12 DepthwiseSeparableConv(512, 1024, stride2)self.dsconv13 DepthwiseSeparableConv(1024, 1024, stride1)self.avgpool nn.AdaptiveAvgPool2d((1, 1))self.fc nn.Linear(1024, num_classes)def forward(self, x):out self.conv1(x)out self.bn1(out)out self.relu(out)out self.dsconv1(out)out self.dsconv2(out)out self.dsconv3(out)out self.dsconv4(out)out self.dsconv5(out)out self.dsconv6(out)out self.dsconv7(out)out self.dsconv8(out)out self.dsconv9(out)out self.dsconv10(out)out self.dsconv11(out)out self.dsconv12(out)out self.dsconv13(out)out self.avgpool(out)out out.view(out.size(0), -1)out self.fc(out)return outtrain.py import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms from models import * import matplotlib.pyplot as pltimport ssl ssl._create_default_https_context ssl._create_unverified_context# 定义数据预处理操作 transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10训练集 trainset torchvision.datasets.CIFAR10(root./data, trainTrue,downloadFalse, transformtransform) trainloader torch.utils.data.DataLoader(trainset, batch_size128,shuffleTrue, num_workers2)# 定义设备GPU优先若可用 device torch.device(cuda if torch.cuda.is_available() else cpu)# 实例化模型 model_name MobileNet if model_name AlexNet:model AlexNet(num_classes10).to(device) elif model_name Vgg_A:model Vgg(cfg_vggA, num_classes10).to(device) elif model_name Vgg_A-LRN:model Vgg(cfg_vggA-LRN, num_classes10).to(device) elif model_name Vgg_B:model Vgg(cfg_vggB, num_classes10).to(device) elif model_name Vgg_C:model Vgg(cfg_vggC, num_classes10).to(device) elif model_name Vgg_D:model Vgg(cfg_vggD, num_classes10).to(device) elif model_name Vgg_E:model Vgg(cfg_vggE, num_classes10).to(device) elif model_name GoogleNet:model GoogleNet(num_classes10).to(device) elif model_name ResNet18:model ResNet18(num_classes10).to(device) elif model_name ResNet34:model ResNet34(num_classes10).to(device) elif model_name ResNet50:model ResNet50(num_classes10).to(device) elif model_name ResNet101:model ResNet101(num_classes10).to(device) elif model_name ResNet152:model ResNet152(num_classes10).to(device) elif model_name MobileNet:model MobileNet(num_classes10).to(device)criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001)# 训练轮次 epochs 15def train(model, trainloader, criterion, optimizer, device):model.train()running_loss 0.0correct 0total 0for i, data in enumerate(trainloader, 0):inputs, labels data[0].to(device), data[1].to(device)optimizer.zero_grad()outputs model(inputs)loss criterion(outputs, labels)loss.backward()optimizer.step()running_loss loss.item()_, predicted outputs.max(1)total labels.size(0)correct predicted.eq(labels).sum().item()epoch_loss running_loss / len(trainloader)epoch_acc 100. * correct / totalreturn epoch_loss, epoch_accif __name__ __main__:loss_history, acc_history [], []for epoch in range(epochs):train_loss, train_acc train(model, trainloader, criterion, optimizer, device)print(fEpoch {epoch 1}: Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.2f}%)loss_history.append(train_loss)acc_history.append(train_acc)# 保存模型权重每5轮次保存到weights文件夹下if (epoch 1) % 5 0:torch.save(model.state_dict(), fweights/{model_name}_epoch_{epoch 1}.pth)# 绘制损失曲线plt.plot(range(1, epochs1), loss_history, labelLoss, markero)plt.xlabel(Epoch)plt.ylabel(Loss)plt.title(Training Loss Curve)plt.legend()plt.savefig(fresults\\{model_name}_train_loss_curve.png)plt.close()# 绘制准确率曲线plt.plot(range(1, epochs1), acc_history, labelAccuracy, markero)plt.xlabel(Epoch)plt.ylabel(Accuracy (%))plt.title(Training Accuracy Curve)plt.legend()plt.savefig(fresults\\{model_name}_train_acc_curve.png)plt.close()test.py import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms from models import *import ssl ssl._create_default_https_context ssl._create_unverified_context # 定义数据预处理操作 transform transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.491, 0.482, 0.446), (0.247, 0.243, 0.261))])# 加载CIFAR10测试集 testset torchvision.datasets.CIFAR10(root./data, trainFalse,downloadFalse, transformtransform) testloader torch.utils.data.DataLoader(testset, batch_size128,shuffleFalse, num_workers2)# 定义设备GPU优先若可用 device torch.device(cuda if torch.cuda.is_available() else cpu)# 实例化模型 model_name MobileNet if model_name AlexNet:model AlexNet(num_classes10).to(device) elif model_name Vgg_A:model Vgg(cfg_vggA, num_classes10).to(device) elif model_name Vgg_A-LRN:model Vgg(cfg_vggA-LRN, num_classes10).to(device) elif model_name Vgg_B:model Vgg(cfg_vggB, num_classes10).to(device) elif model_name Vgg_C:model Vgg(cfg_vggC, num_classes10).to(device) elif model_name Vgg_D:model Vgg(cfg_vggD, num_classes10).to(device) elif model_name Vgg_E:model Vgg(cfg_vggE, num_classes10).to(device) elif model_name GoogleNet:model GoogleNet(num_classes10).to(device) elif model_name ResNet18:model ResNet18(num_classes10).to(device) elif model_name ResNet34:model ResNet34(num_classes10).to(device) elif model_name ResNet50:model ResNet50(num_classes10).to(device) elif model_name ResNet101:model ResNet101(num_classes10).to(device) elif model_name ResNet152:model ResNet152(num_classes10).to(device) elif model_name MobileNet:model MobileNet(num_classes10).to(device)criterion nn.CrossEntropyLoss()# 加载模型权重 weights_path fweights/{model_name}_epoch_15.pth model.load_state_dict(torch.load(weights_path, map_locationdevice))def test(model, testloader, criterion, device):model.eval()running_loss 0.0correct 0total 0with torch.no_grad():for data in testloader:inputs, labels data[0].to(device), data[1].to(device)outputs model(inputs)loss criterion(outputs, labels)running_loss loss.item()_, predicted outputs.max(1)total labels.size(0)correct predicted.eq(labels).sum().item()epoch_loss running_loss / len(testloader)epoch_acc 100. * correct / totalreturn epoch_loss, epoch_accif __name__ __main__:test_loss, test_acc test(model, testloader, criterion, device)print(f{model_name} Test)print(fLoad Model Weights From: {weights_path})print(fTest Loss: {test_loss:.4f}, Test Acc: {test_acc:.2f}%)
http://www.w-s-a.com/news/187720/

相关文章:

  • 郫县网站建设网站建设报价单及项目收费明细表
  • 商标做网站logo建网站作业
  • 网站顶部展出的大幅广告中建八局第二建设有限公司
  • 公众微信绑定网站帐号优秀中文网页设计
  • 如何做漫画赚钱的网站企业网站管理系统c
  • 安康公司网站制作搜狗网站
  • 太仓住房与城乡建设局网站注册推广赚钱一个80元
  • wordpress 网站生成app企业网站改版的好处
  • 广州建站服务怎么让客户做网站
  • 南京手机网站设计公司wordpress导航页
  • 娄底市建设网站app网站开发小程序
  • 刷粉网站推广免费网站建设找王科杰信誉
  • 投标建设用地是哪个网站微信小程序多少钱
  • 做玄幻封面素材网站我国数字经济报告
  • 手机网站返回跳转wordpress带颜色的文字
  • 微信群领券网站怎么做创意广告图片
  • 跟我一起做网站嘉兴做网站哪家好
  • 上海知名建站公司山东住房和建设庭网站
  • 深圳市城乡建设部网站首页平台设计方案怎么做
  • 深圳美食教学网站制作wordpress列表图显示标题
  • 怎么做网址导航网站沈阳高端做网站建设
  • 棋牌网站开发需要多少钱整网站代码 带数据 免费 下载
  • 网站建设 sql 模版猎头用什么网站做单
  • 河北保定建设工程信息网站wordpress 远程缓存
  • 手机网站开发之列表开发win7网站开发教程
  • 楚雄市住房和城乡建设局网站廊坊企业网站建设
  • 东莞规划局官方网站wordpress添加文章页不显示图片
  • 做企业网站要哪些人员百度商城网站建设
  • c语言软件开和网站开发区别多产品的网站怎么做seo
  • 收益网站制作移动互联网应用的使用情况表格