[英]Pytorch normalize 2D tensor
为了让我的 model 更加稳健,我想规范化我的特征张量。
我尝试按照我对图片的知识标准的最佳方式进行操作:
class Dataset(torch.utils.data.Dataset):
'Characterizes a dataset for PyTorch'
def __init__(self, input_tensor, transform = transforms.Normalize(mean= 0.5, std=0.5)):
self.labels = input_tensor[:,:,-1]
self.features = input_tensor[:,:,:-1]
self.transform = transform
def __len__(self):
return self.labels_planned.shape[0]
def __getitem__(self, index):
# Load data and get label
X = self.features[index]
y = self.labelslabels[index]
if self.transform:
X = self.transform(X)
return X, y
但收到此错误消息:
ValueError: Expected tensor to be a tensor image of size (C, H, W). Got tensor.size() = torch.Size([8, 25]).
我到处都看到人们建议应该使用.view 来生成第三维以符合图片的标准形状,但这对我来说似乎很奇怪。 是否有更清洁的方法来做到这一点。 另外,我应该在哪里最好地进行标准化? 只针对批次还是针对整个火车数据集?
你问的是两个不同的问题,我会尽量回答。
实际上,您应该首先重塑到(c, h, w)
其中c
是通道维度在大多数情况下,您将需要额外的维度,因为大多数“图像”层都是为接收 3d 维度张量而构建的 - 不包括批量维度 -例如nn.Conv2d
、 BatchNorm2d
等......我不相信它周围有任何东西,这样做会将自己限制在一层图像数据集上。
您可以使用torch.reshape
或Tensor.view
广播到所需的形状:
X = X.reshape(1, *X.shape)
或者通过使用torch.unsqueeeze
添加一个额外的维度:
X.unsqueeze(0)
关于标准化。 批量归一化和数据集归一化是两种不同的方法。
前者是一种可以在卷积网络中提高性能的技术。 这种操作可以使用nn.BatchNorm2d
层来实现,并使用可学习的参数完成:比例因子(~std)和偏差(~mean)。 当调用 model 并按批次应用时,将应用这种类型的规范化。
后者是一种预处理技术,允许使不同的特征具有相同的比例。 这种标准化可以应用于每个元素的数据集中。 它要求您测量训练集的均值和标准差。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.