一、简单数学操作

1、逐元素操作

t.clamp(a,min=2,max=4)近似于tf.clip_by_value(A, min, max),修剪值域。
a = t.arange(0,6).view(2,3)
print("a:",a)
print("t.cos(a):",t.cos(a))
print("a % 3:",a % 3) # t.fmod(a, 3)
print("a ** 2:",a ** 2) # t.pow(a, 2)
print("t.clamp(a, min=2, max=4)",t.clamp(a,min=2,max=4))
a:
0 1 2
3 4 5
[torch.FloatTensor of size 2x3] t.cos(a):
1.0000 0.5403 -0.4161
-0.9900 -0.6536 0.2837
[torch.FloatTensor of size 2x3] a % 3:
0 1 2
0 1 2
[torch.FloatTensor of size 2x3] a ** 2:
0 1 4
9 16 25
[torch.FloatTensor of size 2x3] t.clamp(a, min=2, max=4)
2 2 2
3 4 4
[torch.FloatTensor of size 2x3]

2、归并操作

b = t.ones(2,3)
print("b.sum():",b.sum(dim=0,keepdim=True))
print("b.sum():",b.sum(dim=0,keepdim=False))
b.sum():
2 2 2
[torch.FloatTensor of size 1x3] b.sum():
2
2
2
[torch.FloatTensor of size 3]

cumsum和cumprob(累加和累乘)属于特殊的归并,结果相对于输入并没有降维。

3、比较操作

之前有说过,t.max用法较为特殊;而a.topk是个对于深度学习很是方便的函数。

a = t.linspace(0,15,6).view(2,3)
print("a:",a)
print("a.sort(2):\n",a.sort(dim=1)) # 在某个维度上排序
print("a.topk(2):\n",a.topk(2,dim=1)) # 在某个维度上寻找top-k
print("t.max(a):\n",t.max(a)) # 不输入dim的话就是普通的max
print("t.max(a,dim=1):\n",t.max(a,dim=1)) # 输入dim的话就会集成argmax的功能
a:
0 3 6
9 12 15
[torch.FloatTensor of size 2x3] a.sort(2):
(
0 3 6
9 12 15
[torch.FloatTensor of size 2x3]
,
0 1 2
0 1 2
[torch.LongTensor of size 2x3]
)
a.topk(2):
(
6 3
15 12
[torch.FloatTensor of size 2x2]
,
2 1
2 1
[torch.LongTensor of size 2x2]
)
t.max(a):
15.0
t.max(a,dim=1):
(
6
15
[torch.FloatTensor of size 2]
,
2
2
[torch.LongTensor of size 2]
)

二、Numpy和Tensor

1、数组和张量内存共享

import numpy as np

# 数组和Tensor互换
a = t.ones(2,3)
b = a.numpy()
c = t.from_numpy(b)
c[0,0] = 0
print(a)
 0  1  1
1 1 1
[torch.FloatTensor of size 2x3]

2、广播原理及模拟

# 广播法则
# 1.所有数组向shape最长的数组看齐,不足的在前方补一
# 2.两个数组要么在某个维度长度一致,要么一个为一,否则不能计算
# 3.对长度为一的维度,计算时复制元素扩充至和此维度最长数组一致
a = t.ones(3,2)
b = t.ones(2,3,1)
print(a + b) # 先a->(1,3,2)然后a,b->(2,3,2)
(0 ,.,.) =
2 2
2 2
2 2 (1 ,.,.) =
2 2
2 2
2 2
[torch.FloatTensor of size 2x3x2]

使用尺寸调整函数模拟广播过程如下,

# 手工复现广播过程
# expend可以扩张维度的数字大小,repeat类似,但是expend不会复制数组内存,节约空间
# 被扩充维度起始必须是1才行
print(a.unsqueeze(0).expand(2,3,2) + b.expand(2,3,2))
print(a.view(1,3,2).expand(2,3,2) + b.expand(2,3,2))
(0 ,.,.) =
2 2
2 2
2 2 (1 ,.,.) =
2 2
2 2
2 2
[torch.FloatTensor of size 2x3x2] (0 ,.,.) =
2 2
2 2
2 2 (1 ,.,.) =
2 2
2 2
2 2
[torch.FloatTensor of size 2x3x2]

3、expand方法

我们来看看expand方法,它要求我们的被扩展维度为1才行(如下),如果不是1则扩展失败。

expand方法不会复制数组,不会占用额外空间,只有在需要时才进行扩展,很节约内存。

a = t.ones(1)
print(a.shape)
b = a.expand(6)
a = 2
print(a)
torch.Size([1])
2
 1
1
1
1
1
1
[torch.FloatTensor of size 6]

『PyTorch』第五弹_深入理解Tensor对象_中下:数学计算以及numpy比较_&_广播原理简介的更多相关文章

  1. 『PyTorch』第五弹_深入理解autograd_上:Variable属性方法

    在PyTorch中计算图的特点可总结如下: autograd根据用户对variable的操作构建其计算图.对变量的操作抽象为Function. 对于那些不是任何函数(Function)的输出,由用户创 ...

  2. 『PyTorch』第五弹_深入理解autograd_下:函数扩展&高阶导数

    一.封装新的PyTorch函数 继承Function类 forward:输入Variable->中间计算Tensor->输出Variable backward:均使用Variable 线性 ...

  3. 『PyTorch』第五弹_深入理解autograd_中:Variable梯度探究

    查看非叶节点梯度的两种方法 在反向传播过程中非叶子节点的导数计算完之后即被清空.若想查看这些变量的梯度,有两种方法: 使用autograd.grad函数 使用hook autograd.grad和ho ...

  4. 『PyTorch』第五弹_深入理解Tensor对象_下:从内存看Tensor

    Tensor存储结构如下, 如图所示,实际上很可能多个信息区对应于同一个存储区,也就是上一节我们说到的,初始化或者普通索引时经常会有这种情况. 一.几种共享内存的情况 view a = t.arang ...

  5. 『PyTorch』第五弹_深入理解Tensor对象_中上:索引

    一.普通索引 示例 a = t.Tensor(4,5) print(a) print(a[0:1,:2]) print(a[0,:2]) # 注意和前一种索引出来的值相同,shape不同 print( ...

  6. 『PyTorch』第五弹_深入理解Tensor对象_上:初始化以及尺寸调整

    一.创建Tensor 特殊方法: t.arange(1,6,2)t.linspace(1,10,3)t.randn(2,3) # 标准分布,*size t.randperm(5) # 随机排序,从0到 ...

  7. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  8. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  9. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

随机推荐

  1. Redis实战经验及使用场景

    随着应用对高性能需求的增加,NoSQL逐渐在各大名企的系统架构中生根发芽.这里我们将为大家分享社交巨头新浪微博.传媒巨头Viacom及图片分享领域佼佼者Pinterest带来的Redis实践,首先我们 ...

  2. JDBC连接MySQL与Oracle

    JDBC连接MySQL .JDBC连接Oracle (跳转) JDBC连接MySQL import org.junit.Test; import java.sql.*; /** * JDBC连接MyS ...

  3. SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑

    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC   原文:http://www.cnblogs.com/chenxizhang/arc ...

  4. 020-并发编程-java.util.concurrent之-jdk6/7/8中ConcurrentHashMap、HashMap分析

    一.概述 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表. 是根据关键码值(Key ...

  5. iot-web增加apis-namespace组件

    1  文件夹复制 apis 2 增加 3 增加module

  6. 【UML】NO.51.EBook.5.UML.1.011-【UML 大战需求分析】- 时序图(Timing Diagram)

    1.0.0 Summary Tittle:[UML]NO.51.EBook.1.UML.1.011-[UML 大战需求分析]- 时序图(Timing Diagram) Style:DesignPatt ...

  7. windows程序设计 创建一个新的窗口

    #include <windows.h> LRESULT CALLBACK myProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(H ...

  8. JAVA 重写equals和重写hashCode

    面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” 首先你需要了解: hashCode()的作用是获取哈希码(散列码) 它实 ...

  9. Hbase 读写 原理

    客户端读取信息流程 ()client要读取信息,先查询下client 端的cache中是否存在数据,如果存在,刚直接返回数据.如果不存在,则进入到zookeeper,查找到里面的相应数据存在的Root ...

  10. flask 定义数据库关系(多对多)

    多对多 我们使用学生和老师来演示多对多关系:每个学生有多个老师,每个老师有多个学生.多对多关系示意图如下: 在实例程序中,Student类表示学生,Teacher类表示老师.在这两个模型之间建立多对多 ...