第一层MLP输出在第一个周期后为零

最近我在尝试训练一个简单的MLP时遇到了问题。

我基本上是在尝试训练一个网络,将机器人手臂末端执行器的XYZ位置和RPY方向(6维输入)映射到机器人手臂达到该位置的每个关节的角度(6维输出),所以这是一个回归问题。

我使用角度计算当前位置生成了数据集,并生成了包含5k、500k和500M组值的数据集。

我的问题是,我使用的MLP完全没有学习。使用Tensorboard(我使用的是Keras),我发现我的第一层输出总是零(见图1),无论我尝试什么方法都是如此。

基本上,我的输入是一个形状为(6,)的向量,输出也是一个形状为(6,)的向量。

到目前为止,我尝试过以下方法,但都没有成功:

  • 尝试了具有2层大小为12、24的MLP;2层大小为48、48的MLP;4层大小为12、24、24、48的MLP。
  • 使用了Adam、SGD、RMSprop优化器
  • 学习率从0.15到0.001不等,有和没有衰减
  • 使用均方误差(MSE)和平均绝对误差(MAE)作为损失函数
  • 对输入数据进行标准化处理,以及不进行标准化处理(前三个值在-3到+3之间,最后三个值在-pi到pi之间)
  • 批次大小为1、10、32
  • 测试了所有三个数据集的MLP,分别为5k值、500k值和5M值的数据集
  • 测试了从10到1000不等的周期数
  • 测试了多个偏置和核的初始化器
  • 测试了顺序模型和Keras功能API(以确保问题不是模型调用方式)
  • 对隐藏层使用了sigmoid、relu和tanh激活函数(最后一层是线性激活,因为这是回归问题)

此外,我在Keras的基本波士顿房价回归数据集上尝试了相同的MLP架构,网络确实学到了东西,这让我相信我的数据可能存在某种问题。然而,我完全不知道问题出在哪里,因为系统在当前状态下完全没有学习,损失函数从第一个周期开始就停滞不前。

任何帮助或线索都将不胜感激,如果需要,我很乐意提供代码或数据!

谢谢

编辑:这是我使用的数据5k样本的链接。B-G列是输出(用于生成位置/方向的角度),H-M列是输入(XYZ位置和RPY方向)。 https://drive.google.com/file/d/18tQJBQg95ISpxF9T3v156JAWRBJYzeiG/view

另外,这里是我使用的代码片段:

df = pd.read_csv('kinova_jaco_data_5k.csv', names = ['state0',                                                      'state1',                                                      'state2',                                                      'state3',                                                      'state4',                                                      'state5',                                                      'pose0',                                                      'pose1',                                                      'pose2',                                                      'pose3',                                                      'pose4',                                                      'pose5'])states = np.asarray(    [df.state0.to_numpy(), df.state1.to_numpy(), df.state2.to_numpy(), df.state3.to_numpy(), df.state4.to_numpy(),     df.state5.to_numpy()]).transpose()poses = np.asarray(    [df.pose0.to_numpy(), df.pose1.to_numpy(), df.pose2.to_numpy(), df.pose3.to_numpy(), df.pose4.to_numpy(),     df.pose5.to_numpy()]).transpose()x_train_temp, x_test, y_train_temp, y_test = train_test_split(poses, states, test_size=0.2)x_train, x_val, y_train, y_val = train_test_split(x_train_temp, y_train_temp, test_size=0.2)mean = x_train.mean(axis=0)x_train -= meanstd = x_train.std(axis=0)x_train /= stdx_test -= meanx_test /= stdx_val -= meanx_val /= stdn_epochs = 100n_hidden_layers=2n_units=[48, 48]inputs = Input(shape=(6,), dtype= 'float32', name = 'input')x = Dense(units=n_units[0], activation=relu, name='dense1')(inputs)for i in range(1, n_hidden_layers):    x = Dense(units=n_units[i], activation=activation, name='dense'+str(i+1))(x)out = Dense(units=6, activation='linear', name='output_layer')(x)model = Model(inputs=inputs, outputs=out)optimizer = SGD(lr=0.1, momentum=0.4)model.compile(optimizer=optimizer, loss='mse', metrics=['mse', 'mae'])history = model.fit(x_train,                    y_train,                    epochs=n_epochs,                    verbose=1,                    validation_data=(x_test, y_test),                    batch_size=32)

编辑2我测试了一个随机数据集,其中输入是一个(6,)向量,input[i]是一个随机数,输出是一个(6,)向量,output[i] = input[i]²,网络没有学到任何东西。我还测试了一个随机数据集,其中输入是一个随机数,输出是输入的线性函数,损失很快收敛到0。简而言之,似乎简单架构无法映射非线性函数。

图1


回答:

最后,我用Conv1D层替换了第一个密集层,现在网络似乎学得还不错。它对我的数据过拟合了,但这是我可以接受的范围。

我暂时关闭这个线程,我会花些时间调整架构。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注