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.pswp.cn/diannao/34973.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/34973.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/34973.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用容器部署redis_設置配置文件映射到本地_設置存儲數據映射到本地_并開發java應用_連接redis---分布式云原生部署架構搭建011

可以看到java應用的部署過程,首先我們要準備一個java應用,并且我們,用docker,安裝一個redis 首先我們去start.spring.io 去生成一個簡單的web項目,然后用idea打開 選擇以后下載 放在這里,然后我們去安裝redis 在公共倉庫中找到redis . 可以看到它里面介紹說把數據放到了/dat…

理解和實現 LFU 緩存置換算法

引言 在計算機科學中,緩存是一種重要的技術,用于提高數據訪問速度和系統性能。然而,由于緩存空間有限,當緩存滿了之后,就需要一種智能的策略來決定哪些數據應該保留,哪些應該被淘汰。LFU(Least…

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電機的基本組成,包括靜止的定子和旋轉的轉子,…

AR增強現實在橋梁工程專業課堂上的應用

橋梁工程專業課堂上應用增強現實技術具有多方面的優勢。首先,增強現實技術能夠提供更加直觀、生動、真實的橋梁工程學習環境,使學生能夠更好地理解和掌握橋梁工程的基本原理和設計方法。其次,增強現實技術能夠提供更加豐富的橋梁工程案例和實…

考研數學|線代零基礎,聽誰的課比較合適?

線性代數是數學的一個重要分支,對于考研的學生來說,掌握好這門課程是非常關鍵的。由于你之前沒有聽過線性代數課,選擇一個合適的課程和老師就顯得尤為重要。 以下是一些建議,希望能幫助你找到合適的課程資源。 首先,…

Hadoop3:MapReduce中的ETL(數據清洗)

一、概念說明 “ETL,是英文Extract-Transform-Load的縮寫,用來描述將數據從來源端經過抽取(Extract)、轉換(Transform)、加載(Load)至目的端的過程。ETL一詞較常用在數據倉庫&#…

python學習 - 設計模式 - 狀態模式

大話設計模式 設計模式——狀態模式 狀態模式(State Pattern):當一個對象的內在狀態改變時允許改變其行為,這個對象看起來像是改變了其類 應用場景:當控制一個對象的狀態轉換的條件表達式過于復雜時,把狀態的判斷邏輯轉移到表示不同狀態的一系列類當中,可以把復雜的…

LED顯示屏的點間距越小越好嗎

引言 在LED顯示屏市場日趨成熟的同時,小間距顯示屏成為了許多用戶的首選。然而,點間距真的是越小越好嗎?本文將探討這一問題,并提供全面的選購指南。 點間距:并非越小越好 小間距顯示屏因其精細的顯示效果而備受青睞。…

剪輯如何剪輯制作視頻短視頻剪輯學習怎么學,難嗎?

工欲善其事必先利其器,有一個好的工具能讓你的工作如魚得水,果你想在短視頻中制作精良的視頻,你就考慮電腦制作軟件了。果你想制作精良的視頻,你就考慮電腦制作軟件了。 如何找到剪輯軟件了?你可以直接去軟件的官方。你…

KT6368A-sop8藍牙主機芯片獲取電動車胎壓傳感器數據功能

KT6368A藍牙芯片新增主機模式,掃描周邊的胎壓傳感器,這里扮演的角色就是觀察者。因為測試胎壓傳感器,發現它的廣播模式可發現,不可連接 胎壓傳感器部分的手冊說明如下,關于藍牙部分的協議 實際藍牙芯片收到的數據&…

國密算法SM1 SM2 SM3 SM4 SM9

一、概述 SM1-無具體實現 SM1作為一種對稱加密算法,由于其算法細節并未公開,且主要在中國國內使用,因此在國際通用的加密庫(如Bouncy Castle)中并不直接支持SM1算法。 SM1算法的具體實現涉及國家密碼管理局的規范&…

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…

【附精彩文章合輯】當談到程序的“通用性”與“過度設計”的困境時,我們可以通過一些具體的例子來更直觀地闡述這些解決方案

當談到程序的“通用性”與“過度設計”的困境時,我們可以通過一些具體的例子來更直觀地闡述這些解決方案。以下是一些示例: 一、明確需求與目標 例子1:在線購物平臺 需求分析:平臺需要支持用戶注冊、登錄、瀏覽商品、下單購買、…

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…