Mse traning больше чем Mse testing. PyTorch ANN
inputs_train_torch = torch.from_numpy(inputs_train).float()
inputs_test_torch = torch.from_numpy(inputs_test).float()
outputs_train_torch = torch.from_numpy(outputs_train).float()
outputs_test_torch = torch.from_numpy(outputs_test).float()
model = torch.nn.Sequential(
torch.nn.Linear(4, 15),
torch.nn.ReLU(),
torch.nn.Linear(15, 15),
torch.nn.ReLU(),
torch.nn.Linear(15, 1)
)
criterion = torch.nn.MSELoss(reduction='mean')
criterion1 = torch.nn.L1Loss(reduction='mean')
optimizer = torch.optim.Adam(model.parameters(), lr=0.008)
for epoch in range(100):
output = model(inputs_train_torch)
loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
print('Epoch: ', epoch, 'MSE train: ', loss.item())
output = model(inputs_test_torch)
loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
print('Epoch: ', epoch, 'MSE test: ', loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
for epoch in range(100):
output = model(inputs_train_torch)
loss = criterion1(output, torch.reshape(outputs_train_torch, (81403, 1)))
print('Epoch: ', epoch, 'MAE train: ', loss.item())
output = model(inputs_test_torch)
loss = criterion1(output, torch.reshape(outputs_test_torch, (21654, 1)))
print('Epoch: ', epoch, 'MAE test: ', loss.item())
optimizer.zero_grad()
loss.backward()
optimizer.step()
Out[]:
Epoch: 86 MSE test: 0.03307786211371422
Epoch: 87 MSE train: 0.03682834655046463
Epoch: 87 MSE test: 0.031561754643917084
Epoch: 88 MSE train: 0.036547500640153885
Epoch: 88 MSE test: 0.028746912255883217
Epoch: 89 MSE train: 0.03666434809565544
Epoch: 89 MSE test: 0.02723623998463154
Epoch: 90 MSE train: 0.03619876876473427
Epoch: 90 MSE test: 0.02561429888010025
Epoch: 91 MSE train: 0.03621290624141693
Epoch: 91 MSE test: 0.025094548240303993
Epoch: 92 MSE train: 0.03558947145938873
Epoch: 92 MSE test: 0.024901267141103745
Epoch: 93 MSE train: 0.03537008538842201
Epoch: 93 MSE test: 0.024834109470248222
Epoch: 94 MSE train: 0.034832216799259186
Epoch: 94 MSE test: 0.0251359511166811
Epoch: 95 MSE train: 0.03468063473701477
Epoch: 95 MSE test: 0.024926314130425453
Epoch: 96 MSE train: 0.03419237211346626
Epoch: 96 MSE test: 0.025308404117822647
Epoch: 97 MSE train: 0.034069210290908813
Epoch: 97 MSE test: 0.02491961047053337
Epoch: 98 MSE train: 0.033683035522699356
Epoch: 98 MSE test: 0.025090258568525314
Epoch: 99 MSE train: 0.03355500474572182
Epoch: 99 MSE test: 0.02469632588326931
Почему MSE train больше чем MSE test. Как можно решить эту проблему? Пробовал поменять Lr и число элементов в слоях но лучший результат это.
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
output = model(inputs_train_torch)
loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
print('Epoch: ', epoch, 'MSE train: ', loss.item())
output = model(inputs_test_torch)
loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
print('Epoch: ', epoch, 'MSE test: ', loss.item())
optimizer.zero_grad()
loss.backward() # <-- обучение на лоссе теста!
optimizer.step()
Так вы в итоге учите нейросеть именно на лоссе теста, поэтому она его хорошо и предсказывает! Учить модель нужно на трейне, а на тесте нужно только проверять качество обучения. А у вас всё наоборот получается, поэтому и качество на тесте больше, чем на трейне. Перенесите обучение на лосс трейна:
output = model(inputs_train_torch)
loss = criterion(output, torch.reshape(outputs_train_torch, (81403, 1)))
print('Epoch: ', epoch, 'MSE train: ', loss.item())
optimizer.zero_grad()
loss.backward() # <- теперь модель учится на трейне
optimizer.step()
output = model(inputs_test_torch)
loss = criterion(output, torch.reshape(outputs_test_torch, (21654, 1)))
print('Epoch: ', epoch, 'MSE test: ', loss.item())
Я, кстати, не уверен, что тут вообще нужен optimizer.zero_grad(), это не обнуляет обучение на каждой итерации цикла, у вас обучение вообще идёт со сменой эпохи?