pytorch裡一些函式的說明記錄

2022-07-13 13:27:16 字數 3884 閱讀 7301

thlongstorage *thtensor_(newsizeof)(thtensor *self);

thlongstorage *thtensor_(newstrideof)(thtensor *self);

把thtensor的size/stride資料提取出來,賦值給乙個新的thlongstorage並返回

th_api void thtensor_(narrow)(thtensor *self, thtensor *src, int dimension, long firstindex, long size);

從src裡找到第dimension個維度,從這個維度的firstindex開始,連續取size個子tensor

self複製於src,通過修改self->storageoffset和self->size[dimension]來維持檢視的正確。

th_api void thtensor_(select)(thtensor *self, thtensor *src, int dimension, long sliceindex);

去src裡的第dimension維度裡的第sliceindex個子tensor, 結果在self上進行修改

self通過前移size、stride,修改ndimesion來維持檢視正確。

呼叫了thtensor_(narrow)

void thtensor_(resize)(thtensor *self, thlongstorage *size, thlongstorage *stride);

先做一些檢查,size不能為null,stride可以為null,也可以存在,

如果stride存在,size -> size 和 stride -> size 必須一樣,這個是由tensor的構造決定的,檢查完畢後,呼叫resizend

void thtensor_(resizend)(thtensor *self, int ndimension, long *size, long *stride);

重置乙個thtensor維度的函式,和newview不一樣,這個不是要求元素總量一致的情況下修改檢視,

而是直接把指定thtensor變成新的指定size/stride,視情況還會修改底層的thstorage

對ndimension迴圈,檢查現在self的stride和size是否能夠與目標的stride和size對應,

其實就是逐維檢查size[d]、stride[d]和 self->size[d]、self->stride[d]是否一致,如果完全一致就直接沿用不需要resize了

size的最後幾個維度可能會有負數,遇到這種負數一律跳出,並且修改ndimension為實際要變換的數量。

如果self現有的屬性和指定的dimension不符合,那就重分配size和stride陣列的長度,然後重賦值

如果計算發現底層thstorage儲存不夠,或者thstorage直接為null,就重分配或者new乙個thstorage

void thtensor_(indexselect)(thtensor *tensor, thtensor *src, int dim, thlongtensor *index);

把src裡的第dim維的index個子張量取出,在tensor中儲存

如,src是3x4x5x6,dim=1,index=[2, 0, 1],取出後的tensor維度是3x3x5x6

void thtensor_(indexcopy)(thtensor *tensor, int dim, thlongtensor *index, thtensor *src);

tensor裡的資料的第dim維,按index的順序,被src的dim維按自然數順序賦值

比如,src是3x4x5x6,dim=1,index=[2, 0, 3, 1],此時tensor的dim1index2被src的dim1index0賦值,dim1index0被dim1index1賦值,以此類推

這便要求index的長度與src -> size[dim]必須相等,

index裡的數字不重複也不報錯,但是實際執行並不會如意,當index=[0, 0, 0, 0]時,

並不是tensor的每乙個子張量都等於src[:, 0, :, :],而是迴圈中tensor第0個、0個、0個、0個子張量被賦予src的第1、2、3、4個子張量

最後實際上相當於把tensor的第0個子張量賦為src的第4個子張量

【務必注意】這個分配順序和indexselect是相反的

void thtensor_(gather)(thtensor *tensor, thtensor *src, int dim, thlongtensor *index);

void thtensor_(scatter)(thtensor *tensor, int dim, thlongtensor *index, thtensor *src);

這兩個也是剛好相反的,gather是用index的順序,從src中收集資料,賦值給按自然數迴圈的tensor

scatter是把tensor的index位置資料,用src以自然數迴圈的值填充,相當於把src「打散」了

這兩個名字也非常形象

th_api void thtensor_(validxcorr2dptr)(real *r_, real alpha,real *t_, long ir, long ic,real *k_, long kr, long kc, long sr, long sc);

二維卷積操作

t_: input  ||  ir, ic: data rows, cols  ||  kr, kc: kernel rows, cols  ||  sr, sc: stride rows, cols || r_: output

#define thnn_resizeas_indices(i1, i2)

i1, i2兩個tensorindextensor(tensorlongtensor),對i1做resize成i2的維度

#define thnn_check_shape(i1, i2)

檢查i1, i2兩個的size是否相同

#define thnn_check_shape_indices(i1, i2)

和check_shape基本一樣,不同的是它先用thstorage存i2的size2資訊,用i1和i2的size2比較,比較完以後再釋放

非常奇怪,為什麼要這樣做,和上乙個巨集在應用中的差別在**?

#define thnn_check_nelement(i1, i2)

檢查i1, i2是否具有同等數量的元素

#define thnn_check_dim_size(t, dim, dim_size, size)

#define thnn_check_dim_size_indices(t, dim, dim_size, size)

要求t的維度等於dim,t的第dim_size個維度大小等於size

PyTorch的一些類及函式

以下是一些我在使用pytorch中遇到的一些類及函式,為了便於理解和使用,將官網中的說明摘錄一些下來。class conv1d convnd def init self,in channels,out channels,kernel size,stride 1,padding 0,dilation ...

phpmcs 裡的一些函式

message alert,goback 顯示js訊息對話方塊形式的提示資訊 無返回值,alert為提示資訊內容,goback引數是使用者確認後跳轉的url位址 此引數可選,預設為空即不進行跳轉,如果該引數的值為 goback 則使用者確認後瀏覽器自動跳轉到前乙個開啟的位址,如果該引數的值為 clo...

matlab裡 p檔案的一些說明

其實.p檔案是對應.m檔案的一種預解析版本。matlab裡最常見的是 語句或函式寫在乙個.m檔案裡。偶爾會遇到.p檔案。在此對.p檔案做一些簡單的說明。實際中,第一次執行.m檔案時,matlab需要將其解析一次 第一次執行後的已解析內容會放入記憶體作第二次執行時使用,即第二次執行時無需再解析 這無形...