Tensorflow 我的训练数据集对我的神经网络来说太复杂了吗?

Tensorflow 我的训练数据集对我的神经网络来说太复杂了吗?,tensorflow,machine-learning,keras,data-science,Tensorflow,Machine Learning,Keras,Data Science,我不熟悉机器学习和堆栈溢出,我正在尝试从我的回归模型中解释两个图 我的情况与这家伙相似,但我的MSE和RMSE非常高 我的模特不合身吗?如果是,我可以做什么来解决这个问题 这是我用来解决回归问题的神经网络 def build_model(): model = keras.Sequential([ layers.Dense(128, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]), layers.De

我不熟悉机器学习和堆栈溢出,我正在尝试从我的回归模型中解释两个图

我的情况与这家伙相似,但我的MSE和RMSE非常高

我的模特不合身吗?如果是,我可以做什么来解决这个问题

这是我用来解决回归问题的神经网络

def build_model():
model = keras.Sequential([
    layers.Dense(128, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]),
    layers.Dense(64, activation=tf.nn.relu),
    layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)

model.compile(loss='mean_squared_error',
              optimizer=optimizer,
              metrics=['mean_absolute_error', 'mean_squared_error'])
return model
还有我的数据集
我有500个样本,10个功能和1个目标,正好相反:看起来你的模型太合适了。当您的训练集的错误率较低时,这意味着您的模型已从数据中很好地学习,并且可以准确地推断结果。但是,如果您的验证数据较高,则意味着从培训数据中获取的信息未成功应用于新数据。这是因为您的模型太“适合”您的培训数据,并且只学会了如何根据该数据进行预测

为了解决这个问题,我们可以引入减少过度拟合。一种非常常见的技术是使用退出层。这将随机删除一些节点,这样模型就不会与它们有太大的关联,从而减少对这些节点的依赖,并更多地使用其他节点进行“学习”。我已经包括了一个例子,你可以在下面测试;尝试运用价值观和其他技巧,看看什么最有效。作为旁注:您确定在密集层中需要这么多节点吗?对于您的数据集来说,这似乎是一个很大的问题,这也可能导致过度拟合

def build_model():
model = keras.Sequential([
layers.Dense(128, activation=tf.nn.relu, input_shape=[len(train_dataset.keys())]),
Dropout(0.2),
layers.Dense(64, activation=tf.nn.relu),
layers.Dense(1)
])
optimizer = tf.keras.optimizers.RMSprop(0.001)

model.compile(loss='mean_squared_error',
          optimizer=optimizer,
          metrics=['mean_absolute_error', 'mean_squared_error'])
return model

正如@Omoshiroii在现有答案中提到的,实际上,您的模型似乎过拟合,这就是RMSE和MSE过高的原因。您的模型了解了训练数据中的细节和噪声,以至于现在对新数据上的模型性能产生了负面影响。因此,解决方案是随机删除一些节点,这样模型就不会与它们关联太多。

我认为您的模型拟合过度

有几种方法可以帮助您:

1-通过删除层或减少隐藏层中的元素数量来降低网络容量

2-退出层,将通过将某些功能设置为零随机删除它们

3-正则化

如果我想简单解释一下:

-减少网络容量:

一些模型具有大量可训练参数。这个数字越高,模型就越容易记住每个训练样本的目标类。显然,这不适合推广新数据。通过降低网络容量,它将了解重要的模式或将损失降至最低的模式。但请记住,过度降低网络容量会导致不适

-正规化:

这一页可以帮助你很多

-脱落层

你可以使用像这样的图层

model.add(layers.Dropout(0.5))
这是一个退出层,有50%的机会将输入设置为零

有关更多详细信息,请参见本页:


您是否有机会将功能正常化?在安装完全连接的网络时,您应该首先使用一个密度低至2的单层,并使用softmax。这是一个简单的逻辑回归。如果后续的更复杂的模型不是更好的,那么您的数据可能只是“简单”的,您无法学到更多。如果后续更复杂的模型更糟糕,那可能不是模型的错,而是你的错。更好地设计模型。请注意,MNIST上的逻辑回归,因此它是一个很好的分类基线模型,基本上是最简单的分类参数模型。@alift是的,我尝试过规范化和标准化特征。我也尝试过为目标而做,但没有太多的改进。@scott我不确定你的意思,我没有建立一个分类模型来解决逻辑回归问题。我正在建立一个回归模型来解决线性/非线性回归问题。谢谢你们两个的帮助