Перекрестная проверка с PytorchPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Перекрестная проверка с Pytorch

Сообщение Anonymous »

Я пытаюсь реализовать перекрестную проверку с помощью 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»