深度學習基礎1

一、張量

  • 張量其實就是數組,不過是在深度學習中是這樣的叫法

1.張量的創建

(1)基本創建方式

  • torch.tensor():根據指定數據創建張量
import torch 
import numpy as np
"""創建張量標量"""
data = torch.tensor(10)
print(data) # 輸出結果tensor(10)"""numpy數組"""
data = np.random.randn(2, 3)
data = torch.tensor(data)
print(data) # 輸出結果tensor([[0.1345,0.1149,0.2435],#                 [0.8026,-0.6744,-1.0918]],dtype                                             = torch.float64)"""列表,下面代碼使用默認元素類型"""
data = [[10.,20.,30.],[40.,50.,60.]]
data = torch.tensor(data)
print(data) # 輸出結果tensor([[10.,20.,30.],#                [40.,50.,60.])
  • torch.Tensor():根據指定形狀創建張量,也可以用來創建指定數據的張量
"""創建2行3列的張量"""
data = torch.Tensor(2, 3)
"""注意:如果傳遞列表,則創建包含指定元素的張量"""
data = torch.Tensor([10])data = torch.Tensor([10, 20]) # tensor([10., 20.])
  • torch.IntTensor()、torch.FloatTensor()、torch.DoubleTensor():創建指定類型的張量
"""創建2行3列"""
torch.IntTensor(2, 3)"""列表"""
torch.IntTensor([2,3]) # 輸出 tensor([2.,3.])"""如果類型不符合,則會強制轉換"""
torch.IntTensor([2.43,3.42]) # 輸出 tensor([2.,3.])

(2)創建線性和隨機張量

  • torch.arangetorch.linspace創建線性張量
data = torch.arange(0,10,2) # 輸出結果 tensor([0,2,4,6,8])
data = torch.linspace(0,9,10) 
  • torch.random.init_seedtorch.random.manual_seed隨機種子設置
  • torch.randn創建隨機張量
data = torch.randn(2,3) # 創建2行3列張量"""查看隨機數種子"""
print('隨機數種子':torch.random.initial_seed())"""隨機數種子設置"""
torch.random.manual_seed(100)
data = torch.randn(2,3)
print(data)
print('隨機數種子:',torch.random.initial_seed())

(3)創建0-1張量

  • torch.onestorch.ones_like創建全1張量
  • torch.zerostorch.zeros_like創建全0張量
  • torch.fulltorch.full_like創建全為指定值張量
data = torch.randn(2,3)
torch.zeros(4,5) # 生成4行5列全為0的二維數組
torch.zeros_like(data) #  生成2行3列全為0的二維數組torch.ones(4,5)
torch.ones_like(data)torch.full([4,5],10) # 生成4行5列 全為10的二維數組
torch.full_like(data,20)

2.張量的類型轉換

(1)張量元素的類型轉換

  • data.type(torch.DoubleTensor):ShortTensor,IntTensor, LongTensor, FloatTensor
  • data.double():short, int, long, float
data = torch.randn(4, 5)
print(data)
print(data.dtype) # torch.float32
print(data.type(torch.IntTensor).dtype) # torch.int32
print(data.int().dtype) # torch.int32

(2)張量轉換成Numpy數組

  • 使用Tensor.numpy函數可以將張量轉換為ndarray數組,但是共享內存,可是使用copy函數避免共享
# 共享空間
import torch
import numpy as nptorch.random.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_numpy)
print(data_tensor)# 使用copy函數避免空間共享
import torch
import numpy as nptorch.manual_seed(2)
data_tensor = torch.randint(0, 10, [2, 3])
print(type(data_tensor))data_numpy = data_tensor.numpy().copy()
print(type(data_numpy))data_numpy[0][0] = 100
print(data_tensor)
print(data_numpy)

(3)Numpy數組轉換為張量

  • 使用from_numpy可以將naddray數組轉換為Tensor,默認共享內存,同樣可以使用copy函數避免內存共享
  • 使用torch.tensor可以將ndarray數組轉換為Tensor,默認不共享內存
# 內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[10  2  3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10,  2,  3], dtype=torch.int32)
# 避免內存共享
import torch
import numpy as npdata_numpy = np.array([1, 2, 3])
data_tensor = torch.Tensor(data_numpy)
data_tensor[0] = 10
print(data_numpy)
print(data_tensor)
[1 2 3]
tensor([10.,  2.,  3.])

(4)標量張量和數字轉換

  • 對于只有一個元素的張量,使用item()函數將該值從張量中提取出來
    • 注意:在后面的反向傳播中,必須要加上item(),否則模型會報錯
import torchdata = torch.tensor(30)
print(data) # tensor(30)
print(data.item()) # 30data1 = torch.tensor([30])
print(data1) # tensor([30])
print(data1.item()) # 30 (得到的不是[30],最終只能得到數值)

3.張量數值計算

(1)張量的基本運算

加減乘除取負號

  • add, sub, mul, div, neg

  • add_, sub_, mul_, div_, neg_(其中帶下劃線的版本會修改原數據)

import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add(10))
print(data) # 原數據并沒有發生改變
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[9, 6, 6],[4, 2, 2]])
import torchtorch.random.manual_seed(22)
data = torch.randint(0, 10, [2, 3])
print(data)print(data.add_(10))
print(data) # 原數據會發生改變
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[19, 16, 16],[14, 12, 12]])
tensor([[19, 16, 16],[14, 12, 12]])

(2)點乘運算

  • 定義:是兩個同維矩陣對應位置的元素相乘,使用mul和運算符*實現
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 3])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [2, 3])
print(data2)# 點乘
print(torch.mul(data1, data2))print(data1 * data2)
輸出結果:
tensor([[9, 6, 6],[4, 2, 2]])
tensor([[1, 6, 6],[7, 0, 2]])
tensor([[ 9, 36, 36],[28,  0,  4]])
tensor([[ 9, 36, 36],

(3)矩陣乘法

  • 矩陣乘法運算要求第一個矩陣shape:(n, m),第二個矩陣shape:(m ,p),兩個矩陣點積運算shape為(n, p)
    • 運算符@用于進行兩個矩陣的乘積運算
    • torch.matmul對進行乘積運算的兩矩陣形狀沒有限定,對數輸入的shape不同的張量,對應的最后幾個維度必須符合矩陣運算規則
import torchtorch.random.manual_seed(22)
data1 = torch.randint(0, 10, [2, 4])
print(data1)torch.random.manual_seed(23)
data2 = torch.randint(0, 10, [4, 5])
print(data2)# 矩陣乘法
print(data1 @ data2)print(torch.matmul(data1, data2))
輸出結果:
tensor([[9, 6, 6, 4],[2, 2, 2, 1]])
tensor([[1, 6, 6, 7, 0],[2, 7, 1, 4, 7],[5, 6, 3, 7, 8],[7, 5, 2, 9, 8]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])
tensor([[ 79, 152,  86, 165, 122],[ 23,  43,  22,  45,  38]])

4.常見運算函數

  • 均值
  • 平方根
  • 指數計算
  • 對數計算
import torchdata = torch.randint(0, 10, [2, 3],dtype = torch.float64)
print(data)"""計算均值(注意:tensor必須為Float或者Double類型)"""
print(data.mean())
print(data.mean(dim = 0)) # 按列計算均值
print(data.mean(dim = 1)) # 按行進行計算"""計算總和"""
print(data.sum())
print(data.sum(dim = 0))
print(data.sum(dim = 1))"""計算平方"""
print(torch.pow(data, 2))"""計算平方根"""
print(data.sqrt())"""指數計算"""
print(data.exp())"""對數計算"""
print(data.log())
print(data.log2())
print(data.log10())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/87896.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/87896.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/87896.shtml

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

相關文章

力扣網編程274題:H指數之普通解法(中等)

一. 簡介 本文記錄力扣網上涉及數組,排序方面的編程題:H指數。 二. 力扣網編程274題:H指數(中等) 給你一個整數數組 citations ,其中 citations[i] 表示研究者的第 i 篇論文被引用的次數。計算并返回該研…

iptables防火墻,多IP環境下, 指定某個目的IP地址通過某個本地IP訪問,策略路由!

需求在CentOS 7.9中,若需從特定源IP(10.0.0.3)訪問目標網段 1.1.1.0/24方法一:策略路由(支持網段)1. 創建自定義路由表# 添加名為custom_table的路由表(ID200) echo "200 custo…

數字孿生技術引領UI前端設計新趨勢:數據可視化與交互設計的深度融合

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言:數字孿生驅動 UI 設計的范式革新在大數據與三維可視化技術爆發的今天&…

【機器學習筆記 Ⅱ】6 激活函數

激活函數是神經網絡的核心組件,其作用遠不止“引入非線性”。以下是系統化的解析:1. 核心作用 (1) 引入非線性沒有激活函數:多層神經網絡等價于單層線性變換(矩陣連乘仍是線性)。加入激活函數:每層通過非線…

AI無標記動捕如何結合VR大空間技術打造沉浸式游戲體驗

隨著數字科技的迅猛發展,VR大空間技術正逐步成為各行業探索沉浸式體驗的重要方向。在VR游戲領域,市場對于高度沉浸式體驗的需求日益增長,而傳統VR游戲主要依賴手柄和基礎體感進行交互,而在VR大空間中,用戶可以通過全身…

Qt智能指針

在 Qt 框架中,智能指針用于自動管理對象的生命周期,防止內存泄漏。以下是 Qt 中主要的智能指針及其用法詳解:1. QScopedPointer作用:獨占所有權,超出作用域時自動釋放對象(類似 std::unique_ptr&#xff09…

408第三季part2 - 計算機網絡 - 信道利用率

理解t1是發送幀的傳輸時間t2是確認幀的傳輸時間中間是傳播過程這整個過程就是發送周期任何題目會有以下幾種情況題目這里數據幀和確認幀長度是一樣的t1 t2然后把t1的傳輸數據算出來然后傳播是0.2sd停止等待 k1確認幀忽略t2 0t1算好后,求數據幀的長度下面是速率&…

Android framework 開發者模式下,如何修改動畫過度模式

Android framework 開發者模式下, 如何修改動畫過度模式 開發者模式下,動畫過度 模式1.0→0.5,按如下方式修改。 開發云 - 一站式云服務平臺 .../core/java/com/android/server/wm/WindowManagerService.java | 8 ---- 1 file changed, …

win11安裝paddlelabel并創建目標檢測項目

創建虛擬環境 conda create -n paddlelabel python3.11.11 conda activate paddlelabel通過以下命令安裝 pip install --upgrade paddlelabel輸入命令pdlabel運行paddlelabel,發現報錯: ModuleNotFoundError: Please install connexion using the flask …

關于Novatek B/G-R/G白平衡色溫坐標系再探究

目錄 一、準備知識 二、色溫坐標系的構建 三、Novatek白平衡色溫坐標系的再探究 2.1 直線白點框 2.2雙曲線白點框 四、仿真代碼 之前寫的一篇博文關于聯詠(Novatek )白平衡色溫坐標系探究-CSDN博客感覺邏輯上有些混亂,這個周末我又好好思考了下,以…

基于路徑質量的AI負載均衡異常路徑檢測與恢復策略

AI流量往往具有突發性、大象流(大規模數據流)占比高的特點,極易造成網絡擁塞熱點。一條質量不佳(如高延遲、高丟包、帶寬受限)的路徑,不僅自身無法有效傳輸數據,如果ECMP繼續向其分發流量&#…

ubuntu22.04 安裝cuda cudnn

1.輸入nvidia-smi查看可以支持安裝的cuda最大版本 2.cuda與cudnn版本的選擇 核心原則 向下兼容性:較新的 cuDNN 通常兼容舊版 CUDA,但反之不成立 框架依賴:優先考慮深度學習框架(TensorFlow/PyTorch)的版本要求 硬件…

5、Receiving Messages:Message Listener Containers

提供了兩個MessageListenerContainer實現: KafkaMessageListenerContainer ConcurrentMessageListener容器 KafkaMessageListenerContainer在單個線程上接收來自所有主題或分區的所有消息。ConcurrentMessageListenerContainer委托給一個或多個KafkaMessageListe…

JDBC 注冊驅動的常用方法詳解

JDBC 注冊驅動的常用方法詳解 在 JDBC 中,注冊驅動是建立數據庫連接的第一步。以下是幾種常用的驅動注冊方式: 1. 顯式類加載(傳統方式) // 通過 Class.forName() 加載驅動類 Class.forName("com.mysql.cj.jdbc.Driver&qu…

插入數據優化

目錄 一.插入數據優化 1.insert語句優化 ①批量插入 ②手動提交事務 ③主鍵順序插入 2.大批量插入數據(100萬條) 舉例 第一步:連接數據庫時,加上--local-infile屬性 第二步:查看全局參數local_infile的值&…

區塊鏈在域名系統安全中的應用進展綜述

一、區塊鏈與DNS結合的核心原理1.1 傳統DNS的安全缺陷中心化架構:傳統DNS依賴中心化服務器(如ICANN管理的根服務器),存在單點故障風險,易受DDoS攻擊或配置錯誤影響。協議脆弱性:DNS協議設計之初缺乏加密和認…

GO Web 框架 Gin 完全解析與實踐

目錄 1. 為什么選擇 Gin?解鎖 Go Web 開發的超能力 Gin 的核心優勢 什么時候用 Gin? 第一個 Hello World 2. 路由的藝術:從簡單 GET 到復雜匹配 基礎路由 高級路由技巧 性能優化小貼士 3. 中間件的魔法:讓請求處理更聰明 內置中間件 自定義中間件 中間件的最佳實…

RabbitMQ使用topic Exchange實現微服務分組訂閱

案例場景:用戶下單后需要多個微服務(如營銷、會員)分別訂閱并處理訂單事件,且每個微服務可能有多個集群實例,需要保證同一個微服務的集群中,只有一個實例消費到消息。不同于Kafka和rocketMQ有分組消費的功能…

kotlin 通道trysend方法

trySend 方法是 Kotlin 協程中 Channel 類的一個重要功能。它用于向通道發送元素,但與 send 方法不同的是,trySend 是非阻塞的。這意味著它不會在通道滿時掛起當前協程,而是會立即返回。 trySend 方法的效果 非阻塞行為: 當你調用…

winform CheckedListBox單擊選中解決方案

在WinForms的CheckedListBox控件中,默認需要雙擊才能切換選中狀態(復選框勾選)。要實現單擊即選中,需要通過代碼處理鼠標點擊事件并手動切換選中狀態。以下是實現步驟: 1.CheckOnClick屬性置為true即可。 2.通過事件處…