Модель Кераса с высокой точностью, но плохими прогнозами - PullRequest
0 голосов
/ 04 января 2019

Я пытаюсь обучить нейронную сеть для выполнения расчетов по обратной кинематике для манипулятора с предварительно определенной длиной сегмента.Я не включаю длины сегментов во входные данные нейронной сети, а скорее через данные обучения.Обучающие данные - это кадр данных 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 predictions
model.save("IK_NN_7-4-3_keras.h5")

OUTPUT===============================================================


Train on 6272736 samples, validate on 1568184 samples
Epoch 1/10
 - 5s - loss: 10198.7558 - acc: 0.9409 - val_loss: 12149.1703 - val_acc: 0.9858
Epoch 2/10
 - 5s - loss: 4272.9105 - acc: 0.9932 - val_loss: 12117.0527 - val_acc: 0.9858
Epoch 3/10
 - 5s - loss: 4272.7862 - acc: 0.9932 - val_loss: 12113.3804 - val_acc: 0.9858
Epoch 4/10
 - 5s - loss: 4272.7567 - acc: 0.9932 - val_loss: 12050.8211 - val_acc: 0.9858
Epoch 5/10
 - 5s - loss: 4272.7271 - acc: 0.9932 - val_loss: 12036.5538 - val_acc: 0.9858
Epoch 6/10
 - 5s - loss: 4272.7350 - acc: 0.9932 - val_loss: 12103.8665 - val_acc: 0.9858
Epoch 7/10
 - 5s - loss: 4272.7553 - acc: 0.9932 - val_loss: 12175.0442 - val_acc: 0.9858
Epoch 8/10
 - 5s - loss: 4272.7282 - acc: 0.9932 - val_loss: 12161.4815 - val_acc: 0.9858
Epoch 9/10
 - 5s - loss: 4272.7213 - acc: 0.9932 - val_loss: 12101.4021 - val_acc: 0.9858
Epoch 10/10
 - 5s - loss: 4272.7909 - acc: 0.9932 - val_loss: 12152.4966 - val_acc: 0.9858
Test score: 5848.549130022683
Test 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  ]]

Спасибо за ваше время.

1 Ответ

0 голосов
/ 04 января 2019

Прежде всего, ваш показатель - это точность, и вы прогнозируете непрерывные значения.Вы получаете прогнозы, но они не имеют никакого смысла.Ваша проблема - это регрессия, а ваша метрика предназначена для классификации.Вы можете просто использовать «MSE» «R²» или другие регрессионные метрики

from keras import metrics
model.compile(loss='mse', optimizer='adam', metrics=[metrics.mean_squared_error, metrics.mean_absolute_error])

Кроме того, вам следует рассмотреть возможность увеличения числа нейронов, и если ваши входные данные на самом деле имеют только 2 измерения, подумайте о некоторых мелких моделях, а неИНС.(Например, SVM с ядром Гаусса)

...