Где находится правильное положение для нормализации данных?

#python #machine-learning #pytorch

Вопрос:

я использую pytorch для решения своей работы по прогнозированию. Но я не знаю, как и где нормализовать данные с помощью формы (N, 1500, 4). Другими словами, есть данные, которые содержат N строк, и форма каждой строки равна 1500 x 4.

Вот мой фрагмент кода

 class MyDataset(Data.Dataset):
  def __init__(self, transform=None): 
    # get the training data
    dataSource=[['xxxxxx'],
                ['xxxxxx'],
                ['xxxxxx']]
    conn=pymssql.connect(
    host='XXXXXXX',
    user='XXXX',
    password='XXXXXXXX',
    database='XXXXXXXX'
    )
    featureDatas=[]
    for data in dataSource:
        oneDatas=[]
        cursor=conn.cursor(as_dict=True)
        sql='xxxxxxxxxxx'
        cursor.execute(sql)
        maxCount=1500
        iCount=0
        for row in cursor:
            if iCount<maxCount:
                oneDatas.append([row['Temp'],row['Pre'],row['Rev'],row['Ph']])
            else:
                break
            iCount =1
        featureDatas.append(np.array(oneDatas).astype("float32"))    
    cursor.close()
    conn.close()

    self.features= featureDatas
    
    labelDatas=[10,11,12]
    self.labels = np.array(labelDatas).astype("float32").reshape(3,1) 
    self.transform = transform 

  def __len__(self):
    return len(self.features)

  def __getitem__(self, idx):
    if torch.is_tensor(idx): 
      idx = idx.tolist()

    X = self.features[idx] 
    Y = self.labels[idx]

    if self.transform:
      X = self.transform(X)
      Y = self.transform(Y)

    return X,Y

def toTensor(x):
  return torch.tensor(x)

train_dataset = MyDataset(transform=toTensor)

 

Эти данные похожи

 [[[5.0084e 04, 2.0330e 03, 0.0000e 00, 3.5250e 03],
         [3.0613e 04, 5.0000e 00, 4.6720e 03, 7.8130e 03],
         [3.0613e 04, 3.5000e 01, 5.2418e 04, 7.9840e 03],
         ...,
         [3.6498e 04, 7.7700e 02, 8.8623e 04, 6.7800e 03],
         [3.6498e 04, 6.9700e 02, 8.8615e 04, 6.7800e 03],
         [3.6498e 04, 6.4600e 02, 8.8597e 04, 6.7800e 03]],

        [[2.9173e 04, 6.0000e 00, 7.0000e 01, 6.7620e 03],
         [2.9236e 04, 2.0000e 00, 5.3000e 01, 6.8850e 03],
         [2.9299e 04, 1.4000e 01, 7.0000e 01, 7.8090e 03],
         ...,
         [3.7500e 04, 6.8400e 02, 7.4862e 04, 6.8240e 03],
         [3.7625e 04, 6.3400e 02, 7.4755e 04, 6.8370e 03],
         [3.7625e 04, 5.0700e 02, 7.4764e 04, 6.8280e 03]],

        [[2.5605e 04, 1.1000e 01, 8.8597e 04, 6.9990e 03],
         [2.6763e 04, 2.0000e 00, 8.8597e 04, 6.9940e 03],
         [2.8140e 04, 4.2000e 01, 8.8606e 04, 6.9940e 03],
         ...,
         [1.8969e 04, 6.8200e 02, 8.8553e 04, 6.9940e 03],
         [1.8969e 04, 6.5700e 02, 8.8553e 04, 6.9940e 03],
         [1.8969e 04, 6.0600e 02, 8.8535e 04, 6.9990e 03]]]
 

Ответ №1:

В своем коде вы можете включить это transforms.Normalize(mean, std) в train_dataset = MyDataset(transform=toTensor) , включив несколько преобразований.

 train_dataset = MyDataset(
    transform=transforms.Compose([
          transforms.ToTensor()
        , transforms.Normalize(mean, std)
    ])
 

Вы должны предварительно вычислить mean и std , что можно сделать, загрузив данные с помощью a dataloader , а затем вычислить их, повторяя их. (Или, если это хорошо известный набор данных или набор данных, чей mean и std упоминается в какой-либо исследовательской работе, вы можете просто использовать его).