最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)

 更新時(shí)間:2022年04月17日 12:07:26   作者:禿頭小蘇  
本文主要介紹了pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

transforms.ToTensor

最近看pytorch時(shí),遇到了對(duì)圖像數(shù)據(jù)的歸一化,如下圖所示:

image-20220416115017669

該怎么理解這串代碼呢?我們一句一句的來看,先看transforms.ToTensor(),我們可以先轉(zhuǎn)到官方給的定義,如下圖所示:

image-20220416115331930

大概的意思就是說,transforms.ToTensor()可以將PIL和numpy格式的數(shù)據(jù)從[0,255]范圍轉(zhuǎn)換到[0,1] ,具體做法其實(shí)就是將原始數(shù)據(jù)除以255。另外原始數(shù)據(jù)的shape是(H x W x C),通過transforms.ToTensor()后shape會(huì)變?yōu)椋– x H x W)。這樣說我覺得大家應(yīng)該也是能理解的,這部分并不難,但想著還是用一些例子來加深大家的映像??????

先導(dǎo)入一些包

import cv2
import numpy as np
import torch
from torchvision import transforms

定義一個(gè)數(shù)組模型圖片,注意數(shù)組數(shù)據(jù)類型需要時(shí)np.uint8【官方圖示中給出】

data = np.array([
                [[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]],
                [[2,2,2],[2,2,2],[2,2,2],[2,2,2],[2,2,2]],
                [[3,3,3],[3,3,3],[3,3,3],[3,3,3],[3,3,3]],
                [[4,4,4],[4,4,4],[4,4,4],[4,4,4],[4,4,4]],
                [[5,5,5],[5,5,5],[5,5,5],[5,5,5],[5,5,5]]
        ],dtype='uint8')

這是可以看看data的shape,注意現(xiàn)在為(W H C)。

image-20220416120518895

使用transforms.ToTensor()將data進(jìn)行轉(zhuǎn)換

data = transforms.ToTensor()(data)

這時(shí)候我們來看看data中的數(shù)據(jù)及shape。

image-20220416120811156

? 很明顯,數(shù)據(jù)現(xiàn)在都映射到了[0, 1]之間,并且data的shape發(fā)生了變換。

**注意:不知道大家是如何理解三維數(shù)組的,這里提供我的一個(gè)方法。**??????

??原始的data的shape為(5,5,3),則其表示有5個(gè)(5 , 3)的二維數(shù)組,即我們把最外層的[]去掉就得到了5個(gè)五行三列的數(shù)據(jù)。

??同樣的,變換后data的shape為(3,5,5),則其表示有3個(gè)(5 , 5)的二維數(shù)組,即我們把最外層的[]去掉就得到了3個(gè)五行五列的數(shù)據(jù)。

transforms.Normalize??

相信通過前面的敘述大家應(yīng)該對(duì)transforms.ToTensor有了一定的了解,下面將來說說這個(gè)transforms.Normalize??????同樣的,我們先給出官方的定義,如下圖所示:

image-20220416195418909

可以看到這個(gè)函數(shù)的輸出output[channel] = (input[channel] - mean[channel]) / std[channel]。這里[channel]的意思是指對(duì)特征圖的每個(gè)通道都進(jìn)行這樣的操作?!緈ean為均值,std為標(biāo)準(zhǔn)差】接下來我們看第一張圖片中的代碼,即

image-20220416200305159

這里的第一個(gè)參數(shù)(0.5,0.5,0.5)表示每個(gè)通道的均值都是0.5,第二個(gè)參數(shù)(0.5,0.5,0.5)表示每個(gè)通道的方差都為0.5?!疽?yàn)閳D像一般是三個(gè)通道,所以這里的向量都是1x3的??????】有了這兩個(gè)參數(shù)后,當(dāng)我們傳入一個(gè)圖像時(shí),就會(huì)按照上面的公式對(duì)圖像進(jìn)行變換?!?strong>注意:這里說圖像其實(shí)也不夠準(zhǔn)確,因?yàn)檫@個(gè)函數(shù)傳入的格式不能為PIL Image,我們應(yīng)該先將其轉(zhuǎn)換為Tensor格式】

說了這么多,那么這個(gè)函數(shù)到底有什么用呢?我們通過前面的ToTensor已經(jīng)將數(shù)據(jù)歸一化到了0-1之間,現(xiàn)在又接上了一個(gè)Normalize函數(shù)有什么用呢?其實(shí)Normalize函數(shù)做的是將數(shù)據(jù)變換到了[-1,1]之間。之前的數(shù)據(jù)為0-1,當(dāng)取0時(shí),output =(0 - 0.5)/ 0.5 = -1;當(dāng)取1時(shí),output =(1 - 0.5)/ 0.5 = 1。這樣就把數(shù)據(jù)統(tǒng)一到了[-1,1]之間了??????那么問題又來了,數(shù)據(jù)統(tǒng)一到[-1,1]有什么好處呢?數(shù)據(jù)如果分布在(0,1)之間,可能實(shí)際的bias,就是神經(jīng)網(wǎng)絡(luò)的輸入b會(huì)比較大,而模型初始化時(shí)b=0的,這樣會(huì)導(dǎo)致神經(jīng)網(wǎng)絡(luò)收斂比較慢,經(jīng)過Normalize后,可以加快模型的收斂速度?!具@句話是再網(wǎng)絡(luò)上找到最多的解釋,自己也不確定其正確性】

讀到這里大家是不是以為就完了呢?這里還想和大家嘮上一嘮??????上面的兩個(gè)參數(shù)(0.5,0.5,0.5)是怎么得來的呢?這是根據(jù)數(shù)據(jù)集中的數(shù)據(jù)計(jì)算出的均值和標(biāo)準(zhǔn)差,所以往往不同的數(shù)據(jù)集這兩個(gè)值是不同的??????這里再舉一個(gè)例子幫助大家理解其計(jì)算過程。同樣采用上文例子中提到的數(shù)據(jù)。

上文已經(jīng)得到了經(jīng)ToTensor轉(zhuǎn)換后的數(shù)據(jù),現(xiàn)需要求出該數(shù)據(jù)每個(gè)通道的mean和std。【這一部分建議大家自己運(yùn)行看看每一步的結(jié)果??????】

# 需要對(duì)數(shù)據(jù)進(jìn)行擴(kuò)維,增加batch維度
data = torch.unsqueeze(data,0)    #在pytorch中一般都是(batch,C,H,W)
nb_samples = 0.
#創(chuàng)建3維的空列表
channel_mean = torch.zeros(3)
channel_std = torch.zeros(3)
N, C, H, W = data.shape[:4]
data = data.view(N, C, -1)  #將數(shù)據(jù)的H,W合并
#展平后,w,h屬于第2維度,對(duì)他們求平均,sum(0)為將同一緯度的數(shù)據(jù)累加
channel_mean += data.mean(2).sum(0)  
#展平后,w,h屬于第2維度,對(duì)他們求標(biāo)準(zhǔn)差,sum(0)為將同一緯度的數(shù)據(jù)累加
channel_std += data.std(2).sum(0)
#獲取所有batch的數(shù)據(jù),這里為1
nb_samples += N
#獲取同一batch的均值和標(biāo)準(zhǔn)差
channel_mean /= nb_samples
channel_std /= nb_samples
print(channel_mean, channel_std)   #結(jié)果為tensor([0.0118, 0.0118, 0.0118]) tensor([0.0057, 0.0057, 0.0057])

將上述得到的mean和std帶入公式,計(jì)算輸出。

for i in range(3):
    data[i] = (data[i] - channel_mean[i]) / channel_std[i]
print(data)

輸出結(jié)果:

image-20220416205341050

? 從結(jié)果可以看出,我們計(jì)算的mean和std并不是0.5,且最后的結(jié)果也沒有在[-1,1]之間。

最后我們?cè)賮砜匆粋€(gè)有意思的例子,我們得到了最終的結(jié)果,要是我們想要變回去怎么辦,其實(shí)很簡單啦,就是一個(gè)逆運(yùn)算,即input = std*output + mean,然后再乘上255就可以得到原始的結(jié)果了。很多人獲取吐槽了,這也叫有趣?。???哈哈哈這里我想說的是另外的一個(gè)事,如果我們對(duì)一張圖像進(jìn)行了歸一化,這時(shí)候你用歸一化后的數(shù)據(jù)顯示這張圖像的時(shí)候,會(huì)發(fā)現(xiàn)同樣會(huì)是原圖。

參考鏈接1:https://zhuanlan.zhihu.com/p/414242338

參考鏈接2:https://blog.csdn.net/peacefairy/article/details/108020179

到此這篇關(guān)于pytorch中的transforms.ToTensor和transforms.Normalize的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)pytorch transforms.ToTensor和transforms.Normalize內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語言beego框架jwt身份認(rèn)證實(shí)現(xiàn)示例

    go語言beego框架jwt身份認(rèn)證實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了go語言beego框架jwt身份認(rèn)證實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法

    Go語言團(tuán)隊(duì)的一個(gè)核心目標(biāo)是保持語言的簡單性,他們認(rèn)為,如果一個(gè)功能可以用簡單的組合來實(shí)現(xiàn),那就沒有必要把它放進(jìn)標(biāo)準(zhǔn)庫里,本文給大家介紹Go實(shí)現(xiàn)List、Set、Stack、Deque等數(shù)據(jù)結(jié)構(gòu)的操作方法,感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • Golang中的四個(gè)括號(hào)示例詳解

    Golang中的四個(gè)括號(hào)示例詳解

    這篇文章主要介紹了Golang中的四個(gè)括號(hào),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),通過實(shí)例代碼補(bǔ)充介紹了有效的括號(hào)golang實(shí)現(xiàn),需要的朋友可以參考下
    2024-03-03
  • Go語言中DateTime的用法介紹

    Go語言中DateTime的用法介紹

    這篇文章介紹了Go語言中DateTime的用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • Go defer 原理和源碼剖析(推薦)

    Go defer 原理和源碼剖析(推薦)

    這篇文章主要介紹了Go defer 原理和源碼剖析,需要的朋友可以參考下
    2021-11-11
  • Golang文件操作之讀取與寫入方法全攻略

    Golang文件操作之讀取與寫入方法全攻略

    本文詳細(xì)介紹了在Go語言中進(jìn)行文件操作的方法,包括文件的創(chuàng)建、打開、讀取、寫入和關(guān)閉等,解析了使用os、bufio和io包進(jìn)行高效文件操作的技巧,并提供了錯(cuò)誤處理與性能優(yōu)化的建議,以幫助開發(fā)者有效管理文件資源并提升應(yīng)用性能,需要的朋友可以參考下
    2024-11-11
  • golang解析json數(shù)據(jù)的4種方法總結(jié)

    golang解析json數(shù)據(jù)的4種方法總結(jié)

    在日常工作中每一名開發(fā)者,不管是前端還是后端,都經(jīng)常使用 JSON,下面這篇文章主要給大家介紹了關(guān)于golang解析json數(shù)據(jù)的4種方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Golang的CSP模型簡介(最新推薦)

    Golang的CSP模型簡介(最新推薦)

    Golang采用了CSP(Communicating?Sequential?Processes,通信順序進(jìn)程)并發(fā)模型,通過goroutine和channel提供了一種更為簡潔和安全的并發(fā)編程方式,本文將詳細(xì)介紹Golang的CSP并發(fā)模型及其使用方法,感興趣的朋友一起看看吧
    2025-01-01
  • Go語言中零拷貝的原理與實(shí)現(xiàn)詳解

    Go語言中零拷貝的原理與實(shí)現(xiàn)詳解

    零拷貝是相對(duì)于用戶態(tài)來講的,即數(shù)據(jù)在用戶態(tài)不發(fā)生任何拷貝,那么零拷貝的原理是什么,又是如何實(shí)現(xiàn)的呢,下面小編就來和大家詳細(xì)聊聊吧
    2023-08-08
  • Go語言并發(fā)控制之semaphore的原理與使用

    Go語言并發(fā)控制之semaphore的原理與使用

    這篇文章主要為大家詳細(xì)介紹了Go官方庫x中提供的擴(kuò)展并發(fā)原語?semaphore,譯為“信號(hào)量”,文中介紹了它的原理與使用,需要的可以了解下
    2025-02-02

最新評(píng)論

色达县| 西和县| 白玉县| 庄河市| 凤城市| 文安县| 乌海市| 麦盖提县| 泗水县| 大冶市| 响水县| 凤城市| 哈密市| 班戈县| 工布江达县| 南城县| 冷水江市| 安远县| 武清区| 潍坊市| 通化县| 彭水| 大竹县| 蒙城县| 平潭县| 攀枝花市| 深水埗区| 新绛县| 天峻县| 池州市| 肇庆市| 保定市| 新乡县| 司法| 政和县| 澄迈县| 朝阳区| 杭州市| 宣汉县| 思南县| 井陉县|