我正在尝试训练一个神经网络来进行机器人手臂的逆运动学计算,机器人手臂具有预定义的段长度。我没有将段长度包含在神经网络的输入中,而是通过训练数据来处理。训练数据是一个pandas数据框架,包含手臂的空间映射,标签是手臂三个段的旋转角度,特征是最后一段末端将到达的x和y坐标的解。
我使用Keras和Theano作为后端。
model = Sequential([Dense(3, input_shape=(2,), activation="relu"),Dense(3, activation="relu"),Dense(3)])model.summary()model.compile(Adam(lr=0.001), loss='mean_squared_error', metrics=['accuracy'])model.fit(samples, labels, validation_split=0.2, batch_size=1000, epochs=10,shuffle=True, verbose=1)score = model.evaluate(samples, labels, batch_size=32, verbose=1)print('Test score:', score[0])print('Test accuracy:', score[1])weights = model.get_weights()predictions = model.predict(samples, verbose=1)print predictionsmodel.save("IK_NN_7-4-3_keras.h5")OUTPUT===============================================================Train on 6272736 samples, validate on 1568184 samplesEpoch 1/10 - 5s - loss: 10198.7558 - acc: 0.9409 - val_loss: 12149.1703 - val_acc: 0.9858Epoch 2/10 - 5s - loss: 4272.9105 - acc: 0.9932 - val_loss: 12117.0527 - val_acc: 0.9858Epoch 3/10 - 5s - loss: 4272.7862 - acc: 0.9932 - val_loss: 12113.3804 - val_acc: 0.9858Epoch 4/10 - 5s - loss: 4272.7567 - acc: 0.9932 - val_loss: 12050.8211 - val_acc: 0.9858Epoch 5/10 - 5s - loss: 4272.7271 - acc: 0.9932 - val_loss: 12036.5538 - val_acc: 0.9858Epoch 6/10 - 5s - loss: 4272.7350 - acc: 0.9932 - val_loss: 12103.8665 - val_acc: 0.9858Epoch 7/10 - 5s - loss: 4272.7553 - acc: 0.9932 - val_loss: 12175.0442 - val_acc: 0.9858Epoch 8/10 - 5s - loss: 4272.7282 - acc: 0.9932 - val_loss: 12161.4815 - val_acc: 0.9858Epoch 9/10 - 5s - loss: 4272.7213 - acc: 0.9932 - val_loss: 12101.4021 - val_acc: 0.9858Epoch 10/10 - 5s - loss: 4272.7909 - acc: 0.9932 - val_loss: 12152.4966 - val_acc: 0.9858Test score: 5848.549130022683Test accuracy: 0.9917127071823204[[ 59.452095 159.26912 258.94424 ] [ 59.382706 159.41936 259.25183 ] [ 59.72419 159.69777 259.48584 ] ... [ 59.58721 159.33467 258.9603 ] [ 59.51745 159.69331 259.62595 ] [ 59.984367 160.5533 260.7689 ]]
测试准确率和验证准确率看起来都不错,但它们并不完全反映实际情况。预测结果应该看起来像这样:
[[ 0 0 0][ 0 0 1][ 0 0 2]...[358 358 359][358 359 359][359 359 359]]
因为我反馈了相同的特征,期望得到相同的标签。但不知为何,我得到了这些数字:
[[ 59.452095 159.26912 258.94424 ] [ 59.382706 159.41936 259.25183 ] [ 59.72419 159.69777 259.48584 ] ... [ 59.58721 159.33467 258.9603 ] [ 59.51745 159.69331 259.62595 ] [ 59.984367 160.5533 260.7689 ]]
感谢您的时间。
回答:
首先,您使用的度量是准确率,而您预测的是连续值。虽然您得到了预测结果,但它们没有任何意义。您的问题是回归问题,而您使用的度量是针对分类问题的。您可以只使用“MSE”、“R²”或其他回归度量。
from keras import metricsmodel.compile(loss='mse', optimizer='adam', metrics=[metrics.mean_squared_error, metrics.mean_absolute_error])
此外,您应该考虑增加神经元的数量,如果您的输入数据真的只有两个维度,可以考虑一些浅层模型,而不是人工神经网络(例如使用高斯核的SVM)。