PyTorch基础(一)-----张量(Tensor)

前言

很多人都会拿PyTorch和Google的Tensorflow进行比较,这个肯定是没有问题的,因为他们是最火的两个深度学习框架了。但是说到PyTorch,其实应该先说Torch。

什么是Torch?

Torch是一个与Numpy类似的张量(Tensor)操作库,与Numpy不同的是Torch对GPU支持的很好。Lua是Torch的上层包装,虽然Lua速度很快,Lua实在是太小众了,所以才会有PyTorch的横空出世。

PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序。 它主要由Facebook的人工智能研究小组开发。Uber的"Pyro"也是使用的这个库。

PyTorch是一个Python包,提供两个高级功能:

  • 具有强大的GPU加速的张量计算(如NumPy)

  • 包含自动求导系统的的深度神经网络

最后,关于Tensorflow和PyTorch的对比网上已经有很多了,这里就不详细说明了,有兴趣的可以看这篇文章https://zhuanlan.zhihu.com/p/28636490

一、什么是张量(Tensor)

PyTorch是一个处理张量的库,张量是PyTorch里面基础运算单位,一个张量是一个数字、向量、矩阵或者任何n维数组。张量与Numpy的ndarray相同,都表示的是一个多维的矩阵。与ndarray的最大区别就是**:PyTorch的Tensor可以在GPU上运行,而numpy的ndarray只能在CPU上运行,在GPU上运行大大加快了运算速度。**

  • 导包

首先要导入相关的包,以保证程序可以正常运行

import numpy as np

import torch

我们可以通过打印PyTorch的版本来确定是否导入成功

torch.version

  • 新建一个简单的Tensor

生成一个2行3列的矩阵

x = torch.rand(2,3)

x

  • 查看Tensor的大小

可以使用与numpy相同的shape属性查看

print(x.shape)

也可以用使用size()函数

print(x.size())

  • 生成一个多维张量

y = torch.rand(2,3,4,5)

print(y.shape) # 打印y张量的大小

y

在同构的意义下,第0阶张量(r = 0)为标量(Scalar),第一阶张量(r = 1)为向量(Vector),第二阶张量(r = 2)则称为了矩阵(Matrix),第3阶以上的统称为多维张量。

  • 其中,特别主义的是标量,我们先来生成一个标量(scalar):

scalar = torch.tensor(3.1415926)

scalar

对于标量, 我们可以直接使用.item()从中取出其对应的Python对象

scalar.item()

特别的,如果张量中只有一个元素,也可以用.item()取出对应的Python对象

tensor1 = torch.tensor([3.1415926])

tensor1.item()

二、如何创建一个张量(Tensor)

  • 使用[0,1]均匀分布随机初始化张量

rnd = torch.rand(5,3)

rnd

  • 使用1填充

one = torch.ones(2,2)

one

  • 使用0填充

zero = torch.zeros(2,2)

zero

  • 初始化一个单位矩阵,即对角线为1,其它为0

eye = torch.eye(2,2)

eye

三、常用方法

PyTorch中对张量的操作api和Numpy非常相似,如果熟悉Numpy中的相关操作,它们两个是基本一致的

  • 首先,我们新建一个张量Tensor

rnd = torch.randn(3,3)

rnd

然后我们来进行以下的操作:

  • 沿着行取最大值

max_value,max_idx = torch.max(x,dim = 1)

max_value,max_idx

  • 沿着列取最大值

max_value,max_idx = torch.max(x,dim = 0)

max_value,max_idx

  • 求每行的和

sum_x = torch.sum(x,dim = 1)

sum_x

  • 求每列的和

sum_y = torch.sum(x,dim = 0)

sum_y

  • 求两个张量的和

首先我们需要另建一个张量y

y = torch.randn(3,3)

z = x+y

z

  • 任何以“-”结尾的操作都会用结果替换原变量,例如:“x.copy_(y)”,都会改变x

x = torch.randn(3,3)

print(‘修改前’, x)

y = torch.randn(3,3)

x.add_(y)

print(‘修改后’, x)

四、张量(Tensor)和Numpy对象的互相转换

Tensor和numpy对象共享内存,所以他们之间的转换很快,而且几乎不会消耗什么资源。但这也意味着,如果其中一个改变了,另外一个也会随之改变。

  • Tensor转为Numpy对象

a = torch.randn((3,2))

将tensor转为numpy

numpy_a = a.numpy()

print(numpy_a)

  • Numpy对象转为Tensor

torch_a = torch.from_numpy(numpy_a)

print(torch_a)

五、参考文献

https:/
/github.com/zergtant/pytorch-handbook/blob/master/chapter2/2.1.1.pytorch-basics-tensor.ipynb

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取
pter2/2.1.1.pytorch-basics-tensor.ipynb]( )

最后

小编这些年深知大多数初中级工程师,想要提升自己,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此我收集整理了一份《2024年Java全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ACCcSR1c-1719522768804)]

[外链图片转存中…(img-kfryDNJv-1719522768805)]

[外链图片转存中…(img-esabOIEo-1719522768806)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你需要这些资料,⬅专栏获取

  • 30
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值