240622_昇思学习打卡-Day4-ResNet50迁移学习

240622_昇思学习打卡-Day4-ResNet50迁移学习

我们对事物的认知都是一点一点积累出来的,往往借助已经认识过的东西,可以更好地理解和认识新的有关联的东西。比如一个人会骑自行车,我们让他去骑摩托车他也很快就能学会,比如已经学会C++,现在让他去学python他也很容易就能理解。这种情况我们一般称为举一反三。反言之,我们从原始部落找出来一个人(仅作举例),指着摩托车让他骑,可能是一件特别难的事,因为他对这个领域没有丝毫的认知和理解,在实现这件事上就会特别困难。

映射到神经网络上也是一样的道理,如果我们在训练时不导入预训练权重,他就像一个没有见过现代社会的原始人,学任何东西都特别慢,学习成本特别高,但如果我们导入了相似模型结构下针对别的任务的训练权重(比如训练识别自行车),用来训练识别摩托车,我们只需要改变网络最后的分类层,即可得到比较好的训练效果,可以大大缩小模型训练的时间。

原理是我在这么多层神经网络的训练下,已经明白了轱辘(车轮)长什么样,把手长什么样,最后的分类层只是区分出来什么是自行车,你现在给我一堆摩托的照片,我就可以去寻找两者的相似处,我对轱辘和把手的认知就不用从0开始重新学习,只需要进行微调,比如摩托车的轱辘比自行车大一点,摩托车的车把手比自行车大一点。基于以前已经学习到的东西,可以大大缩小训练成本。

迁移学习就是这个道理。我们在神经网络技术的发展中,针对不同的任务,不可能每个网络都从0开始训练,那样需要的数据集及成本都是不可承受的。

本文以ResNet50迁移学习为例展开讲解,在MindSpore架构下运行。

数据准备

下载数据集

本文用到狗与狼分类数据集,使用download接口下载,也可自行下载放在项目当前目录下

from download import downloaddataset_url = "https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/datasets/intermediate/Canidae_data.zip"download(dataset_url, "./datasets-Canidae", kind="zip", replace=True)

数据目录结构如下:

text
datasets-Canidae/data/
└── Canidae├── train│   ├── dogs│   └── wolves└── val├── dogs└── wolves

首先定义一些超参数:

batch_size = 18                             # 批量大小
image_size = 224                            # 训练图像空间大小
num_epochs = 5                             # 训练周期数
lr = 0.001                                  # 学习率
momentum = 0.9                              # 动量
workers = 4                                 # 并行线程个数

加载数据集以及做一些数据增强(本文所用的狼狗数据集属于ImageNet数据集,其典型mean和std值分别为[0.485, 0.456, 0.406]和[0.229, 0.224, 0.225],所以代码中直接使用):

# 导入MindSpore库,用于深度学习框架
import mindspore as ms
import mindspore.dataset as ds
import mindspore.dataset.vision as vision# 定义训练数据集和验证数据集的路径
# 数据集目录路径
data_path_train = "./datasets-Canidae/data/Canidae/train/"
data_path_val = "./datasets-Canidae/data/Canidae/val/"# 定义函数,用于创建Canidae分类任务的训练集或验证集
# 参数dataset_path: 数据集路径,usage: 数据集的用途,"train"或"val"
# 返回处理后的数据集
# 创建训练数据集
def create_dataset_canidae(dataset_path, usage):"""数据加载"""# 初始化ImageFolderDataset,使用多线程并打乱数据顺序# 使用mindspore.dataset.ImageFolderDataset接口来加载数据集data_set = ds.ImageFolderDataset(dataset_path,num_parallel_workers=workers,shuffle=True,)# 定义数据预处理的参数mean = [0.485 * 255, 0.456 * 255, 0.406 * 255]std = [0.229 * 255, 0.224 * 255, 0.225 * 255]scale = 32# 根据数据集的用途(训练或验证)选择不同的数据增强操作if usage == "train":# 训练集的数据增强操作,包括随机裁剪、水平翻转、归一化等# Define map operations for training datasettrans = [vision.RandomCropDecodeResize(size=image_size, scale=(0.08, 1.0), ratio=(0.75, 1.333)),vision.RandomHorizontalFlip(prob=0.5),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]else:# 验证集的数据增强操作,主要包括解码、缩放、中心裁剪、归一化等# Define map operations for inference datasettrans = [vision.Decode(),vision.Resize(image_size + scale),vision.CenterCrop(image_size),vision.Normalize(mean=mean, std=std),vision.HWC2CHW()]# 对数据集应用预处理操作# 数据映射操作data_set = data_set.map(operations=trans,input_columns='image',num_parallel_workers=workers)# 将数据集分批处理,指定批大小# 批量操作data_set = data_set.batch(batch_size)return data_set# 创建训练数据集和验证数据集,并获取每个数据集的步长(即数据集的大小)
dataset_train = create_dataset_canidae(data_path_train, "train")
step_size_train = dataset_train.get_dataset_size()dataset_val = create_dataset_canidae(data_path_val, "val")
step_size_val = dataset_val.get_dataset_size()

数据集可视化

mindspore.dataset.ImageFolderDataset接口中加载的训练数据集返回值为字典,用户可通过 create_dict_iterator 接口创建数据迭代器,使用 next 迭代访问数据集。前面 batch_size 设为18,所以使用 next 一次可获取18个图像及标签数据。

# 获取训练数据集的第一个批次数据,是18张图像及标签数据。
data = next(dataset_train.create_dict_iterator())
images = data["image"]
labels = data["label"]print("Tensor of image", images.shape)
print("Labels:", labels)'''
执行结果为
Tensor of image (18, 3, 224, 224)    # 意思是这一批有18张3通道(RGB通道)的长224宽224的图像
Labels: [1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 1 0 1]    # 因为该任务是一个二分类任务,所以类别只有简单的0和1
'''

目前拿到的数据我们可以先看看长什么样,展示图像及标题,标题为对应的label名称

# 导入matplotlib.pyplot库用于绘图
import matplotlib.pyplot as plt
# 导入numpy库用于处理数组
import numpy as np# 定义一个字典,映射类别编号到类别名称
# class_name对应label,按文件夹字符串从小到大的顺序标记label
class_name = {0: "dogs", 1: "wolves"}# 创建一个5x5大小的画布
plt.figure(figsize=(5, 5))
# 循环遍历4个图像
for i in range(4):# 获取当前图像的数据和标签# 获取图像及其对应的labeldata_image = images[i].asnumpy()data_label = labels[i]# 将图像数据从HWC格式转换为RGB格式# 处理图像供展示使用data_image = np.transpose(data_image, (1, 2, 0))# 对图像进行预处理,包括归一化和颜色空间转换mean = np.array([0.485, 0.456, 0.406])std = np.array([0.229, 0.224, 0.225])data_image = std * data_image + meandata_image = np.clip(data_image, 0, 1)# 在画布上创建子图,并显示当前图像# 显示图像plt.subplot(2, 2, i+1)plt.imshow(data_image)# 设置子图标题为图像的类别名称plt.title(class_name[int(labels[i].asnumpy())])# 关闭子图的坐标轴显示plt.axis("off")# 显示画布上的所有图像
plt.show()

image-20240622221036216

训练模型

from typing import Type, Union, List, Optional
from mindspore import nn, train
from mindspore.common.initializer import Normalweight_init = Normal(mean=0, sigma=0.02)
gamma_init = Normal(mean=1, sigma=0.02)

今日就先写这些,明天学完之后汇总。

不知道为什么我在这篇里面点编辑然后发表之后变成了一篇新的博客,那这里就附上后续的博客地址吧
240622_昇思学习打卡-Day4-5-ResNet50迁移学习

打卡图片:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用容器部署redis_设置配置文件映射到本地_设置存储数据映射到本地_并开发java应用_连接redis---分布式云原生部署架构搭建011

可以看到java应用的部署过程,首先我们要准备一个java应用,并且我们,用docker,安装一个redis 首先我们去start.spring.io 去生成一个简单的web项目,然后用idea打开 选择以后下载 放在这里,然后我们去安装redis 在公共仓库中找到redis . 可以看到它里面介绍说把数据放到了/dat…

FLASH闪存

FLASH闪存 程序现象: 1、读写内部FLASH 这个代码的目的,就是利用内部flash程序存储器的剩余空间,来存储一些掉电不丢失的参数。所以这里的程序是按下K1变换一下测试数据,然后存储到内部FLASH,按下K2把所有参数清0&…

找不到mfc140u.dll怎么修复,mfc140u.dll丢失的多种修复方法

计算机丢失mfc140u.dll文件会导致依赖该文件的软件无法正常运行。mfc140u.dll是Microsoft Visual C 2015的可再发行组件之一,它属于Microsoft Foundation Class (MFC) 库,许多使用MFC开发的程序需要这个DLL文件来正确执行。丢失了mfc140u.dll文件。会导致…

无人机无刷电机理论教学培训课程

本文档为一份关于Brushless电机理论的详细教程,由TYTO Robotics编制,旨在帮助用户理解brushless电机的工作原理、特性以及如何通过实验测定其关键参数Kv和Kt。文档首先介绍了brushless电机的基本组成,包括静止的定子和旋转的转子,…

考研数学|线代零基础,听谁的课比较合适?

线性代数是数学的一个重要分支,对于考研的学生来说,掌握好这门课程是非常关键的。由于你之前没有听过线性代数课,选择一个合适的课程和老师就显得尤为重要。 以下是一些建议,希望能帮助你找到合适的课程资源。 首先,…

Hadoop3:MapReduce中的ETL(数据清洗)

一、概念说明 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换(Transform)、加载(Load)至目的端的过程。ETL一词较常用在数据仓库&#…

LED显示屏的点间距越小越好吗

引言 在LED显示屏市场日趋成熟的同时,小间距显示屏成为了许多用户的首选。然而,点间距真的是越小越好吗?本文将探讨这一问题,并提供全面的选购指南。 点间距:并非越小越好 小间距显示屏因其精细的显示效果而备受青睐。…

剪辑如何剪辑制作视频短视频剪辑学习怎么学,难吗?

工欲善其事必先利其器,有一个好的工具能让你的工作如鱼得水,果你想在短视频中制作精良的视频,你就考虑电脑制作软件了。果你想制作精良的视频,你就考虑电脑制作软件了。 如何找到剪辑软件了?你可以直接去软件的官方。你…

KT6368A-sop8蓝牙主机芯片获取电动车胎压传感器数据功能

KT6368A蓝牙芯片新增主机模式,扫描周边的胎压传感器,这里扮演的角色就是观察者。因为测试胎压传感器,发现它的广播模式可发现,不可连接 胎压传感器部分的手册说明如下,关于蓝牙部分的协议 实际蓝牙芯片收到的数据&…

Studying-代码随想录训练营day20| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

第二十天,二叉树part07,二叉树搜索树加油加油💪 目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 拓展:普通二叉树的删除方式 总结 235.二叉搜索树的最近公共祖先 文档讲解&…

洁净室(区)浮游菌检测标准操作规程及GB/T 16292-2010测试方法解读

洁净室(区)空气中浮游菌的检测。洁净区浮游菌检测是一种评估和控制洁净区(如实验室、生产车间等)内空气质量的方法。这种检测的目的是通过测量空气中的微生物(即浮游菌)数量,来评估洁净区的清洁度或污染程度。下面中邦兴业小编带大家详细看下如何进行浮游菌采样检测…

RK3568技术笔记九 编译Linux详细介绍

在编译前需要按照前面的方法始化编译环境,否则会导致编译失败(若配置过则无需重复配置)。 全自动编译包含所有镜像编译,包括:uboot编译、Kernel编译、Recovey编译、文件系统编译、编译完成镜像的更新与打包。 按照前面…

阅读笔记——《Large Language Model guided Protocol Fuzzing》

【参考文献】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.(CCF A类会议)【注】本文仅为作者个人学习笔记&a…

2024ciscn 华东北awdp pwn部分wp

pwn1 break 很简单,栈可执行。 先格式化字符串泄露出栈地址和canary,然后稍稍布置一下打orw就行 沙盒和没有一样 from pwn import *context(archamd64, oslinux)if __name__ __main__:# io remote(192.47.1.39, 80)io remote(192.168.142.137, 123…

初阶 《操作符详解》 10. 逗号表达式

10. 逗号表达式 exp1, exp2, exp3, …expN 注&#xff1a; 1.逗号表达式&#xff0c;就是用逗号隔开的多个表达式 2.逗号表达式&#xff0c;从左向右依次执行&#xff0c;整个表达式的结果是最后一个表达式的结果 代码1 #include <stdio.h> int main() {int a 1;int b…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

数据结构需要每个都具体实现吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;用c的stl能刷算法题是不…

clean code-代码整洁之道 阅读笔记(第十三章)

第十三章 并发编程 "对象是过程的抽象。线程是调度的抽象。" --James O Coplien 13.1 为什么要并发 并发是一种解耦策略。它帮助我们把做什么&#xff08;目的&#xff09;和何时&#xff08;时机&#xff09;做分解开。在单线 程应用中&#xff0c;目的与时机紧密耦…

【OpenCV 图像处理 Python版】OpenCV 简介及安装

文章目录 1.OpenCV 介绍1.1 OpenCV 的特点1.2 OpenCV 的主要模块1.3 OpenCV 的应用场景 2.OpenCV-Python 库3.OpenCV 安装 1.OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年…

API的优势及应用场景(淘宝API测试的详细步骤)

一、API的优势 API的出现为应用程序间的通信提供了一种新的方式&#xff0c;它有以下优势&#xff1a; 1、降低开发难度 开发者可以通过API访问其他应用程序的数据和功能&#xff0c;避免了重复开发&#xff0c;降低了开发难度。 2、提高开发效率 API提供了一种标准化的通…