在PyTorch中计算图的特点总结如下:
autograd根据用户对Variable的操作来构建其计算图。
requires_grad
variable默认是不需要被求导的,即requires_grad属性默认为False,如果某一个节点的requires_grad为True,那么所有依赖它的节点requires_grad都为True。
volatile
variable的volatile属性默认为False,如果某一个variable的volatile属性被设为True,那么所有依赖它的节点volatile属性都为True。volatile属性为True的节点不会求导,volatile的优先级比requires_grad高。
retain_graph
多次反向传播(多层监督)时,梯度是累加的。一般来说,单次反向传播后,计算图会free掉,也就是反向传播的中间缓存会被清空【这就是动态度的特点】。为进行多次反向传播需指定retain_graph=True来保存这些缓存。
.backward()
反向传播,求解Variable的梯度。放在中间缓存中。
在torch里面,view函数相当于numpy的reshape,来看几个例子:
a = torch.arange(1, 17) # a's shape is (16,)
a.view(4, 4) # output below
tensor([[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]])
[torch.FloatTensor of size 4x4]
a.view(2, 2, 4) # output below
tensor([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8]],
[[ 9, 10, 11, 12],
[13, 14, 15, 16]]])
[torch.FloatTensor of size 2x2x4]
在函数的参数中经常可以看到-1例如x.view(-1, 4)
这里-1表示一个不确定的数,就是你如果不确定你想要reshape成几行,但是你很肯定要reshape成4列,那不确定的地方就可以写成-1
例如一个长度的16向量x,
x.view(-1, 4)等价于x.view(4, 4)
x.view(-1, 2)等价于x.view(8,2)
以此类推。
关于x.view(0)的理解
x = x.view(x.size(0), -1)
这句话一般出现在model类的forward函数中,具体位置一般都是在调用分类器之前。分类器是一个简单的nn.Linear()结构,输入输出都是维度为一的值,x = x.view(x.size(0), -1) 这句话的出现就是为了将前面多维度的tensor展平成一维。具体解析如下:
1.在torch的网络定义部分的forward(self,x)中有可能会出现下面这句话:
x = x.view(x.size(0),-1)
2.这句话的意思是将多维度的Tensor展平成一维,但是到底转换的样子是什么样的其实我们这样看并不明白
代码展示
1.我们先定义一个Tensor:
import torch
a = torch.arange(1,17)
2.输出这个Tensor的内容和大小:
print(a)
print(a.size(0))
代码变为:
import torch
a = torch.arange(1,17)
print(a)
print(a.size(0))
结果为:
将Tensor转换为1维
输入代码:
b = a.view(a.size(0),-1)
print(b)
代码变为:
import torch
a = torch.arange(1,17)
print(a)
print(a.size(0))
b = a.view(a.size(0),-1)
print(b)
结果为:
其中这个-1指的是不知道多少列的情况下,根据原来Tensor内容和Tensor的大小自动分配列数。