我尝试实现提前停止功能以避免我的神经网络模型过度拟合。我很确定逻辑是正确的,但由于某种原因,它不起作用。我希望当验证损失大于某些时期的训练损失时,早期停止函数返回 True。但它始终返回 False,即使验证损失变得比训练损失大得多。请问您能看出问题出在哪里吗?
def early_stopping(train_loss, validation_loss, min_delta, tolerance):
counter = 0
if (validation_loss - train_loss) > min_delta:
counter +=1
if counter >= tolerance:
return True
Run Code Online (Sandbox Code Playgroud)
for i in range(epochs):
print(f"Epoch {i+1}")
epoch_train_loss, pred = train_one_epoch(model, train_dataloader, loss_func, optimiser, device)
train_loss.append(epoch_train_loss)
# validation
with torch.no_grad():
epoch_validate_loss = validate_one_epoch(model, validate_dataloader, loss_func, device)
validation_loss.append(epoch_validate_loss)
# early stopping
if early_stopping(epoch_train_loss, epoch_validate_loss, min_delta=10, tolerance = 20):
print("We are at epoch:", i)
break
Run Code Online (Sandbox Code Playgroud)
编辑2:
def train_validate (model, train_dataloader, validate_dataloader, loss_func, optimiser, device, epochs): …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用rmsle作为评估指标在 Python 中训练 lightgbm ML 模型,但当我尝试包含提前停止时遇到问题。
这是我的代码:
import numpy as np
import pandas as pd
import lightgbm as lgb
from sklearn.model_selection import train_test_split
df_train = pd.read_csv('train_data.csv')
X_train = df_train.drop('target', axis=1)
y_train = np.log(df_train['target'])
sample_params = {
'boosting_type': 'gbdt',
'objective': 'regression',
'random_state': 42,
'metric': 'rmsle',
'lambda_l1': 5,
'lambda_l2': 5,
'num_leaves': 5,
'bagging_freq': 5,
'max_depth': 5,
'max_bin': 5,
'min_child_samples': 5,
'feature_fraction': 0.5,
'bagging_fraction': 0.5,
'learning_rate': 0.1,
}
X_train_tr, X_train_val, y_train_tr, y_train_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)
def train_lightgbm(X_train_tr, y_train_tr, X_train_val, y_train_val, …Run Code Online (Sandbox Code Playgroud) python machine-learning non-linear-regression lightgbm early-stopping
#include "util.h"
#include <cmath>
double celsius(double t)
{
double C = (t-32) * 5/9;
C = round(C);
return C;
}
double fahrenheit(double t)
{
double F = t * 9/5 + 32;
F = round(F);
return F;
}
double round(double num)
{
double rounded = round(num);
return rounded;
}
int main()
{
double temp = readDouble("Please enter a temperature: ");
string type = readLine("Enter C to convert to Celsius or F to convert to Fahrenheit: ");
if(type == "C")
{ …Run Code Online (Sandbox Code Playgroud)