解決Numpy與Pytorch彼此轉(zhuǎn)換時(shí)的坑
前言
最近使用 Numpy包與Pytorch寫神經(jīng)網(wǎng)絡(luò)時(shí),經(jīng)常需要兩者彼此轉(zhuǎn)換,故用此筆記記錄碼代碼時(shí)踩(菜)過的坑,網(wǎng)上有人說:
Pytorch 又被稱為 GPU 版的 Numpy,二者的許多功能都有良好的一一對(duì)應(yīng)。
但在使用時(shí)還是得多多注意,一個(gè)不留神就陷入到了 一根煙一杯酒,一個(gè)Bug找一宿 的地步。
1.1、numpy ——> torch
使用 torch.from_numpy() 轉(zhuǎn)換,需要注意,兩者共享內(nèi)存。例子如下:
import torch import numpy as np a = np.array([1,2,3]) b = torch.from_numpy(a) np.add(a, 1, out=a) print('轉(zhuǎn)換后a', a) print('轉(zhuǎn)換后b', b) # 顯示 轉(zhuǎn)換后a [2 3 4] 轉(zhuǎn)換后b tensor([2, 3, 4], dtype=torch.int32)
1.2、torch——> numpy
使用 .numpy() 轉(zhuǎn)換,同樣,兩者共享內(nèi)存。例子如下:
import torch import numpy as np a = torch.zeros((2, 3), dtype=torch.float) c = a.numpy() np.add(c, 1, out=c) print('a:', a) print('c:', c) # 結(jié)果 a: tensor([[1., 1., 1.], [1., 1., 1.]]) c: [[1. 1. 1.] [1. 1. 1.]]
需要注意的是,如果將程序中的 np.add(c, 1, out=c) 改成 c = c + 1 會(huì)發(fā)現(xiàn)兩者貌似不共享內(nèi)存了,其實(shí)不然,原因是后者相當(dāng)于改變了 c 的存儲(chǔ)地址??梢允褂?id(c) 發(fā)現(xiàn)c的內(nèi)存位置變了。
補(bǔ)充:pytorch中tensor數(shù)據(jù)和numpy數(shù)據(jù)轉(zhuǎn)換中注意的一個(gè)問題
在pytorch中,把numpy.array數(shù)據(jù)轉(zhuǎn)換到張量tensor數(shù)據(jù)的常用函數(shù)是torch.from_numpy(array)或者torch.Tensor(array),第一種函數(shù)更常用。
下面通過代碼看一下區(qū)別:
import numpy as np import torch a=np.arange(6,dtype=int).reshape(2,3) b=torch.from_numpy(a) c=torch.Tensor(a) a[0][0]=10 print(a,'\n',b,'\n',c) [[10 1 2] [ 3 4 5]] tensor([[10, 1, 2], [ 3, 4, 5]], dtype=torch.int32) tensor([[0., 1., 2.], [3., 4., 5.]]) c[0][0]=10 print(a,'\n',b,'\n',c) [[10 1 2] [ 3 4 5]] tensor([[10, 1, 2], [ 3, 4, 5]], dtype=torch.int32) tensor([[10., 1., 2.], [ 3., 4., 5.]]) print(b.type()) torch.IntTensor print(c.type()) torch.FloatTensor
可以看出修改數(shù)組a的元素值,張量b的元素值也改變了,但是張量c卻不變。修改張量c的元素值,數(shù)組a和張量b的元素值都不變。
這說明torch.from_numpy(array)是做數(shù)組的淺拷貝,torch.Tensor(array)是做數(shù)組的深拷貝。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解python基礎(chǔ)之while循環(huán)及if判斷
這篇文章主要介紹了python基礎(chǔ)之while循環(huán)及if判斷的相關(guān)資料,需要的朋友可以參考下2017-08-08Python經(jīng)典題實(shí)戰(zhàn)記錄之百元買百雞
有一道著名的"百錢買百雞"問題大家應(yīng)該都不陌生,這篇文章主要給大家介紹了關(guān)于Python經(jīng)典題實(shí)戰(zhàn)記錄之百元買百雞的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下2023-12-12談?wù)剬?duì)Pytorch中的forward的理解
這篇文章主要介紹了談?wù)剬?duì)Pytorch中的forward的理解,在Pytorch中,forward方法是一個(gè)特殊的方法,被專門用來進(jìn)行前向傳播,本文給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)在金融風(fēng)控中的應(yīng)用小結(jié)
本篇詳解了Python數(shù)據(jù)分析與機(jī)器學(xué)習(xí)在金融風(fēng)控中的應(yīng)用,包括數(shù)據(jù)收集與預(yù)處理、信用風(fēng)險(xiǎn)評(píng)估模型、市場風(fēng)險(xiǎn)管理模型和操作風(fēng)險(xiǎn)監(jiān)控模型,感興趣的朋友跟隨小編一起看看吧2024-06-06Django實(shí)戰(zhàn)之用戶認(rèn)證(初始配置)
這篇文章主要介紹了Django實(shí)戰(zhàn)之用戶認(rèn)證(初始配置),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07python 解決flask 圖片在線瀏覽或者直接下載的問題
今天小編就為大家分享一篇python 解決flask 圖片在線瀏覽或者直接下載的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01python 基于pygame實(shí)現(xiàn)俄羅斯方塊
這篇文章主要介紹了python 基于pygame實(shí)現(xiàn)俄羅斯方塊的方法,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03