torch 的包应用

天涯浪子 提交于 2020-02-10 19:27:39

1.torchvision.transforms是pytorch中的图像预处理包一般用Compose把多个步骤整合到一起,比如说

    transforms.Compose([transforms.CenterCrop(10),
                                        transforms.ToTensor(),])

2.transforms中的函数

    Resize:把给定的图片resize到given size;
    Normalize:Normalized an tensor image with mean and standard deviation;
    ToTensor:convert a PIL image to tensor (H*W*C) in range [0,255] to a torch.Tensor(C*H*W) in the range [0.0,1.0];
    ToPILImage: convert a tensor to PIL imageScale:目前已经不用了,推荐用ResizeCenterCrop;
    ResizeCenterCrop:在图片的中间区域进行裁剪;
    RandomCrop:在一个随机的位置进行裁剪;
    RandomHorizontalFlip:以0.5的概率水平翻转给定的PIL图像;
    RandomVerticalFlip:以0.5的概率竖直翻转给定的PIL图像;
    RandomResizedCrop:将PIL图像裁剪成任意大小和纵横比;
    Grayscale:将图像转换为灰度图像;
    RandomGrayscale:将图像以一定的概率转换为灰度图像;
    FiceCrop:把图像裁剪为四个角和一个中心T;
    enCropPad:填充ColorJitter:随机改变图像的亮度对比度和饱和度

detach()

 当我们再训练网络的时候可能希望保持一部分的网络参数不变,只对其中一部分的参数进行调整;或者值训练部分分支网络,并不让其梯度对主网络的梯度造成影响,

 这时候我们就需要使用detach()函数来切断一些分支的反向传播

 detach()[source]
返回一个新的Variable,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个Variable永远不需要计算其梯度,不具有grad

即使之后重新将它的requires_grad置为true,它也不会具有梯度grad

这样我们就会继续使用这个新的Variable进行计算,后面当我们进行反向传播时,到该调用detach()的Variable就会停止,不能再继续向前进行传播

 

import torcha = torch.tensor([1,2,3.],requires_grad=True)#3后面一定有个.print(a.grad)out = a.sigmoid()out.sum().backward()print(a.grad)

None
tensor([0.1966, 0.1050, 0.0452])

import torcha = torch.tensor([1,2,3.],requires_grad=True)#3后面一定有个.print(a.grad)out = a.sigmoid()print(out)#添加detach(),c的require_grad=Falsec = out.detach()print(c)#没有梯度#没有对c更改,并不影响backward()out.sum().backward()print(a.grad)
#使用新生成的Variable进行反向传播
c.sum().backward()print(a.grad)

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
tensor([0.7311, 0.8808, 0.9526])
tensor([0.1966, 0.1050, 0.0452])

RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

import torcha = torch.tensor([1,2,3.],requires_grad=True)#3后面一定有个.print(a.grad)out = a.sigmoid()print(out)#添加detach(),c的require_grad=Falsec = out.detach()print(c)#没有梯度c.zero_()print(c)print(out)#修改c的同时影响out的值#没有对c更改,并不影响backward()out.sum().backward()print(a.grad)

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward>)
tensor([0.7311, 0.8808, 0.9526])
tensor([0., 0., 0.])
tensor([0., 0., 0.], grad_fn=<SigmoidBackward>)但是还有梯度

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [3]], which is output 0 of SigmoidBackward, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!