【发布时间】:2020-03-27 21:52:53
【问题描述】:
我正在使用神经网络进行回归。这对 NN 来说应该是一项简单的任务,我有 10 个特征和 1 个输出要预测。我在项目中使用 pytorch,但我的模型学习不好。损失从一个非常高的值(40000)开始,然后在前 5-10 个时期之后,损失迅速下降到 6000-7000,然后不管我做什么,它都卡在那里。我什至尝试更改为 skorch 而不是 pytorch,以便我可以使用交叉验证功能,但这也无济于事。我尝试了不同的优化器并向网络添加层和神经元,但这并没有帮助,它停留在 6000,这是一个非常高的损失值。我在这里做回归,我有 10 个特征,我试图预测一个连续值。这应该很容易做到,这就是为什么它让我更加困惑。
这是我的网络: 我在这里尝试了从制作更复杂的架构(例如添加层和单元到批量标准化、更改激活等)的所有可能性。没有任何效果
class BearingNetwork(nn.Module):
def __init__(self, n_features=X.shape[1], n_out=1):
super().__init__()
self.model = nn.Sequential(
nn.Linear(n_features, 512),
nn.BatchNorm1d(512),
nn.LeakyReLU(),
nn.Linear(512, 64),
nn.BatchNorm1d(64),
nn.LeakyReLU(),
nn.Linear(64, n_out),
# nn.LeakyReLU(),
# nn.Linear(256, 128),
# nn.LeakyReLU(),
# nn.Linear(128, 64),
# nn.LeakyReLU(),
# nn.Linear(64, n_out)
)
def forward(self, x):
out = self.model(x)
return out
这是我的设置: 使用 skorch 比 pytorch 更容易。在这里,我还监控 R2 指标,并将 RMSE 作为自定义指标来监控模型的性能。我还为 Adam 尝试了 amsgrad,但这并没有帮助。
R2 = EpochScoring(r2_score, lower_is_better=False, name='R2')
explained_var_score = EpochScoring(EVS, lower_is_better=False, name='EVS Metric')
custom_score = make_scorer(RMSE)
rmse = EpochScoring(custom_score, lower_is_better=True, name='rmse')
bearing_nn = NeuralNetRegressor(
BearingNetwork,
criterion=nn.MSELoss,
optimizer=optim.Adam,
optimizer__amsgrad=True,
max_epochs=5000,
batch_size=128,
lr=0.001,
train_split=skorch.dataset.CVSplit(10),
callbacks=[R2, explained_var_score, rmse, Checkpoint(), EarlyStopping(patience=100)],
device=device
)
我还将输入值标准化。
我的输入具有以下形状:
torch.Size([39006, 10])
输出的形状是:
torch.Size([39006, 1])
我使用 128 作为我的 Batch_size,但我也尝试了其他值,如 32、64、512 甚至 1024。虽然标准化输出不是必需的,但我也尝试过,当我预测值时它不起作用,损失很高。请有人帮助我,我将不胜感激每一个有用的建议。我还将添加我的训练和验证损失以及 epoch 上的指标的屏幕截图,以可视化损失在前 5 个 epoch 中是如何减少的,然后它永远保持在 6000 的值,这是一个非常高的损失值。
【问题讨论】:
-
您可以尝试添加一个
nn.BatchNorm1d层作为模型的第一层吗?这种变化对训练过程有什么影响吗? -
@Shai 谢谢你的建议,我试过了,但没用
-
您是否尝试过在单个示例上过度拟合您的模型并查看它是否有效(即您的损失为 0 或关闭)?
-
@ZaccharieRamzi 你说的单个例子是什么意思?如果您的意思是单一功能,是的,我这样做了,但没有用。损失一直停留在高值
-
不不,只是对 10 个特征的一次观察,基本上你的
x的大小是(1, 10)。通过这种方式,您可以查看您的模型是否甚至能够过度拟合单个示例。如果它不能做到这一点,它就不太可能预测更多。
标签: neural-network deep-learning regression pytorch skorch