学习张量

建议大家可以配合跟着B站的跟李沐学AI。但是datawhale 也是讲的非常好的课程。

代码演示部分:配合本章学习材料使用

第一部分:张量运算示例

这里将演示Tensor的一些基本操作

In[1]:

importtorch

In[2]:

?torch.tensor

In[3]:

# 创建tensor,用dtype指定类型。注意类型要匹配

a=torch.tensor(1.0,dtype=torch.float)

b=torch.tensor(1,dtype=torch.long)

c=torch.tensor(1.0,dtype=torch.int8)

print(a,b,c)

tensor(1.) tensor(1) tensor(1, dtype=torch.int8)

<ipython-input-3-da5fc7804e0f>:4: DeprecationWarning: an integer is required (got type float).  Implicit conversion to integers using __int__ is deprecated, and may be removed in a future version of Python.

  c = torch.tensor(1.0, dtype=torch.int8)

In[4]:

# 使用指定类型函数随机初始化指定大小的tensor

d=torch.FloatTensor(2,3)

e=torch.IntTensor(2)

f=torch.IntTensor([1,2,3,4])#对于python已经定义好的数据结构可以直接转换

print(d,'\n',e,'\n',f)

tensor([[0.0000e+00, 8.4490e-39, 5.2003e+22],

        [1.0692e-05, 1.3237e+22, 2.7448e-06]])

tensor([        0, 1083129856], dtype=torch.int32)

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

In[6]:

# tensor和numpy array之间的相互转换

importnumpyasnp

g=np.array([[1,2,3],[4,5,6]])

h=torch.tensor(g)

print(h)

i=torch.from_numpy(g)

print(i)

j=h.numpy()

print(j)

tensor([[1, 2, 3],

        [4, 5, 6]])

tensor([[1, 2, 3],

        [4, 5, 6]])

[[1 2 3]

[4 5 6]]

In[10]:

# 常见的构造Tensor的函数

k=torch.rand(2,3)

l=torch.ones(2,3)

m=torch.zeros(2,3)

n=torch.arange(0,10,2)

print(k,'\n',l,'\n',m,'\n',n)

tensor([[0.2652, 0.0650, 0.5593],

        [0.7864, 0.0015, 0.4458]])

tensor([[1., 1., 1.],

        [1., 1., 1.]])

tensor([[0., 0., 0.],

        [0., 0., 0.]])

tensor([0, 2, 4, 6, 8])

In[11]:

# 查看tensor的维度信息(两种方式)

print(k.shape)

print(k.size())

torch.Size([2, 3])

torch.Size([2, 3])

In[12]:

# tensor的运算

o=torch.add(k,l)

print(o)

tensor([[1.2652, 1.0650, 1.5593],

        [1.7864, 1.0015, 1.4458]])

In[13]:

# tensor的索引方式与numpy类似

print(o[:,1])

print(o[0,:])

tensor([1.0650, 1.0015])

tensor([1.2652, 1.0650, 1.5593])

In[16]:

# 改变tensor形状的神器:view

print(o.view((3,2)))

print(o.view(-1,2))

tensor([[1.2652, 1.0650],

        [1.5593, 1.7864],

        [1.0015, 1.4458]])

tensor([[1.2652, 1.0650],

        [1.5593, 1.7864],

        [1.0015, 1.4458]])

In[17]:

# tensor的广播机制(使用时要注意这个特性)

p=torch.arange(1,3).view(1,2)

print(p)

q=torch.arange(1,4).view(3,1)

print(q)

print(p+q)

tensor([[1, 2]])

tensor([[1],

        [2],

        [3]])

tensor([[2, 3],

        [3, 4],

        [4, 5]])

In[18]:

# 扩展&压缩tensor的维度:squeeze

print(o)

r=o.unsqueeze(1)

print(r)

print(r.shape)

tensor([[1.2652, 1.0650, 1.5593],

        [1.7864, 1.0015, 1.4458]])

tensor([[[1.2652, 1.0650, 1.5593]],

        [[1.7864, 1.0015, 1.4458]]])

torch.Size([2, 1, 3])

In[19]:

s=r.squeeze(0)

print(s)

print(s.shape)

tensor([[[1.2652, 1.0650, 1.5593]],

        [[1.7864, 1.0015, 1.4458]]])

torch.Size([2, 1, 3])

In[20]:

t=r.squeeze(1)

print(t)

print(t.shape)

tensor([[1.2652, 1.0650, 1.5593],

        [1.7864, 1.0015, 1.4458]])

torch.Size([2, 3])

In[ ]:

In[ ]:

第二部分:自动求导示例

这里将通过一个简单的函数 𝑦=𝑥1+2∗𝑥2y=x1+2∗x2 来说明PyTorch自动求导的过程

In[22]:

importtorch

x1=torch.tensor(1.0,requires_grad=True)

x2=torch.tensor(2.0,requires_grad=True)

y=x1+2*x2

print(y)

tensor(5., grad_fn=<AddBackward0>)

In[23]:

# 首先查看每个变量是否需要求导

print(x1.requires_grad)

print(x2.requires_grad)

print(y.requires_grad)

True

True

True

In[24]:

# 查看每个变量导数大小。此时因为还没有反向传播,因此导数都不存在

print(x1.grad.data)

print(x2.grad.data)

print(y.grad.data)

---------------------------------------------------------------------------AttributeErrorTraceback (most recent call last)/tmp/ipykernel_11770/1707027577.pyin<module>      1# 查看每个变量导数大小。此时因为还没有反向传播,因此导数都不存在----> 2 print(x1.grad.data)      3print(x2.grad.data)      4print(y.grad.data)AttributeError: 'NoneType' object has no attribute 'data'

In[25]:

x1

Out[25]:

tensor(1., requires_grad=True)

In[26]:

## 反向传播后看导数大小

y=x1+2*x2

y.backward()

print(x1.grad.data)

print(x2.grad.data)

tensor(1.)

tensor(2.)

In[30]:

# 导数是会累积的,重复运行相同命令,grad会增加

y=x1+2*x2

y.backward()

print(x1.grad.data)

print(x2.grad.data)

tensor(5.)

tensor(10.)

In[ ]:

# 所以每次计算前需要清除当前导数值避免累积,这一功能可以通过pytorch的optimizer实现。后续会讲到

In[31]:

# 尝试,如果不允许求导,会出现什么情况?

x1=torch.tensor(1.0,requires_grad=False)

x2=torch.tensor(2.0,requires_grad=False)

y=x1+2*x2

y.backward()

---------------------------------------------------------------------------RuntimeErrorTraceback (most recent call last)/tmp/ipykernel_11770/4087792071.pyin<module>      3x2=torch.tensor(2.0,requires_grad=False)      4y=x1+2*x2----> 5 y.backward()/data1/ljq/anaconda3/envs/smp/lib/python3.8/site-packages/torch/_tensor.pyinbackward(self, gradient, retain_graph, create_graph, inputs)    253create_graph=create_graph,    254inputs=inputs)--> 255        torch.autograd.backward(self,gradient,retain_graph,create_graph,inputs=inputs)    256    257defregister_hook(self,hook):/data1/ljq/anaconda3/envs/smp/lib/python3.8/site-packages/torch/autograd/__init__.pyinbackward(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)    145retain_graph=create_graph    146--> 147    Variable._execution_engine.run_backward(    148tensors,grad_tensors_,retain_graph,create_graph,inputs,    149allow_unreachable=True, accumulate_grad=True)  # allow_unreachable flagRuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

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

推荐阅读更多精彩内容