PyTorch深度学习(二):数据索引与求导
本文主要为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) zi=3(xi+2)
2、定义o表示为四个z值的平均值
o
=
1
4
∑
i
z
i
o = \frac{1}{4}\sum_{i}z_{i}
o=41i∑zi
3、由此,可知当x=1时,z的值
z i ∣ x i = 1 = 27 z_{i}|_{x_{i}=1}= 27 zi∣xi=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) ∂xi∂o=23(xi+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 ∂xi∂o∣xi=1=29=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]])