Pytorch github代码链接:https://github.com/L1aoXingyu/pytorch-beginner
ch3:多层全连接神经网络
3.1 热身:Pytorch基础
3.1.1 Tensor(张量)
- 不同数据类型的tensor:
有32位浮点型torch.FloatTensor #Tensor默认数据类型
64位浮点型torch.DoubleTensor
16位整型torch.ShortTensor
32位整型torch.IntTensor
64位整型torch.LongTensor
tensor 应用实例:
import torch
a=torch.Tensor([[1,2],[2,3],[3,4]]);
print('a is:{}'.format(a))
print('a size is :{}'.format(a.size()))
#改变tensor的类型
b=torch.LongTensor([[1,2],[2,3],[3,4]])
print('b is:{}'.format(b))
#建立一个全零的tensor
c=torch.zeros((3,2))
print('c is:{}'.format(c))
#取一个正态分布作为随机初始值
d=torch.randn((3,2))
print('d is:{}'.format(d))
运行结果:
a is:
1 2
2 3
3 4
[torch.FloatTensor of size 3x2]
a size is :torch.Size([3, 2])
b is:
1 2
2 3
3 4
[torch.LongTensor of size 3x2]
c is:
0 0
0 0
0 0
[torch.FloatTensor of size 3x2]
d is:
-0.2037 -0.6000
-0.4322 0.2700
0.6836 0.3145
[torch.FloatTensor of size 3x2]
- 可以像numpy一样通过索引的方式取得其中的元素,同时改变它的值:
比如:
a[0,1]=100
print('a is:{}'.format(a))
运行结果为:
a is:
1 100
2 3
3 4
[torch.FloatTensor of size 3x2]
- 除此之外,还可以在Tensor和numpy.ndarray 之间相互转换。
通过b.numpy()可以将tensor b转换为numpy
通过torch.from_numpy(e)可以讲numpy e转换为tensor;
numpy_b=b.numpy()
print('b convert to numpy is:{}'.format(numpy_b))
运行结果为:
b convert to numpy is:[[1 2]
[2 3]
[3 4]]
e=np.array([[2,3],[4,5]])
print('e is:{}'.format(e))
torch_e=torch.from_numpy(e)
print('torch_e is:{}'.format(torch_e))
运行结果为:
e is:[[2 3]
[4 5]]
torch_e is:[[2 3]
[4 5]]
如果需要改变tensor的数据类型,只需要在转换后的tensor后面加上所需的数据类型即可。
f_torche=torch_e.float()
print('f_torche is:{}'.format(f_torche))
结果为:
f_torche is:
2 3
4 5
[torch.FloatTensor of size 2x2]
如果需要将Tensor放到GPU上,只需要a.cuda()就能将tensor a放到GPU上了。
if torch.cuda.is_available(): #判断是否支持GPU
a_cuda=a.cuda()
print(a_cuda)
3.1.2:Variable(变量)
Variable(变量)提供了自动求导的功能。
将一个tensor a 变成Variable(变量),只需要Variable(a)就可以了。
Variable有三个比较重要的属性:data, grad 和 grad_fn.
通过data可以取出Variable里面的tensor数值,grad_fn表示的是得到这个Variable的操作,比如通过加减还是乘除来得到的, 最后grad就是这个Variable的反向传播梯度。
1)标量求导
注意:
1.构建变量时,要注意参数requires_grad=True, 这个参数表示是否对这个变量求梯度,默认的是false——不求梯度。
2.y.backward()
,这一行的代码就是所谓的自动求导,这个函数其实等价于y.backward(torch.FloatTensor([1]))
, 只不过对于标量求导里面的参数可以不写,向量求导需要写。
自动求导不需要明确地写出那个函数对哪个函数求导,直接通过这行代码就可以对所有的需要梯度的变量进行求导,得到他们的梯度,然后通过x.grad就可以得到x 的梯度。
import torch
from torch.autograd import Variable
#创建变量
x=Variabl