Я новичок в PyTorch и хочу эффективно оценить F1 среди других во время моего обучения и моего цикла валидации.
До сих пор мой подход заключался в том, чтобы вычислить прогнозы на GPU, затем передать их в CPU и добавитьих в вектор для обучения и проверки.После Обучения и Валидации я оценил бы обе эпохи, используя sklearn.Однако, профилируя мой код, он показал, что загрузка в процессор является узким местом.
for epoch in range(n_epochs):
model.train()
avg_loss = 0
avg_val_loss = 0
train_pred = np.array([])
val_pred = np.array([])
# Training loop (transpose X_batch to fit pretrained (features, samples) style)
for X_batch, y_batch in train_loader:
scores = model(X_batch)
y_pred = F.softmax(scores, dim=1)
train_pred = np.append(train_pred, self.get_vector(y_pred.detach().cpu().numpy()))
loss = loss_fn(scores, self.get_vector(y_batch))
optimizer.zero_grad()
loss.backward()
optimizer.step()
avg_loss += loss.item() / len(train_loader)
model.eval()
# Validation loop
for X_batch, y_batch in val_loader:
with torch.no_grad():
scores = model(X_batch)
y_pred = F.softmax(scores, dim=1)
val_pred = np.append(val_pred, self.get_vector(y_pred.detach().cpu().numpy()))
loss = loss_fn(scores, self.get_vector(y_batch))
avg_val_loss += loss.item() / len(val_loader)
# Model Checkpoint for best validation f1
val_f1 = self.calculate_metrics(train_targets[val_index], val_pred, f1_only=True)
if val_f1 > best_val_f1:
prev_best_val_f1 = best_val_f1
best_val_f1 = val_f1
torch.save(model.state_dict(), self.PATHS['xlm'])
evaluated_epoch = epoch
# Calc the metrics
self.save_metrics(train_targets[train_index], train_pred, avg_loss, 'train')
self.save_metrics(train_targets[val_index], val_pred, avg_val_loss, 'val')
Я уверен, что есть более эффективный способ а) сохранять прогнозы без необходимости выдвигать их для обработки каждого пакета.б) рассчитать показатели на GPU напрямую?
Поскольку я новичок в PyTorch, я очень благодарен за любые советы и отзывы:)