pytorch的 Size[3] 和 Size[3,1] 区别
今天参考d2l-zh-pytorch做循环神经网络中第一个练习时,没有导入d2l库(之前遇到到跟本地numpy冲突),部分需要d2l库的部分采用手搓,发现损失总是不收敛,跟预期极大。经过不断排查,发现是reshape((-1,1))
这个写错了,我写成reshape((-1))
了。没想到不报错,模型还能训练(
在张量中,维度是用来表示数据结构的多维性。标量(scalar)是一个具有单一值的张量。
import torch
x = torch.tensor(4)print(f"x值(tensor类型): {x}\n",f"x的数值(数字): {x.item()}\n",f"x的维度: {x.shape}")
# x值(tensor类型): 4
# x的数值(数字): 4
# x的维度: torch.Size([])
这里的x就是为标量,它没有维度,所以是[]
。
标量没有维度!!!
import torch
x = torch.tensor([1,2,3])print(f"x值(tensor类型): {x}\n",f"x的维度: {x.shape}\n",f"x[0]的值(tensor类型): {x[0]}\n",f"x[0]的数值(数字): {x[0].item()}\n",f"x[0]的维度: {x[0].shape}")
# x值(tensor类型): tensor([1, 2, 3])
# x的维度: torch.Size([3])
# x[0]的值(tensor类型): 1
# x[0]的数值(数字): 1
# x[0]的维度: torch.Size([])
这个上面的x是一维张量(向量),单个x元素是标量,没有维度。
import torch
x = torch.tensor([1,2,3])
x = x.reshape((-1,1))
print(f"x的维度: {x.shape}\n",f"x[0]的维度: {x[0].shape}\n"f"x[0]的数值: {x[0].item()}")
# x的维度: torch.Size([3, 1])
# x[0]的维度: torch.Size([1])
# x[0]的数值: 1
这个上面的x是二维张量(向量),单个x元素是一维张量,维度为1。
因为之前主要写C++,所以当pytorch输出Size[3]
时觉得是(1,3)
这样维度为2的。这是由于我没有考虑到张量和标量的区别。