- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在尝试训练简单的 MLP 时遇到了一个问题。
我基本上试图让一个网络将机器人 ARM 末端执行器的 XYZ 位置和 RPY 方向(6 维输入)映射到机器人 ARM 每个关节到达该位置的角度( 6维输出),所以这是一个回归问题。
我使用角度计算当前位置生成了一个数据集,并生成了包含 5k、500k 和 500M 组值的数据集。
我的问题是我正在使用的 MLP 根本没有学到任何东西。使用 Tensorboard(我使用的是 Keras),我意识到无论我尝试什么,第一层的输出始终为零(参见图 1)。
基本上,我的输入是形状 (6,) 向量,输出也是形状 (6,) 向量。
这是我迄今为止尝试过的方法,但没有成功:
此外,我在 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 -= mean
std = x_train.std(axis=0)
x_train /= std
x_test -= mean
x_test /= std
x_val -= mean
x_val /= std
n_epochs = 100
n_hidden_layers=2
n_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,) 向量,其中输出[i] = 输入[i]²并且网络没有学到任何东西。我还测试了一个随机数据集,其中输入是随机数,输出是输入的线性函数,并且损失很快收敛到 0。简而言之,简单的架构似乎无法映射非线性函数。
最佳答案
the output of my very first layer is always zero.
这通常意味着网络根本“看不到”输入中的任何模式,这导致它始终预测整个训练集上目标的平均值,而不管输入如何。您的输出在 -𝜋 到 𝜋 范围内,预期值可能为 0,因此它会检查出来。
我的猜测是模型太小,无法有效地表示数据。我建议您将模型中的参数数量增加 10 或 100 倍,看看它是否开始看到一些东西。限制参数数量对网络具有正则化作用,强正则化通常会导致上述的derping趋于均值。
我绝不是机器人专家,但我猜想在很多情况下,输出参数的微小调整都会导致输入发生较大变化。假设我正在尝试用左手挠背 - 我的手向左移动得越远,任务就变得越困难,因此在某些时候我可能想要换手,这是一种不连续的配置更改。当然,这是一个不好的类比,但我希望它能证明我的预感,即配置空间中的某些地方,小的目标更改会导致大的配置更改。
如此大的变化将导致这些点周围出现非常大、非常嘈杂的梯度。我不确定网络在这些噪声梯度上的工作效果如何,但我建议作为一个实验,您尝试将训练数据集限制为一组在 ARM 的配置空间中相互平滑连接的输出,如果有道理的话。更进一步,您应该从数据集中删除靠近此类配置边界的任何点。为了在推理时弥补这一点,您可能想要对几个附近的点进行采样,并选择最常见的预测作为最终结果。希望其中一些点能够落在平稳的配置区域中。
此外,在每个密集层之前添加批量归一化将有助于平滑梯度并提供更可靠的训练。
至于其余的超参数:
关于tensorflow - 第一层 MLP 输出在一个 epoch 后为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58924277/
我想使用简单的 MLP 模型进行迁移学习。首先,我在大数据上训练 1 个隐藏层前馈网络: net = Sequential() net.add(Dense(500, input_dim=2048, k
最近我正在使用 Tensorflow。我正在探索如何在 Tensorflow 中实现多层感知器。 我在网上学习了很多教程。他们中的大多数使用一两个隐藏层。一个简单的例子取自 here def forw
我对机器学习非常陌生,正在尝试实现 MLP,但是成本函数似乎在达到全局最小值之前就达到了局部最小值。我将成本绘制为迭代函数(包括 0 值,以免被 y 轴的起始位置所迷惑)。 这是我尝试使用的代码: i
以下是我的 MLP 模型, layers = [10,20,30,40,50] model = keras.models.Sequential() #Stacking Layers model.add
我是机器学习的新手,我正在开发一个 python 应用程序,该应用程序使用数据集对扑克牌进行分类,我将发布片段。似乎效果不太好。它无法正确对手进行分类。我收到以下错误 ", line 298, in
我有这样的数据 有 29 列,我必须预测其中的 winPlacePerc(数据帧的最末端)在 1 之间(高百分比)到 0(低百分比) 在 29 列中,25 是数字 数据 3 是 ID(对象) 1 是
您好,我正在尝试修改 mnist 示例以使其与我的数据集相匹配。我只尝试使用 mlp 示例,但它给出了一个奇怪的错误。 数据集是一个有 2100 行和 17 列的矩阵,输出应该是 16 个可能的类别之
我在 Dlib 中创建了一个多层感知器网络: mlp::kernel_1a_c net(2,5); 输入层有 2 个节点,第一个隐藏层有 5 个节点。该网络是否已经包含偏置节点?还是必须自己添加? 最
我正在 matlab 中制作一个具有反向传播的 MLP 神经网络。问题是,它似乎无法很好地处理函数中的曲线,也无法很好地与值进行缩放。例如,它可以达到 cos(x) 的 80%,但如果我输入 100*
我是 OpenCV 世界和神经网络的新手,但我有一些 C++/Java 编码经验。 我创建了我的第一个 ANN MLP 并学习了 XOR: #include #include #include
给定输入特征,仅原始数字: tensor([0.2153, 0.2190, 0.0685, 0.2127, 0.2145, 0.1260, 0.1480, 0.1483, 0.1489,
我正在尝试使用简单的时间序列预测。给定数量的输入(1 分钟滴答) Net 应该尝试预测下一个。我用不同的设置训练了 3 个网络来说明我的问题: 在右侧,您可以看到 3 个训练器 MLP - 随机命名和
我正在运行 MLP 将一组值分为 10 个不同的类别。 简单来说,我有一个声纳,它可以提供 400 个物体的“读数”。每个读数都是 1000 个浮点值的列表。 我已扫描了总共 100 个对象,想要对它
我正在创建一个简单的神经网络,其中有一个隐藏层用于分类。 我的输入数据集已准备好并保存在 .t7 文件中。 input = { data : DoubleTensor - size: 1400x1
我设置了以下参数: parameter_space = { 'hidden_layer_sizes': [(sp_randint.rvs(100,600,1),sp_randint.rvs(1
我正在使用机器学习制作一个国际象棋引擎,但在调试它时遇到了问题。我需要帮助找出我的程序出了什么问题,如果有任何帮助,我将不胜感激。 我进行了研究,并从多个成功的项目中借鉴了想法。这个想法是使用强化学习
我正在学习机器学习,我看到一些 Material 表明MLP(多层感知器)可能会陷入局部最小值。我想通过做一些实验来学习,但我在网上搜索了具体的例子,但找不到任何例子。谁能告诉我在哪里可以找到可以由我
我(有点像初学者)在时间序列数据应用程序上尝试使用 Keras,我创建了一个回归模型,然后将其保存以在不同的 Python 脚本上运行。 我正在处理的时间序列数据是每小时数据,我使用 Keras 中保
我尝试使用 keras(支持 tensorflow )创建一个神经网络。我有 4 个输入变量和 2 个输出变量:不可用 我想对不可用的测试集进行预测。 这是我的代码: from keras impor
我使用 theano 编写了一个 MLP 分类器。使用反向传播算法的训练函数如下: self.weights=[theano.shared(numpy.random.random((network.a
我是一名优秀的程序员,十分优秀!