一、简单数学操作

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. 极验验证使用-滑动&选字验证码

    准备 SDK下载 首先在极验官网下载好SDK,附上官网链接,点此可直接下载python版zip包. 模块安装 使用该SDK时发现它依赖两个模块,分别是geetest和requests. pip ins ...

  2. vue中router使用keep-alive缓存页面的注意事项

    <keep-alive exclude="QRCode"> <router-view></router-view> </keep-aliv ...

  3. Zookeeper 3.5启动时 8080端口被占用

    今天闲来无事,学习Zookeeper,下载了Zookeeper的最新版本3.5.启动以后显示: ZooKeeper JMX enabled by default Using config: /opt/ ...

  4. Install rapyuta Robot Cloud Engine on Ubuntu14.04

    # -Rapyuta-installation-in-Ubuntu14.04-LTS-Trusty-This gzip folder is a tested version which can ins ...

  5. html5 javascript 事件练习3随机键盘

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  6. codeforces 982C Cut 'em all!

    题意: 给出一棵树,问最多去掉多少条边之后,剩下的连通分量的size都是偶数. 思路: 如果本来就是奇数个点,那么无论去掉多少条边都不可能成立的. 如果是偶数个点,就进行一次dfs,假设一个点的父亲是 ...

  7. [openjudge-动态规划]鸣人的影分身

    题目描述 描述 在火影忍者的世界里,令敌人捉摸不透是非常关键的.我们的主角漩涡鸣人所拥有的一个招数--多重影分身之术--就是一个很好的例子. 影分身是由鸣人身体的查克拉能量制造的,使用的查克拉越多,制 ...

  8. 一定要知道的,那些Linux操作命令

    一定要知道的,那些Linux基本操作命令(一) 目录 1.文件和目录操作命令 2.用户和用户组操作命令 3.vim编辑器操作命令 4.打包和解压操作命令 5.系统操作命令 为什么要学习linux? 1 ...

  9. 深入浅出JAVA线程池使用原理2

    一.Executor框架介绍 Executor框架将Java多线程程序分解成若干个任务,将这些任务分配给若干个线程来处理,并得到任务的结果 1.1.Executor框架组成 任务:被执行任务需要实现的 ...

  10. mysql获取随机字符串和随机数的方法

    在我们开发的过程中,我们可能会需要在表中随机生成一些数据以供我们进行相应的测试. 就像我之前发的“mysql创建存储过程向数据表中加入规定条数的数据” 那么我们应该怎样生成随机的字符串和随机数字呢? ...