繁体   English   中英

Pytorch 归一化二维张量

[英]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.Conv2dBatchNorm2d等......我不相信它周围有任何东西,这样做会将自己限制在一层图像数据集上。

    您可以使用torch.reshapeTensor.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM