Я пытаюсь реализовать перекрестную проверку с помощью pytorch; < /p>
Я привык к функции Sklearn Cross_validation, которая гораздо проще в использовании (скорее всего, потому что я не полностью понимал, что происходило под капотом); Я надеялся, что кто -то может посоветовать, если в первую очередь это выглядит правильно, и, если это так, если есть лучший способ написать это. /> На каждом цикле тренируйте модель на разделении поезда. < /li>
Оцените модель на разделе тестирования. Я создавал это, я начал задаваться вопросом: как следует решить количество эпох для перекрестной проверки? Я всегда предполагал, что это будет просто 1, но из того, что я видел в других постах, это число может действительно различаться. < /P>
Вот мой код: < /p>
X = main_df.drop(columns=['target'])
y = main_df['target']
X_train_t = torch.tensor(X.values, dtype=torch.float32)
y_train_t = torch.tensor(y.values, dtype=torch.float32)
cv_dataset = TensorDataset(X_train_t, y_train_t)
< /code>
class NetModel(nn.Module):
def __init__(self, in_count):
super(NetModel, self).__init__()
self.layers = nn.Sequential(
nn.Linear(in_count, 32),
nn.ReLU(),
nn.Linear(32, 1)
)
def forward(self, x):
out = self.layers(x)
return out
< /code>
num_epochs = 1
kfold = KFold(n_splits=5, shuffle=True, random_state=42)
tot_rmse = 0.0
for fold, (train_ids, test_ids) in enumerate(kfold.split(cv_dataset)):
print(f'FOLD {fold+1}')
train_subsampler = torch.utils.data.SubsetRandomSampler(train_ids)
test_subsampler = torch.utils.data.SubsetRandomSampler(test_ids)
train_loader = DataLoader(cv_dataset, batch_size=5, sampler=train_subsampler)
test_loader = DataLoader(cv_dataset, batch_size=5, sampler=test_subsampler)
# initialize model
model = NetModel(X_train_t.shape[1])
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.0001)
for epoch in range(num_epochs):
current_loss = 0.0
model.train()
for i, data in enumerate(train_loader, 0):
inputs, targets = data
targets = targets.reshape((targets.shape[0], 1))
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
fold_rmse = 0.0
model.eval()
with torch.no_grad():
for i, data in enumerate(test_loader, 0):
inputs, targets = data
targets = targets.reshape((targets.shape[0], 1))
outputs = model(inputs)
rmse = root_mean_squared_error(targets, outputs)
# accumulate rmse of the fold
fold_rmse += rmse
print(f"Sum of fold {fold+1} RMSE: {fold_rmse:.3f} | Count batches: {i+1}")
# calculate average of the fold rmse (accumulated rmse / number of batches)
tot_rmse += fold_rmse/(i+1)
print("--------------------------------------------------")
print(f"Avg. RMSE: {tot_rmse/5}")
< /code>
This is the output of the above:
FOLD 1
Sum of fold 1 RMSE: 2124.690 | Count batches: 89
--------------------------------------------------
FOLD 2
Sum of fold 2 RMSE: 1817.517 | Count batches: 89
--------------------------------------------------
FOLD 3
Sum of fold 3 RMSE: 2160.074 | Count batches: 89
--------------------------------------------------
FOLD 4
Sum of fold 4 RMSE: 1613.786 | Count batches: 89
--------------------------------------------------
FOLD 5
Sum of fold 5 RMSE: 1713.522 | Count batches: 89
--------------------------------------------------
Avg. RMSE: 21.190088516406796
< /code>
Thank you!
Подробнее здесь: https://stackoverflow.com/questions/796 ... th-pytorch
Перекрестная проверка с Pytorch ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
K-кратная перекрестная проверка с использованием DataLoaders в PyTorch
Anonymous » » в форуме Python - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-