-
Notifications
You must be signed in to change notification settings - Fork 5
PyTorch文档阅读笔记
DingfengShi edited this page Mar 1, 2018
·
6 revisions
-
使用Variable包装Tensor,Variable其实只是一个装Tensor的容器,可用于自动求导
x = torch.randn(3) x = Variable(x, requires_grad=True) y = x * 2 y.backward(...) #省略号里面shape要和y相同 #此时 x.grad #可以得到梯度值
-
使用torch.nn包来加速模型建立
#例子 #nn里分为两种类型Module(直接在nn里),functional。两者的差别就是该层需不需要参数 #比如卷积层,声明需要定义一些参数:nn.Conv2d(1, 6, 5)(inputTensor)需要声明类后要通过__call__方式调用 #而functional对于无参数的网络结构则更方便,比如 x = nn.functional.relu(inputTensor) #一般functional也有Module的实现,比如 x = nn.Relu()(inputTersor)
注意:torch.nn的输入一定是要带batch维度的,所以就算只有一条数据,也要在最前面补上一个值为1的维度:data.unsqueeze(0)
-
使用GPU
如果单独对某些Variable或者Tensor存入GPU中,只需对其执行cuda()方法即可。(Variable和Tensor都右cuda()方法,先把Tensor放入GPU再用Variable包装,和先把Tensor放入Variable都能得到同样的结果)ten = torch.FloatTensor(2) ten_cuda = ten1.cuda() V = autograd.Variable(ten_cuda) #和下面能得到同样结果 ten = torch.FloatTensor(2) V = autograd.Variable(ten) V = V.cuda()
-
继承torch.nn.Module来定义模型 通过继承该类并重写forward方法即可,不需要写反向传播
class Net(nn.Module): ... def forward(self,input): ... ... net=Net() #使用GPU,直接对Module调用cuda()方法即可使里面原定义好的参数放入GPU,(但调用后,对类内方法新创建的参数并不会自动放入GPU) net=net.cuda() #模型变成GPU以后,输入数据也要调用cuda方法 out = net.forward(data.cuda()) #一开始要对模型参数的梯度缓存归零 net.zero_grad() out.backward(...)