用神经网络预测圆的半径

时间:2020-06-28 14:46:41

标签: python numpy tensorflow machine-learning neural-network

我正在生成一个圆形的均匀分布的数据点,其中每个圆的半径也被均匀地生成。这些圈子看起来像这样:

[![在此处输入图片描述] [1]] [1]

均匀分布的半径如下:

[![在此处输入图片描述] [2]] [2]

我在本练习中的目标是仅通过输入数据点的x,y坐标来用NN预测这些圆的半径。 (为此,我正在使用其半径和数据点生成1000个圆)

但是在以下架构下尝试使用此方法:

model = Sequential()

model.add(Flatten(input_shape=(X.shape[1],2)))
model.add(Dense(128, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1))
model.compile('adam', 'mse', metrics=['accuracy'])
model.summary()

我得到这些结果:

model.predict(X_test)[:10]

array([[1.0524317],
       [0.9874419],
       [1.1739452],
       [1.0584671],
       [1.035887 ],
       [1.1663618],
       [1.1536952],
       [0.7245674],
       [1.0469185],
       [1.328696 ]], dtype=float32)

Y_test[:10]

array([[1.34369499],
       [0.9539995 ],
       [1.73399686],
       [1.56665937],
       [0.40627674],
       [1.73467557],
       [0.87950118],
       [1.13395495],
       [0.51870017],
       [1.28441215]])

[![在此处输入图片描述] [3]] [3]

如您所见,预测半径时结果非常糟糕。

我在这里想念什么?还是神经网络不是执行此任务的最佳方法?

[编辑]

现在,我尝试了10万个圆及其相应的半径:

[![在此处输入图片描述] [4]] [4]

该图显示了针对半径预测的实数值。训练样本越多,预测效果就越好,但是对于这样一个简单的任务,y = x周围仍然存在较大的分散。

2 个答案:

答案 0 :(得分:0)

我认为您的结果看起来还不错。在损失与时期的关系图中,您会看到模型只是在记忆/指纹训练数据。只要您不显着提高TD,就会发生这种情况。

在经典特征工程方法中,通常将训练数据的中心定为平均点。之后,您将数据点按xy递减的顺序排序。通过这种预处理,任务确实很简单。

相反,您也可以尝试以下过程。然后,使用1维卷积层作为输入,再次沿x轴和y轴对点进行排序。希望模型能够学习半径的概念。

答案 1 :(得分:0)

我有一些建议,因为您似乎过头了:

  1. 由于您正在执行回归任务,因此将“准确性”度量标准替换为“ mse”将有助于评估您的情况,因为“准确性”在分类问题中使用较多。
  2. 并非总是培训的最后一个时期会取得最佳效果。这就是为什么有回调函数的原因。在训练期间,可以检查最佳训练权重,然后在和中使用它们。检查以下内容:https://keras.io/api/callbacks/。在您的情况下,我建议您使用ModelCheckpoint来仅保存最佳权重,并使用EarlyStopping来在您的验证分数没有任何改善时停止训练。
  3. 检查模型是否具有高方差或高偏差始终是一件好事。良好参考:https://towardsdatascience.com/understanding-the-bias-variance-tradeoff-165e6942b229在这种情况下,您可以使用正则化项来防止输出出现较大差异。检查以下内容:https://keras.io/api/layers/regularizers/ 由于它将惩罚应用于复杂模型,因此将在简单性和有效性之间进行权衡。

这不是可以做的所有事情,但我相信这些要点将有很大帮助。