zoukankan      html  css  js  c++  java
  • pytorch里一些函数的说明记录

    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

  • 相关阅读:
    POJ1185:炮兵阵地(状压dp)
    POJ3254:Corn Fields(状压dp第一发)
    二进制x&(x-1);
    子集和问题(应用--换零钱)POJ2229:Sumsets
    JAVA math包
    UVA+POJ中大数实现的题目,持续更新(JAVA实现)
    HDU中大数实现的题目,持续更新(JAVA实现)
    SDUT中大数实现的题目,持续更新(JAVA实现)
    JAVA与ACM
    HDU3123:GCC(同余模简单题)
  • 原文地址:https://www.cnblogs.com/catnip/p/8508294.html
Copyright © 2011-2022 走看看