带有 EarlyStopping 和 Dropout 的 TensorFlow 回归导致欠拟合

莱纳斯

ML 新手,我想知道我遗漏了什么或做错了什么。

我试图弄清楚为什么我的数据在应用提前停止和辍学时欠拟合,但是当我不使用提前停止或辍学时,拟合似乎没问题......

我正在使用的数据集:https ://www.kaggle.com/datasets/kanths028/usa-housing

模型参数:数据集有 5 个要训练的特征,目标是我任意选择 4 层的价格 Epochs 为 600(太多了),因为我想测试提前停止优化器和损失,因为这些似乎让我得到最一致的结果与 SKLearns LinearRegression 相比(MAE 约为 81K)

数据预处理:

X = df[df.columns[:-2]].values
y = df['Price'].values

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=42)
scaler = MinMaxScaler()

X_train = scaler.fit_transform(X_train)

X_test = scaler.transform(X_test)

合身看起来不错:

model = Sequential()

model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(5, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mae')

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600)

在此处输入图像描述

结合 earlystopping 和 dropout,数据看起来不合适:

model = Sequential()

model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))

early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25)

model.compile(optimizer='adam', loss='mae')

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping])

在此处输入图像描述

我试图弄清楚为什么当结果如此遥远时提前停止会停止。我猜这个模型会一直持续到 600 个 epoch 结束,但是提前停止会在 300 左右拔掉插头。

我可能做错了什么,但我无法弄清楚,所以任何见解都会受到赞赏。先感谢您 :)

金泰仁

它定义了性能度量并指定是最大化还是最小化它。

然后 Keras 在适当的时期停止训练。指定verbose=1时,可以在keras中停止训练时在屏幕上输出。

es = EarlyStopping(monitor='val_loss', mode='min')

由于性能没有提高,因此立即停止可能无效。耐心定义了允许不提高性能的 epoch 的次数。参与度是一个相当主观的标准。可以根据使用的数据的设计和使用的模型来改变最佳值。

es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=50)

当训练被模型选择提前停止对象停止时,状态通常会比之前的模型有更高的验证错误。因此,可以控制提前停止,使模型的验证误差不再通过在某个时间点停止模型的训练来降低,但停止状态不会是最好的模型。因此,需要存储验证性能最好的模型,为此,keras 中存在名为 Model Checkpoint 的对象。此对象监控验证错误,如果验证性能优于前一个 epoch,则此时无条件存储参数。通过这个,当训练停止时,可以返回具有最高验证性能的模型。

from keras.callbacks import ModelCheckpoint

mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True) 

在回调参数中,允许存储最佳模型。

hist = model.fit(train_x, train_y, nb_epoch=10,
      batch_size=10, verbose=2, validation_split=0.2,                   
      callbacks=[early_stopping, mc])  

在您的情况下,耐心 25 表示当参考值连续提高不超过 25 次时是否结束。

from keras.callbacks import ModelCheckpoint

model = Sequential()

model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1))

early_stopping = EarlyStopping(monitor='val_loss', mode='min', patience=25, verbose=1)

mc = ModelCheckpoint ('best_model.h5', monitor='val_loss', mode='min', save_best_only=True) 

model.compile(optimizer='adam', loss='mae')

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=600, callbacks=[early_stopping, mc])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

tensorflow:tf.nn.dropout和tf.layers.dropout有什么区别

Tensorflow:tf.nn.dropout和tf.contrib.rnn.DropoutWrapper有什么区别?

带有 dropout 和/或批量归一化的 PyTorch 训练

PyTorch 中带有 dropout 正则化的逻辑回归

“ Dropout”,“ Monte-Carlo Dropout”和“ Channel-wise Dropout”之间有什么区别?

Tensorflow:了解是否有Dropout包装器的LSTM输出

任何keras层中的dropout层和dropout参数之间有什么区别

在带有 Tensorflow 后端的 Keras 上,在输入的不同部分并行拟合 LSTM 和一些密集层

CNN中的ReLu和Dropout

Keras 和 tensorflow 的串联和拟合误差

模型可以同时具有高偏差和高方差吗?过拟合和欠拟合?

Keras回调EarlyStopping比较培训和验证损失

为什么在Tensorflow中定义带有上下文管理器和不带有上下文管理器的tf.Session会导致不同的行为?

Python:带有 CSV 和 Tensorflow 的 ValueError(CSV 行具有不同数量的字段)

Keras中的GaussianDropout,Dropout和GaussianNoise

Sklearn - 带有 StandardScaler、PolynomialFeatures 和回归的管道

Tensorflow Dropout:如果我应用两个 dropout 层会发生什么?

'EarlyStopping'对象没有属性'on_train_batch_begin'

带有 Keras 和 Tensorflow 的“循环”神经网络的设计考虑

将带有数据和标签的txt文件读入tensorflow

TensorFlow变量和带有字符串的tf.assign()

带有和不带有默认参数声明的调用函数会导致不同的结果?

为什么在tensorflow的tf.nn.dropout中缩放输入?

使用TensorFlow 2将Dropout添加到MobileNet

带有OpenMP的MxCalloc和MxFree导致双重释放或损坏

带有MPMediaPlayer和Podcast的MPMediaItemPropertyTitle导致致命错误

带有 NativeScript 的 Tensorflow lite

扩展`$`带有`*`和`@`

带有 IF 和 OR 的 DAX