PyTorch深度学习(二):3. 索引与求导


本文主要为PyTorch中的数据索引与求导的基本操作,为实战入门打基础。奥利给!

1. 数据的索引操作

1.1生成数据

生成数据的arange()函数,按顺序生成

#arange:生成数据,从x到y
tensor = torch.arange(2,14)
print(tensor)

#输出
tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])

1.2 取索引值

索引从0开始,想要第三个值即tensor[2]:

#tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
print(tensor[2])

#输出
tensor(4)

1.3 索引冒号的用法 “:”

1.3.1 “:”连续生成

索引从0开始,冒号“:”后一位是不输出的:

#arange:生成数据,从x到y-1
#tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
print(tensor[1:4]) #这里只输出第1位到第3位(从0开始)

#输出
tensor([3, 4, 5])

1.3.2 “-1”的作用

-1表示从右往左数的第1位,同理也是从0开始,故真正的最后一位不予输出:

#-1即表示从后开始数的负1位置
#tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
print(tensor[2:-1])

#输出
tensor([ 4,  5,  6,  7,  8,  9, 10, 11, 12])

1.3.3 单“:”的应用

1、从头开始——冒号前没有值

#从头开始
#tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
print(tensor[:5])

#输出
tensor([2, 3, 4, 5, 6])

2、取到最后——冒号后没有值

#取到最后
#tensor([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])
print(tensor[-3:]) #表示取最后三个(真正意义的最后一个取不到)

#输出
tensor([11, 12, 13])

1.4 用索引生成数据

读取想要的值

#随意取5个值,其中有重复值
index = [1,3,4,5,5]
tensor[index] #表示取tensor中的index数据,出现重复值

#输出
tensor([3, 5, 6, 7, 7])

1.5 循环tensor数据

for t in tensor:
    print (t)

#输出
tensor(2)
tensor(3)
tensor(4)
tensor(5)
tensor(6)
tensor(7)
tensor(8)
tensor(9)
tensor(10)
tensor(11)
tensor(12)
tensor(13)

2. 自动求导

2.1实现函数的数学表述

1、定义函数z与自变量x的关系如下:

z i = 3 ( x i + 2 ) z_{i} = 3(x_i+2)

2、定义o表示为四个z值的平均值
o = 1 4 i z i o = \frac{1}{4}\sum_{i}z_{i}

3、由此,可知当x=1时,z的值

z i x i = 1 = 27 z_{i}|_{x_{i}=1}= 27

4、而对o求导,可得o的导数为:

o x i = 3 2 ( x i + 2 ) \frac{\partial o}{\partial x_i}=\frac{3}{2}(x_i+2)

5、通过带入计算可求得结果:

o x i x i = 1 = 9 2 = 4.5 \frac{\partial o}{\partial x_i}|_{x_i=1}=\frac{9}{2}=4.5

2.2编程实现

2.2.1 引入自变量x

#导入4×4的自变量x=1
x = torch.ones((2,2),requires_grad = True)
x

#输出
tensor([[1., 1.],
        [1., 1.]], requires_grad=True)

2.2.2 定义z

y = x + 2
z = y * y * 3

2.2.3 根据z求o

#定义o即为out;
#求平均值,将四个值求平均值(使用mean函数)
out = z.mean()
print(out)

#输出
tensor(27., grad_fn=<MeanBackward0>)

2.2.4 对o求导_计算梯度值(backward函数)

out.backward()只是一个计算过程,运行后执行计算

#使用backward()函数进行对out求导,计算梯度值
out.backward() #此过程只是求值过程

print(x.grad) #查看求导后,x对应的梯度值,即其导数值

#输出
tensor([[4.5000, 4.5000],
        [4.5000, 4.5000]])
发布了27 篇原创文章 · 获赞 6 · 访问量 536

猜你喜欢

转载自blog.csdn.net/qq_43246110/article/details/104197842