[Python/PyTorch基础] PyTorch学习笔记

PyTorch采用Python语言接口来实现编程,它就像带GPU的Numpy,与Python一样都属于动态框架。PyTorch继承了Torch灵活、动态的编程环境和用户友好的界面,支持以快速和灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不妨碍其性能,支持动态图形等尖端AI模型的能力,是快速实验的理想选择。

PyTorch由4个主要的包组成:

  • torch:类似于Numpy的通用数组库,可将张量类型转换为torch.cuda.TensorFloat,并在GPU上进行计算。
  • torch.autograd:用于构建计算图形并自动获取梯度的包。
  • torch.nn:具有共享层和损失函数的神经网络库。
  • torch.optim:具有通用优化算法(如SGD、Adam等)的优化包。

Numpy与Tensor

PyTorch的Tensor,它可以是零维(又称为标量或一个数)、一维、二维及多维的数组。
Tensor自称为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便和高效。它们最大的区别就是Numpy会把ndarray放在CPU中进行加速运算,而由Torch产生的Tensor会放在GPU中进行加速运算(假设当前环境有GPU)。

Tensor概述

接口的角度可以分为两类:

  1. torch.function,如 torch.sum、torch.add 等;
  2. tensor.function,如 tensor.view、tensor.add 等。
    这些操作对大部分Tensor都是等价的,比如 torch.add(x, y) 和 x.add(y) 等价。

修改方式的角度可以分为两类:

  1. 不修改自身数据,如 x.add(y),x的数据不变,返回一个新的tensor。
  2. 修改自身数据, 如x.add_(y) (运行符下划线后缀),运算结果存在x中,x被修改。
import torch

x = torch.tensor([1, 2])
y = torch.tensor([3, 4])
z = x.add(y)
print(z)
print(x)
x.add_(y)
print(x)

#结果:
# tensor([4, 6])
# tensor([1, 2])
# tensor([4, 6])
创建Tensor

创建Tensor的方法有很多,可以从列表或ndarray等类型进行构建,也可根据指定的形状构建。
常见的创建Tensor的方法:

函数功能
Tensor(*size)直接从参数构造一个张量,支持list,numpy数组
eye(row, column)创建指定行数和列数的二维单位Tensor
linspace(start, end, steps)从start到end,均匀切分成steps份
logspace(start, end, steps)从10 ^ start到10 ^ end,均匀切分成steps份
rand/randn(*size)生成[0,1)均匀分布标准正态分布数据
ones(*size)返回指定shape的张量,元素初始为1
zeros(*size)返回指定shape的张量,元素初始为0
ones_like(t)返回与t的shape相同的张量,元素初始为1
zeros_like(t)返回与t的shape相同的张量,元素初始为0
arange(start, end, steps)在区间上生成等间距序列张量
from_Numpy(ndarray)从ndarray创建一个张量

注意torch.Tensor与torch.tensor的几点区别:

  1. torch.Tensor是torch.empty和torch.tensor之间的一种混合,但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor),而torch.tensor是从数据中推断数据类型。
  2. torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是随机初始化的值。
修改Tensor形状

在处理数据、构建网络层等过程中,经常需要了解Tensor的形状、修改Tensor的形状。
tensor常用修改形状的函数:

函数说明
size()返回张量的shape属性值
numel(input)计算元素个数
view(*shape)修改张量的shape,与reshape类似,但view返回的对象与源张量共享内存。reshape生成新的张量,而且不要求源张量是连续的。view(-1)展平数组
resize和view类似,但在size超出时重新分配内存空间
item若Tensor为单元素,则返回Python的标量
unsqueeze在指定维度增加一个1
squeeze在指定维度压缩一个1

torch.view与torch.reshape的异同:

  1. reshape()可以由torch.reshape(),也可由torch.Tensor.reshape()调用。
    但view()只可由torch.Tensor.view()来调用。
  2. 对于一个将要被view的Tensor,新的size必须与原来的size与stride兼容。否则,在view之前必须调用contiguous()方法。
  3. 同样也是返回与input数据量相同,但形状不同的Tensor。若满足view的条件,则不会copy,若不满足,则会copy。
  4. 如果只想重塑张量,请使用torch.reshape。
    如果还关注内存使用情况并希望确保两个张量共享相同的数据,请使用torch.view。

(未完待续……)

更多pytorch用法可参考pytorch中文文档
本文内容根据《Python深度学习:基于PyTorch》书中第2章内容总结
一起加油吧ヾ(◍°∇°◍)ノ゙

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值