網站首頁 編程語言 正文
前言
在跑模型的時候,遇到如下報錯
UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
網上查了一下,發現將 torch.tensor()
改寫成 torch.as_tensor()
就可以避免報錯了。
# 如下寫法報錯 feature = torch.tensor(image, dtype=torch.float32) # 改為 feature = torch.as_tensor(image, dtype=torch.float32)
然后就又仔細研究了下 torch.as_tensor()
和 torch.tensor()
的區別,在此記錄。
1、torch.as_tensor()
new_data = torch.as_tensor(data, dtype=None,device=None)->Tensor
作用:生成一個新的 tensor, 這個新生成的tensor 會根據原數據的實際情況,來決定是進行淺拷貝,還是深拷貝。當然,會優先淺拷貝,淺拷貝會共享內存,并共享 autograd 歷史記錄。
情況一:數據類型相同 且 device相同,會進行淺拷貝,共享內存
import numpy import torch a = numpy.array([1, 2, 3]) t = torch.as_tensor(a) t[0] = -1 print(a) # [-1 2 3] print(a.dtype) # int64 print(t) # tensor([-1, 2, 3]) print(t.dtype) # torch.int64
import numpy import torch a = torch.tensor([1, 2, 3], device=torch.device('cuda')) t = torch.as_tensor(a) t[0] = -1 print(a) # tensor([-1, 2, 3], device='cuda:0') print(t) # tensor([-1, 2, 3], device='cuda:0')
情況二: 數據類型相同,但是device不同,深拷貝,不再共享內存
import numpy import torch import numpy a = numpy.array([1, 2, 3]) t = torch.as_tensor(a, device=torch.device('cuda')) t[0] = -1 print(a) # [1 2 3] print(a.dtype) # int64 print(t) # tensor([-1, 2, 3], device='cuda:0') print(t.dtype) # torch.int64
情況三:device相同,但數據類型不同,深拷貝,不再共享內存
import numpy import torch a = numpy.array([1, 2, 3]) t = torch.as_tensor(a, dtype=torch.float32) t[0] = -1 print(a) # [1 2 3] print(a.dtype) # int64 print(t) # tensor([-1., 2., 3.]) print(t.dtype) # torch.float32
2、torch.tensor()
torch.tensor()
是深拷貝方式。
torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
深拷貝:會拷貝 數據類型 和 device,不會記錄 autograd 歷史 (also known as a “leaf tensor” 葉子tensor)
重點是:
- 如果原數據的數據類型是:list, tuple, NumPy ndarray, scalar, and other types,不會 waring
- 如果原數據的數據類型是:tensor,使用 torch.tensor(data) 就會報waring
# 原數據類型是:tensor 會發出警告 import numpy import torch a = torch.tensor([1, 2, 3], device=torch.device('cuda')) t = torch.tensor(a) t[0] = -1 print(a) print(t) # 輸出: # tensor([1, 2, 3], device='cuda:0') # tensor([-1, 2, 3], device='cuda:0') # /opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:5: UserWarning: To copy construct from a tensor, it is recommended to use sourceTensor.clone().detach() or sourceTensor.clone().detach().requires_grad_(True), rather than torch.tensor(sourceTensor).
# 原數據類型是:list, tuple, NumPy ndarray, scalar, and other types, 沒警告 import torch import numpy a = numpy.array([1, 2, 3]) t = torch.tensor(a) b = [1,2,3] t= torch.tensor(b) c = (1,2,3) t= torch.tensor(c)
結論就是:以后盡量用 torch.as_tensor()
吧
總結
原文鏈接:https://blog.csdn.net/weixin_37804469/article/details/128767214
相關推薦
- 2022-08-26 如何利用python在剪貼板上讀取/寫入數據_python
- 2022-06-02 python?面向對象開發及基本特征_python
- 2022-06-01 Android實現簡單的照相功能_Android
- 2023-02-26 React?Fiber原理深入分析_React
- 2023-11-26 (有效解決)Android Studio 運行項目時報 Package install error:
- 2022-03-24 C語言常見的文件操作函數_C 語言
- 2022-11-27 C++中順序表操作的示例代碼_C 語言
- 2022-10-04 Nginx?502?bad?gateway錯誤解決的九種方案及原因_nginx
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支