pytorch文档阅读(一)
本章主要针对pytorch0.4.0英文文档的前两节,顺序可能有些不一样:
- torch
- torch.Tensor
张量 Tensors
Data type | CPU tensor | GPU tensor | type |
---|---|---|---|
32-bit floating point | torch.FloatTensor | torch.cuda.FloatTensor | torch.float32 |
64-bit floating point | torch.DoubleTensor | torch.cuda.DoubleTensor | torch.float64 |
16-bit floating point | N/A | torch.cuda.HalfTensor | torch.cuda.float16 |
8-bit integer (unsigned) | torch.ByteTensor | torch.cuda.ByteTensor | torch.uint8 |
8-bit integer (signed) | torch.CharTensor | torch.cuda.CharTensor | torch.int8 |
16-bit integer (signed) | torch.ShortTensor | torch.cuda.ShortTensor | torch.int16 |
32-bit integer (signed) | torch.IntTensor | torch.cuda.IntTensor | torch.int32 |
64-bit integer (signed) | torch.LongTensor | torch.cuda.LongTensor | torch.int64 |
- torch.is_stensor/torch.is_storage
- torch.set_default_tensor_type()
这个有用,如果大部分操作是GPU上构建的,可你把默认类型定为cuda tensor
if torch.cuda.is_available():
if args.cuda:
torch.set_default_tensor_type('torch.cuda.FloatTensor')
if not args.cuda:
print("WARNING: It looks like you have a CUDA device, but aren't " +
"using CUDA.\nRun with --cuda for optimal training speed.")
torch.set_default_tensor_type('torch.FloatTensor')
else:
torch.set_default_tensor_type('torch.FloatTensor')
- torch.numel(input)->int/numel() /nelement()
- torch.set_printoptions(precision=None, threshold=None, edgeitems=None, linewidth=None, profile=None) 打印选项
- torch.set_flush_denormal(mode) → bool 禁用cpu非常规浮点
>>> torch.set_flush_denormal(True)
True
>>> torch.tensor([1e-323], dtype=torch.float64)
tensor([ 0.], dtype=torch.float64)
>>> torch.set_flush_denormal(False)
True
>>> torch.tensor([1e-323], dtype=torch.float64)
tensor(9.88131e-324 *
[ 1.0000], dtype=torch.float64)
## 创建操作 Creation Ops
torch方法后缀_like :创建除了值以外的任何设置相同的tensor
包括:zeros,ones,empty, full,rand,randint,randn
- torch.tensor(data, dtype=None, device=None, requires_grad=False) → Tensor
- torch.from_numpy(ndarray) → Tensor
- torch.eye(n, m=None, out=None)
- torch.linspace(start, end, steps=100, out=None) → Tensor
- torch.logspace(start, end, steps=100, out=None) → Tensor
- torch.ones(*sizes, out=None) → Tensor
- torch.empty(*sizes, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
- torch.reshape(input, shape) → Tensor 注意这是个坑,
- torch.rand(*sizes, out=None) → Tensor(均匀分布)
- torch.randn(*sizes, out=None) → Tensor(正态分布)
- torch.randperm(n, out=None) → LongTensor(随机整数0,,,n-1)
- torch.randint(low=0, high, size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor
- torch.arange(start, end, step=1, out=None) → Tensor/torch.range(start, end, step=1, out=None) → Tensor 一个包含末尾,一个不包含
- torch.zeros(*sizes, out=None) → Tensor
## 索引,切片,连接,编译操作
这些操作绝大多数tensor本身也包含
tensor方法的通用后缀 _ inplace操作,
- torch.cat(seq, dim=0, out=None) → Tensor/torch.stack(sequence, dim=0) 常用操作,一个是存在的维度上,一个是新的维度上(新建一个维度,已经存在的维度自然向后挤了)
- torch.split(tensor, split_size, dim=0)/torch.chunk(tensor, chunks, dim=0)/split()/chunk(),这两个功能相近,一个是沿轴均分指定大小(如果无法整除,最后一块返回较小的块),另一个chunk是返回固定块数(也是和split一样,最后一块返回较小块)
a = torch.Tensor([1,2,3,4,5])
b = a.split(2)
c = a.chunk(3)
- torch.gather(input, dim, index, out=None) → Tensor/gather(dim, index) 这个函数就很迷了,当时学习tensorflow时就研究了好久╮(╯﹏╰)╭,注意所有的index都是
torch.LongTensor
torch.gather(t, 1, torch.LongTensor([[0,0],[1,0]]))
- torch.index_select(input, dim, index, out=None) → Tensor/index_select(dim, index) f非常重要的函数
- torch.masked_select(input, mask, out=None) → Tensor/masked_select(mask) 注意所有mask都为
torch.ByteTensor
,同时需要注意mask的shape不一定要和tensor相同数量也不一定要相同,shape中必须有一个轴要和tensor的轴对应,此时按此轴索引
a = torch.Tensor([[1,2,3],[4,5,6]])
mask = torch.Tensor([[1,0],[0,0],[1,0]]).type(torch.ByteTensor)
mask_1 = torch.Tensor([[1],[0]]).type(torch.ByteTensor)
mask_2 = torch.Tensor([0,1,1]).type(torch.ByteTensor)
b = a.masked_select(mask)#error
c = a.masked_select(mask_1)
d = a.masked_select(mask_2)
- torch.nonzero(input, out=None) → LongTensor 注意是返回的高维索引
>>> torch.nonzero(torch.Tensor([[0.6, 0.0, 0.0, 0.0],
... [0.0, 0.4, 0.0, 0.0],
... [0.0, 0.0, 1.2, 0.0],
... [0.0, 0.0, 0.0,-0.4]]))
0 0
1 1
2 2
3 3
[torch.LongTensor of size 4x2]
- torch.squeeze(input, dim=None, out=None)/squeeze(dim=None) 超超超重要的函数
- torch.stack(sequence, dim=0)
- torch.t/t()
- torch.transpose(input, dim0, dim1, out=None) → Tensor/transpose() 交换任意两个维度
- torch.take(input, indices) → Tensor 展开之后的tensor取索引
- tensor.permute(dims) 非常重要
x.permute(2, 0, 1)
- torch.unbind(tensor, dim=0) 移除指定维度,返回一个truple,包含了沿着指定维切片后的各个切片
- torch.unsqueeze(input, dim, out=None) 插入维度
- torch.where(condition, x, y) → Tensor 注意condition (ByteTensor)
随机抽样 Random sampling
- torch.manual_seed(seed)
- torch.initial_seed() 注意做对比实验的时为了控制变量,多线程载入数据时每个线程的seed都需要严格设定
- torch.get_rng_state() ->(ByteTensor)
- torch.set_rng_state
- torch.default_generator
- torch.bernoulli(input, out=None) → Tensor伯努利投硬币,常用于样本的挖掘(hard example)
- torch.multinomial(input, num_samples,replacement=False, out=None) → Longtensor 多项分布抽取样本
- torch.normal(means, std, out=None) 离散正态分布中抽取随机数
torch.normal(means=torch.arange(1, 11), std=torch.arange(1, 0, -0.1))
1.5104
1.6955
2.4895
4.9185
4.9895
6.9155
7.3683
8.1836
8.7164
9.8916
[torch.FloatTensor of size 10]
>>> torch.normal(mean=0.5, std=torch.arange(1, 6))
0.5723
0.0871
-0.3783
-2.5689
10.7893
[torch.FloatTensor of size 5]
>>> torch.normal(means=torch.arange(1, 6))
1.1681
2.8884
3.7718
2.5616
4.2500
[torch.FloatTensor of size 5]
序列化 Serialization
- torch.saves
- torch.load
并行化 Parallelism
- torch.get_num_threads
- torch.set_num_threads(int)
数学操作Math operations
tensor有全部的对应数学函数
挑几个常用的:
- ceil/floor/frac
- round
- torch.clamp(input, min, max, out=None) → Tensor 等价于tensorflow的tf.clip
- torch.argmax(input, dim=None, keepdim=False)/torch.argmin(input, dim=None, keepdim=False)
- torch.cumprod(input, dim, out=None) → Tensor $$y_i = x_1 \times x_2\times x_3\times \dots \times x_i$$/torch.prod(input, dim, keepdim=False, out=None) → Tensor
- torch.cumsum(input, dim, out=None) → Tensor 同上
- torch.dist(input, other, p=2) → Tensor p范数/torch.norm(input, p, dim, keepdim=False, out=None) → Tensor
- torch.mean(input, dim, keepdim=False, out=None) → Tensor 注意keep_dim是是否保持维度不变
>>> a = torch.randn(4, 4)
>>> a
tensor([[-0.3841, 0.6320, 0.4254, -0.7384],
[-0.9644, 1.0131, -0.6549, -1.4279],
[-0.2951, -1.3350, -0.7694, 0.5600],
[ 1.0842, -0.9580, 0.3623, 0.2343]])
>>> torch.mean(a, 1)
tensor([-0.0163, -0.5085, -0.4599, 0.1807])
>>> torch.mean(a, 1, True)
tensor([[-0.0163],
[-0.5085],
[-0.4599],
[ 0.1807]])
- torch.median() 返回中间值
>>> a = torch.randn(1, 3)
>>> a
tensor([[ 1.5219, -1.5212, 0.2202]])
>>> torch.median(a)
tensor(0.2202)
- torch.median(input, dim=-1, keepdim=False, values=None, indices=None) -> (Tensor, LongTensor)
>>> a = torch.randn(4, 5)
>>> a
tensor([[ 0.2505, -0.3982, -0.9948, 0.3518, -1.3131],
[ 0.3180, -0.6993, 1.0436, 0.0438, 0.2270],
[-0.2751, 0.7303, 0.2192, 0.3321, 0.2488],
[ 1.0778, -1.9510, 0.7048, 0.4742, -0.7125]])
>>> torch.median(a, 1)
(tensor([-0.3982, 0.2270, 0.2488, 0.4742]), tensor([ 1, 4, 4, 3]))
- torch.std(input, dim, keepdim=False, unbiased=True, out=None) → Tensor/torch.var(input, dim, keepdim=False, unbiased=True, out=None) → Tensor 标准差和方差
- torch.sum(input, dim, keepdim=False, out=None) → Tensor
- torch.unique(input, sorted=False, return_inverse=False) 元素去重(只能是1D tensor)
Comparison Ops
- torch.eq(input, other, out=None) → Tensor other必须能广播,返回mask
- torch.equal(tensor1, tensor2) → bool
- torch.ge/gt/le/lt/ne/ ≥/>/≤/<
- torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) -> (Tensor, LongTensor)/torch.kthvalue(input, k, dim=None, keepdim=False, out=None) -> (Tensor, LongTensor)
- torch.max(input) → Tensor
- torch.max(input, dim, keepdim=False, out=None) -> (Tensor, LongTensor)
- torch.max(input, other, out=None) → Tensor
>>> a = torch.randn(4)
>>> a
tensor([ 0.2942, -0.7416, 0.2653, -0.1584])
>>> b = torch.randn(4)
>>> b
tensor([ 0.8722, -1.7421, -0.4141, -0.5055])
>>> torch.max(a, b)
tensor([ 0.8722, -0.7416, 0.2653, -0.1584])
- torch.min()也有三种方法,使用同max
- torch.sort(input, dim=None, descending=False, out=None) -> (Tensor, LongTensor)
BLAS and LAPACK Operations
各种矩阵的基础运算
Spectral Ops
终于算是加上了。。
Tensor独有的Ops
tensor的前缀new_方法,是固定变量赋值,适用于ones,zeros,full,tensor(坑)
>>> tensor = torch.ones((2,), dtype=torch.int8)
>>> data = [[0, 1], [2, 3]]
>>> tensor.new_tensor(data)
tensor([[ 0, 1],[ 2, 3]], dtype=torch.int8)
- torch.Tensor.item() 坑,注意只能是一个值,适合返回loss,acc等
- apply_(callable) → Tensor(类似于map,python层面的cpu funtion,效率低)
- cauchy_(median=0, sigma=1, *, generator=None) → Tensor
- char(),byte(),double() ,int()
- clone() /copy() 第一个是完全克隆,第二个是可广播的数值
- contiguous() → Tensor 一些op为了高效运算,默认实现连续内存运算需求的,这时候要保证tensor的连续存储
- is_contiguous() → bool/is_pinned()/is_cuda/is_pinned()/is_signed()
- cpu()/cuda()
- dim()
- device
- element_size() → int 返回变量类型的内存占用字节
- expand(*sizes) → Tensor 重要:扩展dim维1的轴
>>> x = torch.tensor([[1], [2], [3]])
>>> x.size()
torch.Size([3, 1])
>>> x.expand(3, 4)
tensor([[ 1, 1, 1, 1],
[ 2, 2, 2, 2],
[ 3, 3, 3, 3]])
>>> x.expand(-1, 4) # -1 means not changing the size of that dimension
tensor([[ 1, 1, 1, 1],
[ 2, 2, 2, 2],
[ 3, 3, 3, 3]])
- index_copy_(dim, index, tensor) → Tensor 按索引复制元素
>>> x = torch.zeros(5, 3)
>>> t = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=torch.float)
>>> index = torch.tensor([0, 4, 2])
>>> x.index_copy_(0, index, t)
tensor([[ 1., 2., 3.],
[ 0., 0., 0.],
[ 7., 8., 9.],
[ 0., 0., 0.],
[ 4., 5., 6.]])
- index_fill_(dim, index, val) → Tensor
- map_(tensor, callable)
Applies callable for each element in self tensor and the given tensor and stores the results in self tensor. self tensor and the given tensor must be broadcastable.
(待续)
一些坑
- new_tensor 会新建变量,use torch.Tensor.requires_grad_() or torch.Tensor.detach()
- mask_select index_select也会新建变量
- reshape,resize,review
(待续)
pytorch文档阅读(一)的更多相关文章
- Node.js的下载、安装、配置、Hello World、文档阅读
Node.js的下载.安装.配置.Hello World.文档阅读
- 我的Cocos Creator成长之路1环境搭建以及基本的文档阅读
本人原来一直是做cocos-js和cocos-lua的,应公司发展需要,现转型为creator.会在自己的博客上记录自己的成长之路. 1.文档阅读:(cocos的官方文档) http://docs.c ...
- 转:苹果Xcode帮助文档阅读指南
一直想写这么一个东西,长期以来我发现很多初学者的问题在于不掌握学习的方法,所以,Xcode那么好的SDK文档摆在那里,对他们也起不到什么太大的作用.从论坛.微博等等地方看到的初学者提出的问题,也暴露出 ...
- Keras 文档阅读笔记(不定期更新)
目录 Keras 文档阅读笔记(不定期更新) 模型 Sequential 模型方法 Model 类(函数式 API) 方法 层 关于 Keras 网络层 核心层 卷积层 池化层 循环层 融合层 高级激 ...
- Django文档阅读-Day1
Django文档阅读-Day1 Django at a glance Design your model from djano.db import models #数据库操作API位置 class R ...
- Django文档阅读-Day2
Django文档阅读 - Day2 Writing your first Django app, part 1 You can tell Django is installed and which v ...
- Django文档阅读-Day3
Django文档阅读-Day3 Writing your first Django app, part 3 Overview A view is a "type" of Web p ...
- Silverlight类百度文库在线文档阅读器
百度文库阅读器是基于Flash的,用Silverlight其实也可以做. 我实现的在线阅读器可以应用于内网文档发布,在线阅览审批等.没有过多的堆积功能,专注于核心功能.主要有以下特性: 1. 基于XP ...
- 苹果Xcode帮助文档阅读指南
文档导读 https://developer.apple.com/legacy/library/navigation/ 前面我们讲Xcode的文档结构是在介绍如何能够快速定位到你要找的内容.但是很多人 ...
随机推荐
- Ubuntu16.04安装搜狗拼音输入法
为了让自己的电脑相对安全一些,我安装了ubuntu的物理机 因为要经常输入汉字,我就在unbuntu里面安装了搜狗输入法 1.在搜狗输入法官网下载Linux版本的安装包:https://pinyin. ...
- 使用OpenCV通过摄像头捕获实时视频并探测人脸
在Opencv初接触,图片的基本操作这篇手记中,我介绍了一些图片的基本操作,视频可以看作是一帧一帧的图片,因此图片操作其实是视频操作的基础,这篇手记就来讲讲OpenCV中的视频操作,并实现一个用笔记本 ...
- linux获得命令使用帮助
1. 内部命令: help CMD 2. 外部命令: CMD --help 3. 命令手册: manual(所有命令) man CMD 分章节: 1: 用户命令(User Commands - /bi ...
- centos下设置自启动和配置环境变量的方法
1. 设置自启动 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动.1.把启动程序的命令添加到/etc/rc.d/rc.local文件中,比如下面的是设置开机启动httpd. #!/bi ...
- 让CentOS在同一个窗口打开文件夹
http://www.linuxidc.com/Linux/2010-04/25756.htm
- TeamWork#3,Week5,Scrum Meeting 11.6, 11.7, 11.11, 11.12
11.6:到目前为止基本已完成相关知识的学习,各方面工作都开始进行,一开始进行比较慢. 11.7:项目遇到困难,需要补充相关知识,进度慢了下来. 11.11:各方面工作进展比较顺利,没有什么大问题. ...
- Internet History, Technology and Security (Week5.1)
Week5 The Transport layer is built on the Internetwork layer and is what makes our network connectio ...
- 四则运算之GUI
四则运算之GUI Coding克隆地址:https://git.coding.net/lvgx/pair_programming.git 目录: 一.前言 二.计划时间——PSP 三.接口设计 四 ...
- 今年暑假要AC
今年暑假要AC 在这个大学的第一个的暑假,谁不想回去high呢~ 但是,这是不行的,还没有AC,你能回去吗?高三那年的暑假怎么玩的,现在补回来吧...有规模有计划有氛围的学习就是:优点多效率好激情足~ ...
- 关于Eclipse上使用可视化设计界面(Java EE 使用可视化界面设计)
Eclipse下可视化界面实现——WindowBulider安装 第一步: WindowBuilder官方下载安装说明地址:http://www.eclipse.org/windowbuilder/d ...