pytorch(1)

PyTorch与其他框架的对比

  • PyTorch: 动态计算图 Dynamic Computation Graph

  • Tensorflow: 静态计算图 Static Computation Graph

  • PyTorch代码通俗易懂,非常接近Python原生代码,不会

让人感觉是完全在学习一门新的语言。

  • 拥有Facebook支持,社区活跃。

大致学习方法

如何成为PyTorch大神?

  • 学好深度学习的基础知识
  • 学习PyTorch官方tutorial
  • 学习GitHub以及各种博客上的教程(别人创建好的list)
  • 阅读documentation,使用论坛https://discuss.pytorch.org/
  • 跑通以及学习开源PyTorch项目
  • 阅读深度学习模型paper,学习别人的模型实现
  • 通过阅读paper,自己实现模型
  • 自己创造模型(也可以写paper)、

pytorch基本操作

Tensor basics
import numpy as np
import torch
12
产生一个张量:
x = torch.Tensor(3, 4)
print("Type: {}".format(x.type()))
print("Size: {}".format(x.shape))
print("Values: \n{}".format(x))
1234
结果:
Type: torch.FloatTensor
Size: torch.Size([3, 4])
Values:
tensor([[1.1744e-35, 0.0000e+00, 2.8026e-44, 0.0000e+00],
[ nan, 0.0000e+00, 1.3733e-14, 4.7429e+30],
[1.9431e-19, 4.7429e+30, 5.0938e-14, 0.0000e+
123456
产生一个随机张量:
x = torch.randn(2, 3) # normal distribution (rand(2,3) -> uniform distribution)
print (x)
12
结果:
tensor([[ 0.7434, -1.0611, -0.3752],
[ 0.2613, -1.7051, 0.9118]])
12
产生一个全0或者全1张量:
x = torch.zeros(2, 3)
print (x)
x = torch.ones(2, 3)
print (x)
1234
结果:
tensor([[0., 0., 0.],
[0., 0., 0.]])
tensor([[1., 1., 1.],
[1., 1., 1.]])
1234
列表转化为张量:
x = torch.Tensor([[1, 2, 3],[4, 5, 6]])
print("Size: {}".format(x.shape))
print("Values: \n{}".format(x))
123
结果:
Size: torch.Size([2, 3])
Values:
tensor([[1., 2., 3.],
[4., 5., 6.]])
1234
Numpy数组转化为张量:
x = torch.from_numpy(np.random.rand(2, 3))
print("Size: {}".format(x.shape))
print("Values: \n{}".format(x))
123
结果:
Size: torch.Size([2, 3])
Values:
tensor([[0.0372, 0.6757, 0.9554],
[0.5651, 0.2336, 0.8303]], dtype=torch.float64)
1234
转换张量的类型:
x = torch.Tensor(3, 4)
print("Type: {}".format(x.type()))
x = x.long()
print("Type: {}".format(x.type()))
1234
结果:
Type: torch.FloatTensor
Type: torch.LongTensor
12
Tensor operations
张量相加:
x = torch.randn(2, 3)
y = torch.randn(2, 3)
z = x + y
print("Size: {}".format(z.shape))
print("Values: \n{}".format(z))
12345
结果:
Size: torch.Size([2, 3])
Values:
tensor([[ 0.5650, -0.0173, 1.1263],
[ 3.4274, 1.3610, -0.9262]])
1234
张量点乘:
x = torch.randn(2, 3)
y = torch.randn(3, 2)
z = torch.mm(x, y)
print("Size: {}".format(z.shape))
print("Values: \n{}".format(z))
12345
结果:
Size: torch.Size([2, 2])
Values:
tensor([[ 1.3294, -2.4559],
[-0.4337, 4.9667]])
1234
张量转置:
x = torch.randn(2, 3)
print("Size: {}".format(x.shape))
print("Values: \n{}".format(x))
y = torch.t(x)
print("Size: {}".format(y.shape))
print("Values: \n{}".format(y))
123456
结果:
Size: torch.Size([2, 3])
Values:
tensor([[ 0.0257, -0.5716, -0.9207],
[-1.0590, 0.2942, -0.7114]])
Size: torch.Size([3, 2])
Values:
tensor([[ 0.0257, -1.0590],
[-0.5716, 0.2942],
[-0.9207, -0.7114]])
123456789
转换张量形状:
z = x.view(3, 2)
print("Size: {}".format(z.shape))
print("Values: \n{}".format(z))
123
结果:
Size: torch.Size([3, 2])
Values:
tensor([[ 0.0257, -0.5716],
[-0.9207, -1.0590],
[ 0.2942, -0.7114]])
12345
改变张量的形状一定要仔细,不然可能带来意外的结果:
x = torch.tensor([
[[1,1,1,1], [2,2,2,2], [3,3,3,3]],
[[10,10,10,10], [20,20,20,20], [30,30,30,30]]
])
print("Size: {}".format(x.shape))
print("Values: \n{}\n".format(x))
a = x.view(x.size(1), -1)
print("Size: {}".format(a.shape))
print("Values: \n{}\n".format(a))
b = x.transpose(0,1).contiguous()
print("Size: {}".format(b.shape))
print("Values: \n{}\n".format(b))
c = b.view(b.size(0), -1)
print("Size: {}".format(c.shape))
print("Values: \n{}".format(c))
123456789101112131415
结果:
Size: torch.Size([2, 3, 4])
Values:
tensor([[[ 1, 1, 1, 1],
[ 2, 2, 2, 2],
[ 3, 3, 3, 3]],

    [[10, 10, 10, 10],
     [20, 20, 20, 20],
     [30, 30, 30, 30]]])

Size: torch.Size([3, 8])
Values:
tensor([[ 1, 1, 1, 1, 2, 2, 2, 2],
[ 3, 3, 3, 3, 10, 10, 10, 10],
[20, 20, 20, 20, 30, 30, 30, 30]])

Size: torch.Size([3, 2, 4])
Values:
tensor([[[ 1, 1, 1, 1],
[10, 10, 10, 10]],

    [[ 2,  2,  2,  2],
     [20, 20, 20, 20]],

    [[ 3,  3,  3,  3],
     [30, 30, 30, 30]]])

Size: torch.Size([3, 8])
Values:
tensor([[ 1, 1, 1, 1, 10, 10, 10, 10],
[ 2, 2, 2, 2, 20, 20, 20, 20],
[ 3, 3, 3, 3, 30, 30, 30, 30]])
1234567891011121314151617181920212223242526272829303132
张量的维度操作,即指定某个维度的轴对张量进行操作:
x = torch.randn(2, 3)
print("Values: \n{}".format(x))
y = torch.sum(x, dim=0) # add each row's value for every column
print("Values: \n{}".format(y))
z = torch.sum(x, dim=1) # add each columns's value for every row
print("Values: \n{}".format(z))
123456
结果:
Values:
tensor([[ 0.4295, 0.2223, 0.1772],
[ 2.1602, -0.8891, -0.5011]])
Values:
tensor([ 2.5897, -0.6667, -0.3239])
Values:
tensor([0.8290, 0.7700])
1234567
Indexing, Splicing and Joining
张量的索引:
x = torch.randn(3, 4)
print("x: \n{}".format(x))
print ("x[:1]: \n{}".format(x[:1]))
print ("x[:1, 1:3]: \n{}".format(x[:1, 1:3]))
1234
结果:
x:
tensor([[-1.0305, 0.0368, 1.2809, 1.2346],
[-0.8837, 1.3678, -0.0971, 1.2528],
[ 0.3382, -1.4948, -0.7058, 1.3378]])
x[:1]:
tensor([[-1.0305, 0.0368, 1.2809, 1.2346]])
x[:1, 1:3]:
tensor([[0.0368, 1.2809]])
12345678
张量的切片:用维度选择:
x = torch.randn(2, 3)
print("Values: \n{}".format(x))
col_indices = torch.LongTensor([0, 2])
chosen = torch.index_select(x, dim=1, index=col_indices) # values from column 0 & 2
print("Values: \n{}".format(chosen))
row_indices = torch.LongTensor([0, 1])
chosen = x[row_indices, col_indices] # values from (0, 0) & (2, 1)
print("Values: \n{}".format(chosen))
12345678
结果:
Values:
tensor([[ 0.0720, 0.4266, -0.5351],
[ 0.9672, 0.3691, -0.7332]])
Values:
tensor([[ 0.0720, -0.5351],
[ 0.9672, -0.7332]])
Values:
tensor([ 0.0720, -0.7332])
12345678
张量的拼接:
x = torch.randn(2, 3)
print("Values: \n{}".format(x))
y = torch.cat([x, x], dim=0) # stack by rows (dim=1 to stack by columns)
print("Values: \n{}".format(y))
1234
结果:
Values:
tensor([[-0.8443, 0.9883, 2.2796],
[-0.0482, -0.1147, -0.5290]])
Values:
tensor([[-0.8443, 0.9883, 2.2796],
[-0.0482, -0.1147, -0.5290],
[-0.8443, 0.9883, 2.2796],
[-0.0482, -0.1147, -0.5290]])
12345678
Gradients
张量求梯度:
x = torch.rand(3, 4, requires_grad=True)
y = 3*x + 2
z = y.mean()
z.backward() # z has to be scalar
print("Values: \n{}".format(x))
print("x.grad: \n", x.grad)
123456
结果:
Values:
tensor([[0.7014, 0.2477, 0.5928, 0.5314],
[0.2832, 0.0825, 0.5684, 0.3090],
[0.1591, 0.0049, 0.0439, 0.7602]], requires_grad=True)
x.grad:
tensor([[0.2500, 0.2500, 0.2500, 0.2500],
[0.2500, 0.2500, 0.2500, 0.2500],
[0.2500, 0.2500, 0.2500, 0.2500]])
12345678

y=3x+2y=3x+2 y = 3 x + 2y=3x+2
z=∑y/Nz=∑y/N z = \sum y / Nz=∑y/N
∂(z)∂(x)=∂(z)∂(y)∂(y)∂(x)=1N∗3=112∗3=0.25∂(z)∂(x)=∂(z)∂(y)∂(y)∂(x)=1N∗3=112∗3=0.25 \frac { \partial ( z ) } { \partial ( x ) } = \frac { \partial ( z ) } { \partial ( y ) } \frac { \partial ( y ) } { \partial ( x ) } = \frac { 1 } { N } * 3 = \frac { 1 } { 12 } * 3 = 0.25∂(x)∂(z)​=∂(y)∂(z)​∂(x)∂(y)​=N1​∗3=121​∗3=0.25

CUDA tensors
是否使用CUDA?:
print (torch.cuda.is_available())
1
结果:
True
1
产生一个全0张量:
x = torch.Tensor(3, 4).to("cpu")
print("Type: {}".format(x.type()))
12
结果:
Type: torch.FloatTensor
1
产生一个全0张量(CUDA下):
x = torch.Tensor(3, 4).to("cuda")
print("Type: {}".format(x.type()))
12
结果:
Type: torch.cuda.FloatTensor

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

推荐阅读更多精彩内容