1. pytorch基本用法
1. torch.tensor
torch.tensor是默认的tensor类型(torch.Floattensor)的简称。
2. torch.Tensor与torch.tensor的区别
-
相同点: 两者都是用于生成新的张量tensor,其中tensor是一种数据类型。包含单一数据类型元素的多维矩阵。
-
不同点: torch.Tensor是python类,默认张量类型为torch.FloatTensor的别名。
-
例如,torch.Tensor([1,2])会调用Tensor类的构造函数init,生成floattensor类型的张量。 torch.tensor仅仅是python的函数,主要是将一个data封装成一个tensor。
-
其函数原型是:
torch.tensor(data,dtype=None,device=None,requires_grad=False)
其中data可以是list || tuple || array || scalar
等类型。 -
torch.tensor可以从data中的数据部分做拷贝copy(而不是直接引用),根据原始数据类型生成相应的torch.LongTensor、torch.FloatTensor、torch.DoubleTensor。
3. transforms.ToTensor与transforms.ToPILImage
-
torchvision.transforms中定义了一系列数据转换形式。有PILImage、numpy,Tensor之间的转换,还能对数据进行处理。
-
ToTensor:将PILImage或者numpy的ndarry转化成tensor。取值范围[0,1.0]
-
-
对于PILImage转化的tensor,其数据类型为torch.FloatTensor
-
把一个取值范围是[0,255]的PIL.Image转换成tensor
-
```img=Image.open()
-
out_img=transforms.ToTensor(img)```
-
-
-
对于ndarray的数据类型没有限制,但转化成tensor的数据类型是由ndarry的数据类型决定的。
-
shape为(H,W,C)的numpy.ndarray转换成形状为(C,H,W)、取值范围是[0,1.0]的tensor
-
-
-
ToPILImage:将Pnumpy的ndarry或者tensor转换成PILImage。PILImage取值范围为[0,255]
-
-
ndarry的数据类型要求是dtype=uint8,取值范围[0,255],shape为(H,W,C)
-
-
-
tensor的shape为CHW,只能是FLoatTensor类型。
-
-
-
-
相关链接:Pytorch之浅入torchvision.transforms.ToTensor与ToPILImage_啧啧啧biubiu的博客-CSDN博客_transforms.topilimagePytorch之浅入torchvision.transforms.ToTensor与ToPILImage Pytorch之浅入torchvision.transforms.ToTensor与ToPILImage_啧啧啧biubiu的博客-CSDN博客_transforms.topilimage
2. Pytorch错误类型
1. 模型的分类数不匹配
RuntimeError: CUDA error:CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)
2. 标签越界
RuntimeError: CUDA error: device-side assert triggered
Solution:
首先检查自己的标签是否从0开始;
将模型、损失函数、张量全部转到CPU上面运行或者debug,此时会报错具体的位置。因为cpu比cuda更能够定位自己的错误所在。在debug模式下,我发现的确是因为某个索引越界导致程序异常(但是cuda始终告诉我是标签越界)
3. pytorch中梯度求导只能针对FolatTensor类型吗?
Yes 关于这个问题如果有人了解,麻烦请告知一声,主要小编也不太清楚,只不过是根据所查资料得出的结论,若有错误,请加以指正。
根据Pytorch的设计,梯度只能计算浮点张量,即只有浮点张量才可求梯度。所以输入的数据必须为浮点类型张量。链接:pytorch的梯度计算以及backward方法 pytorch的梯度计算以及backward方法_耐耐~的博客-CSDN博客_pytorch求梯度
在输入的过程中并未对输入数据指定梯度要求,为什么还可进行求导,因为模型权重内部默认是required_grad=True,所以可进行求导。🔗:深入Pytorch中的Tensor,梯度以及权重 深入Pytorch中的Tensor,梯度以及权重_AI学渣的博客-CSDN博客_pytorch tensor 梯度
若输入网络中的tensor类型带有
required_grad=True
的参数,此时输入网络中的数据必须要为FloatTensor类型。即x=torch.tensor(data,dtype=None,device=None,requires_grad=True)
此时x必须为FloatTensor类型。