無腦入門pytorch系列(四)—— scatter_

本系列教程適用于沒有任何pytorch的同學(簡單的python語法還是要的),從代碼的表層出發挖掘代碼的深層含義,理解具體的意思和內涵。pytorch的很多函數看著非常簡單,但是其中包含了很多內容,不了解其中的意思就只能【看懂代碼】,無法【理解代碼】。

目錄

  • 官方定義
  • demo
  • one-hot

官方定義

torch.tensor.scatter_是PyTorch中的一個函數,用于將指定索引處的值替換為給定的值。

函數定義:

Tensor.scatter_(dim, index, src, reduce=None) → Tensor

官方解釋:

  • 將張量src中的所有值寫入索引張量中指定的index處的self。

  • 對于src中的每個值,它的輸出索引由其在src中的索引(dimension != dim)和在index中對應的值(dimension = dim)指定。

非常難以理解,十分抽象,從我個人的角度來說就是:

  • 第一個參數dim表示維度,即在第幾維度處理數據,保持其它維度不變。
  • reduce參數是一個可選參數,用于指定如何在執行散射(scatter)操作時對重復的索引值進行合并或聚合。
  • index則是需要填充的列的索引,即根據維度從src中取對應的值填充到tensor中去。

怎么映射的,比如一個一個3維張量:

self[index[i][j][k]][j][k] = src[i][j][k]  # if dim == 0
self[i][index[i][j][k]][k] = src[i][j][k]  # if dim == 1
self[i][j][index[i][j][k]] = src[i][j][k]  # if dim == 2

官方的文檔如下,TORCH.TENSOR.SCATTER_:

image-20230818104242738

即使如此理解起來也是很復雜,下面從例子中去理解:

demo

下面是一個官方文檔給出的例子:

import torchsrc = torch.Tensor([[-1.0276,  0.2673, -1.1752, -0.8823],[-0.6447, -0.8256,  0.1542, -0.4242]])
print(src)output = torch.zeros(2, 5)
index = torch.tensor([[3, 1, 2, 0], [1, 2, 0, 3]])output = output.scatter(1, index, src)
print(output)

輸出的結果:

image-20230818142004545

我們一步步理解代碼:

  1. 首先,定義了一個src張量,后續output即從src中取值。
  2. 其次,定義了output,其值為二行五列的全零張量,后續對output進行修改。
  3. 接著,定義了index,即從src取值的索引。
  4. 最后,根據index從src取值填充到output中,即完成操作。

那么具體是如何取值的呢?

首先,dim = 1,意味著從維度值為1的地方取值,維度值為0的地方不變,那就是:

self[i][index[i][j]] = src[i][j]  # if dim == 1

具體來說:

i = 0, j = 0時,output[0][index[0][0]] = src[0][0],因為index[0][0] = 3,所以output[0][3] = src[0][0] = -1.0276,這時候我們檢查輸出的output值,確實是-1.0276

同理:

i = 0, j = 1: output[0][index[0][1]] = output[0][1] = src[0][1] = 0.2673

i = 0, j = 2: output[0][index[0][2]] = output[0][2] = src[0][2] = -1.1752

one-hot

作者在學習該函數時實在遇到one-hot編碼時遇到的,而該函數在one-hot中應用很廣:

index = torch.tensor([[3], [2], [0], [1]])
onehot = torch.zeros(4, 4)
onehot.scatter_(1, index, 1)
print(onehot)

image-20230818143854519

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

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

相關文章

element問題總結2

20.隱藏el-calendar 的多余的日子 /deep/ .el-calendar-table:not(.is-range) td.next {display: none;}/deep/ .el-calendar-table:not(.is-range) td.prev {visibility: hidden;}/deep/ .el-calendar-table td {border: 1px solid #dfe6ec;} 21.點擊今天,上個月,下個月的時候…

深入理解內存 —— 函數棧幀的創建與銷毀

前言 一位優秀的程序員,必須對內存的分布有深刻的理解,在初學編程的時候,往往有諸如以下很多問題困擾著初學者,而通過今天的分享,我們就可以通過自己的觀察,將這些問題統統解決掉 局部變量是怎么創建的&…

keepalived集群

keepalived概述 keepalived軟件就是通過vrrp協議來實現高可用功能。 VRRP通信原理 VRRP就是虛擬路由冗余協議,它的出現就是為了解決靜態路由的單點故障。 VRRP是通過一種競選一種協議機制來將路由交個某臺VRRP路由器。 VRRP 用IP多播的方式(多播地…

微信小程序中pdf的上傳、下載及excel導出

微信小程序中pdf的上傳、下載及excel導出 pdf上傳上傳1&#xff1a;上傳2&#xff1a; pdf下載導出excel pdf上傳 上傳兩種方法&#xff1a; 上傳1&#xff1a; 1.用vant weapp組件&#xff1a; //pdf上傳--vant weapp組件 <view class"content"><van-u…

推薦算法知識

有志者&#xff0c;事竟成 1. 聯盟的含義 2. Attention 3. Transformer 4. Learning to rank的三種方式 1. point-wise 2. pair-wise 3. list-wise 5. 推薦系統中的校準&#xff08;如保序回歸等&#xff09; 6. 推薦系統中的偏差與處理&#xff08;如位置偏差等&#xff09…

C#中的泛型約束可以用在以下幾個地方?

1.泛型類型參數&#xff1a; 在定義泛型類型或泛型方法時&#xff0c;可以使用泛型約束來限制泛型類型參數的類型。這可以確保類型參數滿足特定的條件&#xff0c;從而在編譯時捕獲錯誤并提供更安全和可靠的代碼。 public class MyClass<T> where T : IComparable<T&…

【React學習】React中的setState方法

1. setState概述 setState 是React框架中&#xff0c;用于更新組件狀態的方法。 setState 方法由React組件繼承自 React.Component 類的一部分。通過調用 setState&#xff0c;可以告訴 React要更新組件的狀態&#xff0c;并觸發組件的重新渲染。 this.setState(newState, ca…

C語言中常見的一些語法概念和功能

常用代碼&#xff1a; 程序入口&#xff1a;int main() 函數用于定義程序的入口點。 輸出&#xff1a;使用 printf() 函數可以在控制臺打印輸出。 輸入&#xff1a;使用 scanf() 函數可以接收用戶的輸入。 條件判斷&#xff1a;使用 if-else 語句可以根據條件執行不同的代碼…

【力扣每日一題】2023.8.15 字符中的查找與替換

目錄 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代碼&#xff1a; 題目&#xff1a; 示例&#xff1a; 分析&#xff1a; 題目很長&#xff0c;簡而言之就是檢查字符串中對應索引的位置是否有特定的字符串&#xff0c;如果有&#xff0c;那么替換&#xff0c;返…

Ceph如何操作底層對象數據

1.基本原理介紹 1.1 ceph中的對象(object) 在Ceph存儲中&#xff0c;一切數據最終都會以對象(Object)的形式存儲在硬盤&#xff08;OSD&#xff09;上&#xff0c;每個的Object默認大小為4M。 通過rados命令&#xff0c;可以查看一個存儲池中的所有object信息&#xff0c;例如…

Optional的基礎運用

Optional的基礎運用 簡介代碼示例 簡介 代碼示例 package org.example;import org.junit.Test;import java.util.Optional;public class OptionalTest {Testpublic void advance() {String str "hello";str null;// of(T t):封裝數據t生成Optional對象&#xff0c…

【筆試題心得】關于正則的一些整理

本文部分內容摘抄整理自 正則表達式 – 教程 | 菜鳥教程 在筆試的過程中&#xff0c;也常常會對正則表達式進行考察&#xff0c;這里對正則表達式的常見用法&#xff0c;做一個學習和總結。 正則表達式的模式可以包括以下內容&#xff1a; 字面值字符&#xff1a;例如字母、數…

數據結構:堆的實現

1.堆的概念 如果有一個關鍵碼的集合 K { k1 &#xff0c;k2 &#xff0c;k3 &#xff0c;…&#xff0c;kn }&#xff0c;把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數組中&#xff0c;并且 k(i) < k(i*21) 和 k(i) < k(i*22)&#xff0c; i 0 &#xff…

MongoDB增刪改查操作

數據庫操作&#xff1a; 在MongoDB中&#xff0c;文檔集合存在數據庫中。 要選擇使用的數據庫&#xff0c;請在mongo shell程序中發出 use <db> 語句 // 查看有哪些數據庫 show dbs;// 如果數據庫不存在&#xff0c;則創建并切換到該數據庫&#xff0c;存在則直接切換到…

分布式消息中間件

消息中間件是Java開發消息隊列的一種中間件產品。中間件類似windows編程開發中的插件。工具插件在軟件工具中是中間插件。插件也是應用程序。消息的分發過程包裝之后是chatlog 系統或者是手機短信。系統與系統之間的通信通過消息的發送和接收。堆積頻繁過多的系統通知消息需要進…

C++之模板進階

模板進階 非類型模板參數模板的特化概念函數模板特化類模板特化全特化偏特化 模板分離編譯什么是分離編譯模板的分離編譯解決方法 模板總結 非類型模板參數 模板參數分兩種&#xff1a;類型形參與非類型形參。 類型形參&#xff1a;出現在模板參數列表中&#xff0c;跟在class…

docker安裝consul

1、下載consul鏡像 docker pull consul2、啟動consul docker run -d --restartalways --name consul -p 8500:8500 consul agent -server -bootstrap-expect1 -ui -bind0.0.0.0 -client0.0.0.03、查看consul日志 docker logs consul4、檢驗是否安裝成功

drawio----輸出pdf為圖片大小無空白(圖片插入論文)

自己在寫論文插入圖片時為了讓論文圖片放大不模糊&#xff0c;啥方法都試了&#xff0c;最后摸索出來這個。 自己手動畫圖的時候導出pdf總會出現自己的圖片很小&#xff0c;pdf的白邊很大如下如所示&#xff0c;插入論文的時候后雖然放大不會模糊&#xff0c;但是白邊很大會顯…

【數據結構OJ題】用隊列實現棧

原題鏈接&#xff1a;https://leetcode.cn/problems/implement-stack-using-queues/ 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 可以用兩個隊列去實現一個棧&#xff0c;每次始終保持一個隊列為空。 入棧相當于給非空隊列進行入隊操作。 出棧相…

異步電機IM-改進的電壓模型磁鏈觀測器學習

導讀&#xff1a;本期文章主要介紹異步電機的改進型電壓模型磁鏈觀測器。傳統純積分形式的積分器在低速區域存在初始值問題和直流偏置問題&#xff0c;所以在實際應用中必須對電壓模型進行改進。本期文章中的對電壓模型改進是借鑒一篇IEEE中的方法。 如果需要文章中對應的仿真…