Я хотел бы разработать модель нейронной сети, которая имеет несколько входных переменных (4) и несколько выходных (3).Не уверен, где можно улучшить.Возможные проблемы:
Загрузчик данных и нормализация данных:
- Я обнаружил, что мои входные данные имеют 4 3 ~ 4-значные значения, следовательно, нормализация.Я не уверен, что мой метод был правильным.
- и я также сделал эту нормализацию для входных значений, хотя выходные значения также имеют широкий диапазон чисел, но хотят правильно предсказать, что является выходным значением.
Сама модель:
- Я пытаюсь построить модель с несколькими входами и несколькими выходами, поэтому я помещаю 4 входные переменные и получаю 3 выходные переменные.Как мне улучшить мою модель?(Ценю с вашей помощью, но, просто используйте CNN, RNN, LSTM ... не очень помогает ..)
Функция потери и оптимизатор
- В настоящее время используется функция потерь nn.MSELoss () и оптимизатор torch.optim.SGD (model.parameters (), lr = learning_rate).
- Однако это приводит к выводу NaN, NaN, NaN (возможно, некоторого числаидет слишком большой?) и попытался nn.L1Loss ()
- Значение Loss.item значительно уменьшилось, но не уверен, что это значения, которые я хочу.
- и я не вижу особых изменений (процесса обучения) в результате
Метрики оценки
- Кажется, яне может построить прогноз и y, потому что это трехмерный вектор, а также не может выполнить простое сравнение на равенство, потому что числа обычно не совпадают во многих десятичных точках.
- Как мне следует проводить оценку в таких обстоятельствах?
Любые дополнительные советы или помощь будут очень полезны.Заранее благодарим
#This is a dataloader that I have and did normalization with f.normalize
class Loader(Dataset):
def __init__(self, data):
self.data = data
// without normalization process
//self.features = torch.tensor(data.iloc[:, 1:4].values)
// with normalization process
self.features = f.normalize(torch.tensor(data.iloc[:, 1:5].values), p=2, dim=[-2,1])
self.targets = torch.tensor(data.iloc[:, 5:8].values)
def __getitem__(self, index):
feature = self.features[index]
target = self.targets[index]
return feature, target
def __len__(self):
return self.data.shape[0]
# model
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(4, 3)
def forward(self, x):
return self.linear(x)
# main codes to run training
trainset = Loader(data=training_data)
train_loader = DataLoader(dataset = trainset,
batch_size=batch_size,
shuffle=False)
model = MultivariateLinearRegressionModel().to(device)
criterion = torch.nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
total_step = len(test_loader)
loss_list = []
for epoch in range(100):
for i, (x, y) in enumerate(test_loader):
x = x.to(device, dtype=torch.float)
y = y.to(device, dtype=torch.float)
# Forward pass
prediction = model(x)
loss = criterion(prediction, y)
# Zero gradients, perform a backward pass, and update the weights.
optimizer.zero_grad()
loss.backward()
optimizer.step()
if (i+1) % 1000 == 0:
print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, total_step, loss.item()))
loss_list.append(loss.item())
Формат данных: до нормализации
tensor([[3671.4275, 3920.7729, 3562.8547, 3409.9354],
[2613.0593, 4144.3052, 3963.4261, 2520.0331],
[3217.1497, 4907.6748, 3618.3077, 1625.5708],
[3495.5350, 3740.1072, 3372.8023, 3222.0030],
[2668.3124, 4059.1723, 3856.5733, 2555.0729],
[3148.7100, 3581.6413, 3238.2163, 2892.8446],
[3259.0295, 4951.7812, 3691.3874, 1729.6103],
[2383.1404, 4416.9705, 4282.0778, 2368.6338],
[3233.4030, 3509.1483, 3131.9635, 2950.0310],
[2796.2451, 4666.8626, 3963.1061, 2038.5555]], device='cuda:0',
dtype=torch.float64)
tensor([[ 86.8043, -125.5781, 514.8793],
[ 599.4942, -25.5526, 869.6853],
[ 767.3758, -575.2572, 932.4783],
[ 85.4733, -129.7880, 653.4727],
[ 539.4341, -38.1205, 870.6907],
[ 150.6393, -117.4500, 877.1568],
[ 766.7727, -558.0292, 871.3760],
[ 806.4800, 11.9661, 873.6658],
[ 98.3526, -130.0950, 883.7505],
[ 780.5635, -253.1192, 876.8691]], device='cuda:0',
dtype=torch.float64)
Формат данных: после нормализации
tensor([[0.0063, 0.0069, 0.0061, 0.0058],
[0.0067, 0.0072, 0.0065, 0.0062],
[0.0064, 0.0070, 0.0062, 0.0059],
[0.0056, 0.0092, 0.0077, 0.0039],
[0.0051, 0.0081, 0.0078, 0.0049],
[0.0058, 0.0074, 0.0068, 0.0054],
[0.0054, 0.0078, 0.0073, 0.0051],
[0.0063, 0.0097, 0.0073, 0.0034],
[0.0047, 0.0087, 0.0084, 0.0046],
[0.0058, 0.0093, 0.0076, 0.0038]], device='cuda:0',
dtype=torch.float64)
tensor([[ 98.2855, -130.0667, 883.9658],
[ 86.6183, -130.0066, 716.1242],
[ 93.5488, -130.8305, 837.4871],
[ 778.3415, -295.5290, 876.0615],
[ 598.6805, -25.7674, 869.6824],
[ 322.8932, -82.1197, 873.7214],
[ 473.1678, -51.6608, 871.5651],
[ 768.4887, -535.2723, 871.2855],
[ 806.6830, 6.9960, 877.1038],
[ 775.0177, -365.2128, 875.5223]], device='cuda:0',
dtype=torch.float64)
# Result
Epoch [1/100], Step [1000/5500], Loss: 320.4197
Epoch [1/100], Step [2000/5500], Loss: 262.3183
Epoch [1/100], Step [3000/5500], Loss: 220.1559
Epoch [1/100], Step [4000/5500], Loss: 236.1293
Epoch [1/100], Step [5000/5500], Loss: 34.1634
Epoch [2/100], Step [1000/5500], Loss: 440.7753
Epoch [2/100], Step [2000/5500], Loss: 494.4890
Epoch [2/100], Step [3000/5500], Loss: 224.8119
Epoch [2/100], Step [4000/5500], Loss: 145.8345
Epoch [2/100], Step [5000/5500], Loss: 97.7785