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里一些函数的说明记录的更多相关文章

  1. Pytorch里的CrossEntropyLoss详解

    在使用Pytorch时经常碰见这些函数cross_entropy,CrossEntropyLoss, log_softmax, softmax.看得我头大,所以整理本文以备日后查阅. 首先要知道上面提 ...

  2. ARTS-S pytorch中backward函数的gradient参数作用

    导数偏导数的数学定义 参考资料1和2中对导数偏导数的定义都非常明确.导数和偏导数都是函数对自变量而言.从数学定义上讲,求导或者求偏导只有函数对自变量,其余任何情况都是错的.但是很多机器学习的资料和开源 ...

  3. javascript中利用柯里化函数实现bind方法

    柯理化函数思想:一个js预先处理的思想:利用函数执行可以形成一个不销毁的作用域的原理,把需要预先处理的内容都储存在这个不销毁的作用域中,并且返回一个小函数,以后我们执行的都是小函数,在小函数中把之前预 ...

  4. CTEX里的函数、符号及特殊字符

    CTEX里的函数.符号及特殊字符 声调 语法 效果 语法 效果 语法 效果 \bar{a}   \acute{a}   \check{a}   \grave{a}   \tilde{a}   \hat ...

  5. c#调用js,以及js调用C#里的函数, c#自己生成js代码,实现对web的控制

    using mshtml;using System;using System.Collections.Generic;using System.Linq;using System.Security.P ...

  6. 柯里化函数之Javascript

    柯里化函数之Javascript 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...

  7. 浅谈JavaScript中的柯里化函数

    首先,不可避免的要引经据典啦,什么是柯里化函数呢(from baidu): 在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返 ...

  8. Swift # 柯里化函数

    前言 此次文章,讲述的是Swift的一个新特性(柯里化函数),可能很多iOS开发人员是第一次听这个词汇,包括我自己也是,自己也用了几天时间才总结出来,希望能帮助到各位咯,个人感觉偏向有开发经验的码友, ...

  9. C语言中如何调用另一个源文件里的函数

    在开发大型项目时,我们常常需要将一份源码分成多个源文件来进行编写,这样可以方便后期的维护.下面就介绍如何从一个源文件里调用另一个源文件的函数. 在源文件A1.c中调用A2.c 中的函数有两种方法: 1 ...

随机推荐

  1. 合并cookie,提取json数据

    发送的第3个请求需要前两个请求的cookie,需要对cookie进行合并 发送的请求数据来自于json数据中的某个键值. 这里是删除所有的对话主题目录,每一个目录有一个id,发起删除对话主题目录的请求 ...

  2. 隐私标签(Privacy.Tag):轻轻一贴,愉快拍照!

    用相机去捕捉精彩瞬间,用照片来记录生活足迹,并实时地与朋友们分享当下的心情,似乎已成为我们忙碌生活中最有趣的调味剂.但随着移动设备照相功能的日益完善,以及各大社交平台的不断兴起,很多时候,你是否也会有 ...

  3. Hadoop的存储架构介绍

    http://lxw1234.com/archives/2016/04/638.htm 该文章介绍了Hadoop的架构原理,简单易懂. 目前公司提供Hadoop的运算集群BMR,可以直接申请集群资源.

  4. CORS’s source, Principle and Implementation

    跨域资源共享(CORS) 是一种机制,它使用额外的 HTTP 头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源.当一个资源从与该资源 ...

  5. Ionic3学习笔记(七)Storage

    本文为原创文章,转载请标明出处 目录 简介 安装 配置 使用 1. 简介 Storage可以很容易的存储键值对和JSON对象.Storage在底层使用多种存储引擎,根据运行平台选择最佳的存储方式. 当 ...

  6. RocketMQ集群平滑下线或重启某个节点

    1.现状描述 集群其中一台物理机未知原因导致单用户无法登陆机器,该物理机需要重启修改密码或者重装系统.该台为master节点,运行正常.配置策略为: 异步刷盘 主从异步复制 如果直接下线该master ...

  7. 图示JVM工作原理

    JDK,JRE,JVM的联系是啥? JVM Java Virtual Machine JDK Java Development Kit JRE Java Runtime Environment 看上图 ...

  8. ysoserial-调试分析总结篇(1)

    前言: ysoserial很强大,花时间好好研究研究其中的利用链对于了解java语言的一些特性很有帮助,也方便打好学习java安全的基础,刚学反序列化时就分析过commoncollections,但是 ...

  9. Spring Boot从入门到精通(五)多数据源配置实现及源码分析

    多数据源配置在项目软件中是比较常见的开发需求,Spring和Spring Boot中对此都有相应的解决方案可供大家参考.在Spring Boot中,如MyBatis.JdbcTemplate以及Jpa ...

  10. C++走向远洋——29(长方柱类)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:长方柱类.cpp * 作者:常轩 * 微信公众号:Worldhe ...