pytorch中.size()、.item、argmax()、.cpu()、.detach()和.data的使用

.size(dim = x)

size函数返回的是数据第x维的个数。

X = torch.Tensor([
    [1,2,3],
    [4,5,6]
])
print(X.shape)
print(X.size(0))
print(X.size(1))
torch.Size([2, 3])
2
3

.item()

将一个Tensor变量转换为python标量(int、float等)。常用于用于深度学习训练时,将loss值转换为标量并加,以及进行分类任务,计算准确值值时需要。

optimizer.zero_grad()
outputs = model(data)
loss = F.cross_entropy(outputs, label)
#计算这一个batch的准确率
acc = (outputs.argmax(dim=1) == label).sum().cpu().item() / len(labels) #这里也用到了.item()
loss.backward()
optimizer.step()
train_loss += loss.item()   #这里用到了.item()
train_acc += acc

torch.argmax(output,dim=x)

torch.argmax()的作用是返回tensor数据第x维的最大值的索引。我们只想要神经网络最终的标签,它输出的概率值并不关心,那么就可以直接用torch.argmax()返回tensor数据最大值的索引,代码示例如下:

output=torch.tensor([[-0.7403, -0.6481],
        [-0.6869, -0.6994]])
pred = torch.argmax(output,dim=1)
pred
tensor([1, 0])

.cpu()

将数据的处理设备从其他设备(如gpu拿到cpu上),不会改变变量类型,转换后仍然是Tensor变量。

.detach()和.data

detach()就是返回一个新的tensor,将requires_grad 属性设置为False。并且这个tensor是从当前的计算图中分离出来的。但是返回的tensor和原来的tensor是共享内存空间的。

还有一点需要注意的是Tensor.detach()和Tensor.data的区别

共同点:Tensor.data和Tensor.detach()一样, 都会返回一个新的Tensor, 这个Tensor和原来的Tensor共享内存空间,一个改变,另一个也会随着改变,且都会设置新的Tensor的requires_grad属性为False。这两个方法只取出原来Tensor的tensor数据, 丢弃了grad、grad_fn等额外的信息。

区别:Tensor.data不能被autograd追踪到,如果你修改了Tensor.data返回的新Tensor,原来的Tensor也会改变, 但是这时候的微分并没有被追踪到,那么当你执行loss.backward()的时候并不会报错,但是求的梯度就是错误的!因此, 如果你使用了Tensor.data,那么切记一定不要随便修改返回的新Tensor的值。如果你使用的是Tensor.detach()方法,当你修改他的返回值并进行求导操作,会报错。 因此,Tensor.detach()是安全的。

参考Pytorch中.detach()与.data的用法 - 知乎

你可能感兴趣的:(深度学习,pytorch,深度学习,python)