《昇思25天学习打卡营第6天|ResNet50图像分类》

昇思25天学习打卡营第5天|MindSpore-ResNet50图像分类 基于MindSpore实践ResNet50计算网络,预训练模型,超参数定义, 阅读详情

写在前面

从本次开始,接触一些上层应用。
本次通过经典的模型,开始本次任务。这里开始学习resnet50网络模型,应该也会有resnet18,估计18的模型速度会更快一些。

resnet

通过对论文的结论进行展示,说明了模型的功能,解决了卷积网络层数加大后模型的退化问题。20层和56层相比,层数越大,模型效果越差,因此resnet主要解决这种问题。hekaiming是真的强呀。

基本流程

  1. 整理模型数据
  2. 构建模型网络核心逻辑(ResidualBlockBase/ResidualBlock)
  3. 创建模型一层

构建网络的代码

from typing import Type, Union, List, Optional
import mindspore.nn as nn
from mindspore.common.initializer import Normal

# 初始化卷积层与BatchNorm的参数
weight_init = Normal(mean=0, sigma=0.02)
gamma_init = Normal(mean=1, sigma=0.02)

class ResidualBlockBase(nn.Cell):
    expansion: int = 1  # 最后一个卷积核数量与第一个卷积核数量相等

    def __init__(self, in_channel: int, out_channel: int,
                 stride: int = 1, norm: Optional[nn.Cell] = None,
                 down_sample: Optional[nn.Cell] = None) -> None:
        super(ResidualBlockBase, self).__init__()
        if not norm:
            self.norm = nn.BatchNorm2d(out_channel)
        else:
            self.norm = norm

        self.conv1 = nn.Conv2d(in_channel, out_channel,
                               kernel_size=3, stride=stride,
                               weight_init=weight_init)
        self.conv2 = nn.Conv2d(in_channel, out_channel,
                               kernel_size=3, weight_init=weight_init)
        self.relu = nn.ReLU()
        self.down_sample = down_sample

    def construct(self, x):
        """ResidualBlockBase construct."""
        identity = x  # shortcuts分支

        out = self.conv1(x)  # 主分支第一层:3*3卷积层
        out = self.norm(out)
        out = self.relu(out)
        out = self.conv2(out)  # 主分支第二层:3*3卷积层
        out = self.norm(out)

        if self.down_sample is not None:
            identity = self.down_sample(x)
        out += identity  # 输出为主分支与shortcuts之和
        out = self.relu(out)

        return out

创建模型一层

def make_layer(last_out_channel, block: Type[Union[ResidualBlockBase, ResidualBlock]],
               channel: int, block_nums: int, stride: int = 1):
    down_sample = None  # shortcuts分支

    if stride != 1 or last_out_channel != channel * block.expansion:

        down_sample = nn.SequentialCell([
            nn.Conv2d(last_out_channel, channel * block.expansion,
                      kernel_size=1, stride=stride, weight_init=weight_init),
            nn.BatchNorm2d(channel * block.expansion, gamma_init=gamma_init)
        ])

    layers = []
    layers.append(block(last_out_channel, channel, stride=stride, down_sample=down_sample))

    in_channel = channel * block.expansion
    # 堆叠残差网络
    for _ in range(1, block_nums):

        layers.append(block(in_channel, channel))

    return nn.SequentialCell(layers)

创建模型

搭建一个4层的网络。

from mindspore import load_checkpoint, load_param_into_net


class ResNet(nn.Cell):
    def __init__(self, block: Type[Union[ResidualBlockBase, ResidualBlock]],
                 layer_nums: List[int], num_classes: int, input_channel: int) -> None:
        super(ResNet, self).__init__()

        self.relu = nn.ReLU()
        # 第一个卷积层,输入channel为3(彩色图像),输出channel为64
        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, weight_init=weight_init)
        self.norm = nn.BatchNorm2d(64)
        # 最大池化层,缩小图片的尺寸
        self.max_pool = nn.MaxPool2d(kernel_size=3, stride=2, pad_mode='same')
        # 各个残差网络结构块定义
        self.layer1 = make_layer(64, block, 64, layer_nums[0])
        self.layer2 = make_layer(64 * block.expansion, block, 128, layer_nums[1], stride=2)
        self.layer3 = make_layer(128 * block.expansion, block, 256, layer_nums[2], stride=2)
        self.layer4 = make_layer(256 * block.expansion, block, 512, layer_nums[3], stride=2)
        # 平均池化层
        self.avg_pool = nn.AvgPool2d()
        # flattern层
        self.flatten = nn.Flatten()
        # 全连接层
        self.fc = nn.Dense(in_channels=input_channel, out_channels=num_classes)

    def construct(self, x):

        x = self.conv1(x)
        x = self.norm(x)
        x = self.relu(x)
        x = self.max_pool(x)

        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

        x = self.avg_pool(x)
        x = self.flatten(x)
        x = self.fc(x)

        return x

接下来,连接数据和模型网络,开始构建容易使用的网络。在这里设置了,模型残差的方法和每个block。

def _resnet(model_url: str, block: Type[Union[ResidualBlockBase, ResidualBlock]],
            layers: List[int], num_classes: int, pretrained: bool, pretrained_ckpt: str,
            input_channel: int):
    model = ResNet(block, layers, num_classes, input_channel)

    if pretrained:
        # 加载预训练模型
        download(url=model_url, path=pretrained_ckpt, replace=True)
        param_dict = load_checkpoint(pretrained_ckpt)
        load_param_into_net(model, param_dict)

    return model


def resnet50(num_classes: int = 1000, pretrained: bool = False):
    """ResNet50模型"""
    resnet50_url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/models/application/resnet50_224_new.ckpt"
    resnet50_ckpt = "./LoadPretrainedModel/resnet50_224_new.ckpt"
    return _resnet(resnet50_url, ResidualBlock, [3, 4, 6, 3], num_classes,
                   pretrained, resnet50_ckpt, 2048)

模型训练和评估

并没有完全训练,使用了预训练的方法,下载了预训练的模型。

# 定义ResNet50网络
network = resnet50(pretrained=True)

# 全连接层输入层的大小
in_channel = network.fc.in_channels
fc = nn.Dense(in_channels=in_channel, out_channels=10)
# 重置全连接层
network.fc = fc

有了模型网络,接下来需要进行模型训练。训练的过程要设置学习率、优化器和损失函数。

# 设置学习率
num_epochs = 1
lr = nn.cosine_decay_lr(min_lr=0.00001, max_lr=0.001, total_step=step_size_train * num_epochs,
                        step_per_epoch=step_size_train, decay_epoch=num_epochs)
# 定义优化器和损失函数
opt = nn.Momentum(params=network.trainable_params(), learning_rate=lr, momentum=0.9)
loss_fn = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean')


def forward_fn(inputs, targets):
    logits = network(inputs)
    loss = loss_fn(logits, targets)
    return loss


grad_fn = ms.value_and_grad(forward_fn, None, opt.parameters)


def train_step(inputs, targets):
    loss, grads = grad_fn(inputs, targets)
    opt(grads)
    return loss

之后进行多个epoch的迭代,实现模型训练的目标。

import mindspore.ops as ops


def train(data_loader, epoch):
    """模型训练"""
    losses = []
    network.set_train(True)

    for i, (images, labels) in enumerate(data_loader):
        loss = train_step(images, labels)
        if i % 100 == 0 or i == step_size_train - 1:
            print('Epoch: [%3d/%3d], Steps: [%3d/%3d], Train Loss: [%5.3f]' %
                  (epoch + 1, num_epochs, i + 1, step_size_train, loss))
        losses.append(loss)

    return sum(losses) / len(losses)


def evaluate(data_loader):
    """模型验证"""
    network.set_train(False)

    correct_num = 0.0  # 预测正确个数
    total_num = 0.0  # 预测总数

    for images, labels in data_loader:
        logits = network(images)
        pred = logits.argmax(axis=1)  # 预测结果
        correct = ops.equal(pred, labels).reshape((-1, ))
        correct_num += correct.sum().asnumpy()
        total_num += correct.shape[0]

    acc = correct_num / total_num  # 准确率

    return acc

# 开始循环训练
print("Start Training Loop ...")

for epoch in range(num_epochs):
    curr_loss = train(data_loader_train, epoch)
    curr_acc = evaluate(data_loader_val)

    print("-" * 50)
    print("Epoch: [%3d/%3d], Average Train Loss: [%5.3f], Accuracy: [%5.3f]" % (
        epoch+1, num_epochs, curr_loss, curr_acc
    ))
    print("-" * 50)

    # 保存当前预测准确率最高的模型
    if curr_acc > best_acc:
        best_acc = curr_acc
        ms.save_checkpoint(network, best_ckpt_path)

print("=" * 80)
print(f"End of validation the best Accuracy is: {best_acc: 5.3f}, "
      f"save the best ckpt file in {best_ckpt_path}", flush=True)

进行多轮训练之后,达到训练的目的,模型开始进行收敛,并且能够获取到最终的结果。

最后进行评估,这个并不复杂。

打开

请添加图片描述

K-means算法代码实现(python) K-means算法代码实现以及解决质心选择问题 计算距离 距离通常使用欧几里得距离来衡量 def euclDistance(vector1, vector2): return np.sqrt(sum((vector2 - vector1) ** 2)) 初始化质心 def initCentroids(data, k): numSamples, dim = data.shape ... 阅读详情

相关推荐

Tessent ICL语法详解:如何高效定义SIB、TDR和TAP模块

本文深入解析Tessent ICL语法,指导如何高效定义SIB、TDR和TAP模块以构建芯片测试网络。通过实战代码示例,详细阐述了各模块的端口声明、接口角色与核心寄存器定义,并提供了顶层集成连接方法与调试技巧,帮助DFT工程师精准描述测试仪器拓扑,提升Tessent工具链使用效率。

silver的专栏 492

昇思25天学习打卡营第6天 | ResNet50图像分类

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。

qiaoyuhanhan的博客 1441

JAVA审批流程,一个简单表结构设计方案By OU

一、表结构设计1.流程表(process)用于存储审批流程的基本信息。字段名类型描述idBIGINT主键,流程IDname流程名称TEXT流程描述DATETIME创建时间DATETIME更新时间statusTINYINT(1)流程状态(0: 停用, 1: 启用)2.节点表(process_node)用于管理流程中的每个审批节点。字段名类型描述idBIGINT主键,节点IDprocess_idBIGINT流程ID,外键关联process.id。

1901

昇思25天学习打卡营第6天|ResNet50图像分类

mindspore学习笔记 ResNet50图像分类

weixin_45169752的博客 653

树莓派4B+Ubuntu22.04+思岚RPLIDAR C1激光雷达应用

树莓派+Ubuntu22.04+思岚RPLIDAR C1激光雷达简单应用

techfuture的博客 3704

动网格-网格重构之铺层(三)

运动区域可以是边界区域 (Boundary Zone),也可以是单元区域 ( Cell Zone)。指定了体网格再生方法后,FLUENT自动地根据运动区域(dynamic zones)的运动来调整内部节点以再生体网格。必须保留至少一层网格。(4)如果边面的法向和运动方向偏角较大,生成的网格扭斜度会比较大铺层算法不适用于边界形状变化较大的情况。(1)体网格再生方法的选择(Smoothing,Layering,Remeshing);(2)适用网格种类:四边形、六面体、三棱柱(网格的分布要服从一定的规则)。

weixin_44386973的博客 2095

昇思25天学习打卡营第11天|ResNet50图像分类

MindSpore-ResNet50-图像分类

Fine的优快云博客 1455

(三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)

整个Soc架构中一般会存在多个Power Domain,不同的Power Domain之间也存在着一定的Coverage关系。在Cadence工具中,这种。不同的Domain Coverage关系中,各个Domain存在着一定的关联()。

Mr.翟的博客 1424

《昇思 25 天学习打卡营第 11 天 | ResNet50 图像分类 》

make_layerResNet网络模型最重要的步骤,定义 ResNet 模型类型函数# 第一个卷积层,输入channel为3(彩色图像),输出channel为64# 最大池化层,缩小图片的尺寸# 各个残差网络结构块定义# 平均池化层# flattern层# 全连接层# // ... 省略return x然后定义 _resnet 函数加载 使用 ResNet 网络模型类再使用 _resnet 函数构建 resnet50 网络模型"""ResNet50模型"""

m0_61486963的博客 1365

C# 工业上位机集成 YOLOv8 全实战:模型转换→相机取流→PLC 联动落地部署

// 检测结果实体类,工业场景扩展置信度、坐标、类别字段set;set;set;set;/// 模型配置常量,与导出参数保持一致// 置信度阈值// 非极大值抑制阈值public static readonly string[] ClassNames = { "物料", "缺陷", "挡板" };// 自定义类别本文完整实现了YOLO模型转换→C#上位机集成→工业相机对接→PLC联动→现场部署标准化模型转换流程,杜绝C#端兼容性问题;解耦相机取流、推理、UI线程,满足工业高稳定性要求;

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 321

元宇宙通证- 九、IT/ICT发展史全景长图

九、IT/ICT发展史全景长图 (一)综述 IT是Information Technology的缩写,意为”信息技术“,包含现代计算机、网络、通信等信息领域技术。自1844年人类历史上发出来第一份电报,实现了信息的长图传输,信息技术发展的历史大幕随之拉开。信息技术的普遍应用,是进入信息社会的标志。 IT技术最早发源于半导体,然后发展处计算机、通信网和互联网,进而演进到现在的AI、XR、计算机、大数据、物联网、工业互联网、区块链、量子计算等。 有人说元宇宙是下一代互联网,有人说元宇宙是互联网的终极形态。 我们

沧海之巅的专栏 1万+

昇思25天学习打卡营第16天|ResNet50图像分类

自卷积神经网络模型取得成功以来,更深、更宽、更复杂的网络成为卷积神经网络搭建的主流。但是随着网络往更深、更宽的方向发展,人们发现模型的准确率并不能一直上升达到100%,甚至会出现下降,这种现象被称为“神经网络的退化”。神经网络退化的产生说明卷积神经网络不能够简单的使用堆叠的方法进行优化。2015年,152层深的ResNet(残差网络)的出现提出了一种新的解决方案,将训练深度扩展到的数数千层的同时保证性能仍然优越,成为了AI界的一个经典。

randomize0的专栏 1548

使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码

AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的计算步骤。这里我们简化了部分过程,使用CoolProp库来完成计算,因为CoolProp已经实现了 GERG - 2008 方程。

AI的内部世界的博客 887

昇思25天学习打卡营第12天|ResNet50迁移学习

从今天起,笔者将以打卡的方式,将原文搬运和个人思考结合,分享25天的学习内容与成果。为了提升文章质量和阅读体验,笔者会将思考部分放在最后,供大家探索讨论。同时也欢迎各位领取算力,免费体验昇思大模型!本章节主要描述了使用昇思大模型完成ResNet50迁移学习的主要功能。迁移学习的本质是把为任务 A 开发的模型作为初始点,重新使用在为任务 B 开发模型的过程中。具体而言,本章节包含了迁移学习的数据准备、加载数据集、训练模型等三部分。

sjx3161的博客 1029

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

昇思25天学习打卡营第13天|ResNet50图像分类

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。

weixin_52919639的博客 1908

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

昇思25天学习打卡营第10天|ResNet50迁移学习

MindSpore-ResNet50迁移学习-狼狗分类

Fine的优快云博客 837

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

昇思25天学习打卡营第12天 | ResNet50图像分类

昇思25天学习打卡营第12天 | ResNet50图像分类

qq_31254435的博客 925

《昇思25天学习打卡营第11天 | ResNet50图像分类》

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。

无间行者 879

昇思25天学习打卡营第12天|ResNet50-图像分类

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。

2301_77286822的博客 1553

《昇思25天学习打卡营第22天|ResNet50图像分类》

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。下图是在CIFAR-10数据集上使用56层网络与20层网络训练误差和测试误差图,由图中数据可以看出,56层网络比20层网络训练误差和测试误差更大,随着网络的加深,其误差并没有如预想的一样减小。

QAQ23333333333的博客 1012

昇思25天学习打卡营第20天|CV-ResNet50图像分类

传统的 CNN 是将一系列的卷积层和池化层堆叠,但当网络堆叠到一定深度时,就会出现退化问题,即 网络层数的加深并不能改善网络的训练/测试误差。ResNet网络提出了残差网络结构 (Residual Network) 来减轻退化问题,使用ResNet网络可以实现搭建较深的网络结构(突破1000层)。研究表明ResNet网络层数越深,其训练误差和测试误差越小 (见ResNet 论文。

wwt72的博客 1279

昇思25天学习打卡营第12天|ResNet50图像分类

ResNet网络层结构如下图所示,以输入彩色图像 224×224 为例,首先通过数量64,卷积核大小为 7×7 ,stride为2的卷积层conv1,该层输出图片大小为 112×112 ,输出channel为64;对于每个残差网络块,以ResNet50网络中的conv2_x为例,其由3个Bottleneck结构堆叠而成,每个Bottleneck输入的channel为64,输出channel为256。本节展示了5个epochs的训练过程,如果想要达到理想的训练效果,建议训练80个epochs。

gpsicp的博客 1357
上一篇: 《昇思25天学习打卡营第5天|10使用静态图加速》
hellozmz
博客等级 码龄11年 30粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值