pytorch基础教程(更新中)

创建Tensor下表给了一些常用的作参考。

函数 功能
Tensor(*sizes) 基础构造函数
tensor(data,) 类似np.array的构造函数
ones(*sizes) 全1Tensor
zeros(*sizes) 全0Tensor
eye(*sizes) 对角线为1,其他为0
arange(s,e,step) 从s到e,步长为step
linspace(s,e,steps) 从s到e,均匀切分成steps份
rand/randn(*sizes) 均匀/标准分布
normal(mean,std)/uniform(from,to) 正态分布/均匀分布
randperm(m) 随机排列

创建Tensor和NumPy的数组

import numpy as np
import torch

# 类似于numpy
x = torch.arange(1,9,2)
print(x)
y = np.arange(1,9,2)
print(y)

# 创建5*3的未初始化tensor
x = torch.empty(5,3)
print(x)
y = np.empty([5,3])
print(y)

# 创建5*3的随机初始化tensor
x = torch.rand(5,3)
print(x)
y = np.random.rand(5,3)
print(y)

# 创建5*3的long型全0的tensor
x = torch.zeros(5,3,dtype=torch.long)
print(x)
y = np.zeros([5,3],dtype=np.long)
print(y)

# 创建4*4全为1的tensor
x = torch.ones(4,4)
print(x)
y = np.ones([4,4])
print(y)

# 创建4*4的单位tensor
x = torch.eye(4,4)
print(x)
y = np.eye(4,4)
print(y)

# 直接创建tensor
x = torch.tensor([[1,2,3],[4,5,6]])
print(x)
y = np.array([[1,2,3],[4,5,6]])
print(y)
x = torch.tensor(np.arange(12).reshape(3,4))
print(x)

# tensor一些属性
x = torch.tensor([[1,2],[3,4]])
print(x)
y = np.array([[1,2],[3,4]])
# 查看数据类型
print(x.dtype)
print(y.dtype)
# 查看形状
print(x.shape) # print(x.size())
print(x.size)
print(y.shape)
print(y.size)

输出:

tensor([1, 3, 5, 7])
[1 3 5 7]
tensor([[4.1327e-39, 8.9082e-39, 9.8265e-39],
        [9.4592e-39, 1.0561e-38, 1.0653e-38],
        [1.0469e-38, 9.5510e-39, 1.0102e-38],
        [8.4490e-39, 8.9082e-39, 8.4490e-39],
        [1.0194e-38, 1.0745e-38, 9.2755e-39]])
[[0.99537969 0.63659559 0.84111795]
 [0.12392895 0.84133229 0.44756633]
 [0.73434498 0.92331792 0.15648406]
 [0.7112982  0.59707987 0.14628696]
 [0.46465904 0.62735071 0.1993323 ]]
tensor([[0.8919, 0.5340, 0.8707],
        [0.7676, 0.7845, 0.3222],
        [0.3889, 0.1721, 0.4904],
        [0.7376, 0.8286, 0.8451],
        [0.2976, 0.2889, 0.5187]])
[[0.73119602 0.53034057 0.4751409 ]
 [0.13117025 0.30697661 0.21826581]
 [0.11899772 0.25654165 0.62288326]
 [0.36888543 0.08219027 0.65804774]
 [0.45289577 0.51710629 0.36201635]]
tensor([[0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0],
        [0, 0, 0]])
[[0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]
 [0 0 0]]
tensor([[1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.],
        [1., 1., 1., 1.]])
[[1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]
 [1. 1. 1. 1.]]
tensor([[1., 0., 0., 0.],
        [0., 1., 0., 0.],
        [0., 0., 1., 0.],
        [0., 0., 0., 1.]])
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
tensor([[1, 2, 3],
        [4, 5, 6]])
[[1 2 3]
 [4 5 6]]
tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)
tensor([[1, 2],
        [3, 4]])
torch.int64
int32
torch.Size([2, 2])
<built-in method size of Tensor object at 0x0000015D601B17C8>
(2, 2)
4

Tensor和NumPy相互转换

我们很容易用numpy()from_numpy()Tensor和NumPy中的数组相互转换。但是需要注意的一点是:
这两个函数所产生的的Tensor和NumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变!!!

还有一个常用的将NumPy中的array转换成Tensor的方法就是torch.tensor(), 需要注意的是,此方法总是会进行数据拷贝(就会消耗更多的时间和空间),所以返回的Tensor和原来的数据不再共享内存。

Tensor转NumPy

使用numpy()Tensor转换成NumPy数组:

a = torch.ones(5)
b = a.numpy()
print(a, b)

a += 1
print(a, b)
b += 1
print(a, b)

输出:

tensor([1., 1., 1., 1., 1.]) [1. 1. 1. 1. 1.]
tensor([2., 2., 2., 2., 2.]) [2. 2. 2. 2. 2.]
tensor([3., 3., 3., 3., 3.]) [3. 3. 3. 3. 3.]

NumPy数组转Tensor

使用from_numpy()将NumPy数组转换成Tensor:

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a, b)

a += 1
print(a, b)
b += 1
print(a, b)

输出:

[1. 1. 1. 1. 1.] tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
[2. 2. 2. 2. 2.] tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
[3. 3. 3. 3. 3.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)

所有在CPU上的Tensor(除了CharTensor)都支持与NumPy数组相互转换。

此外上面提到还有一个常用的方法就是直接用torch.tensor()将NumPy数组转换成Tensor,需要注意的是该方法总是会进行数据拷贝,返回的Tensor和原来的数据不再共享内存。

c = torch.tensor(a)
a += 1
print(a, c)

输出

[4. 4. 4. 4. 4.] tensor([3., 3., 3., 3., 3.], dtype=torch.float64)

算术操作

在PyTorch中,同一种操作可能有很多种形式,下面用加减乘除作为例子。

# 加法
y = torch.rand(2,3)
x = torch.tensor([1,2,3])
print('y= %s'%y)
print('x= %s'%x)
# 形式1
print(x+y)
# 形式2
print(torch.add(x,y))
# 需要提前指定输出结果的形状
result = torch.empty_like(y)
torch.add(x,y,out=result)
print(result)
# 形式3
y.add_(x) # 相当于y += x,原来y发生了改变
print(y)
z = y.add(x) #需要重新赋值给z
print(z)

# 减法
y = torch.tensor(np.arange(12).reshape(3,4))
x = torch.tensor(np.arange(3).reshape(3,1))
print('y= %s'%y)
print('x= %s'%x)
print(y-x)
print(torch.sub(y,x))
z = y.sub(x)
print(z)

# 乘法
x = torch.tensor([[1,2],[3,4]])
y = torch.eye(2)+1
print('y= %s'%y)
print('x= %s'%x)
print(y*x)
print(torch.mul(x,y))
z = y.mul(x)
print(z)

# 除法
x = torch.tensor([[1,2],[3,4]])
y = torch.eye(2)+1
print(y/x)
print(torch.div(y,x))
print(y.div(x))

输出:

y= tensor([[0.5275, 0.3078, 0.8255],
        [0.5453, 0.6506, 0.5880]])
x= tensor([1, 2, 3])
tensor([[1.5275, 2.3078, 3.8255],
        [1.5453, 2.6506, 3.5880]])
tensor([[1.5275, 2.3078, 3.8255],
        [1.5453, 2.6506, 3.5880]])
tensor([[1.5275, 2.3078, 3.8255],
        [1.5453, 2.6506, 3.5880]])
tensor([[1.5275, 2.3078, 3.8255],
        [1.5453, 2.6506, 3.5880]])
tensor([[2.5275, 4.3078, 6.8255],
        [2.5453, 4.6506, 6.5880]])
y= tensor([[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]], dtype=torch.int32)
x= tensor([[0],
        [1],
        [2]], dtype=torch.int32)
tensor([[0, 1, 2, 3],
        [3, 4, 5, 6],
        [6, 7, 8, 9]], dtype=torch.int32)
tensor([[0, 1, 2, 3],
        [3, 4, 5, 6],
        [6, 7, 8, 9]], dtype=torch.int32)
tensor([[0, 1, 2, 3],
        [3, 4, 5, 6],
        [6, 7, 8, 9]], dtype=torch.int32)
y= tensor([[2., 1.],
        [1., 2.]])
x= tensor([[1, 2],
        [3, 4]])
tensor([[2., 2.],
        [3., 8.]])
tensor([[2., 2.],
        [3., 8.]])
tensor([[2., 2.],
        [3., 8.]])
tensor([[2.0000, 0.5000],
        [0.3333, 0.5000]])
tensor([[2.0000, 0.5000],
        [0.3333, 0.5000]])
tensor([[2.0000, 0.5000],
        [0.3333, 0.5000]])

参考资料:
https://github.com/ShusenTang/Dive-into-DL-PyTorch/blob/master/docs/chapter02_prerequisite/2.2_tensor.md

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容