Проблемы с пониманием вывода LSTM. - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть два набора данных, которые содержат последовательность чисел.Один из них - мой X, а другой - Y.

Например,

X:
1 0 7 2
4 8 2 0
5 9 2 1
.
.
.

Shape of X is: (10000, 4)

Y:
10 24 5 15
7  6  10 4
13 22 6  2
.
.
.
Shape of Y is: (10000, 4)

Значения в X находятся в диапазоне 0-10, в то время как значения в Y находятся вдиапазон 0-24.

Я использую реализацию LSTM в Keras для обучения X и Y. Поскольку модель LSTM требует, чтобы вход был трехмерным, я предварительно обработал данные и изменил X на (10000, 4, 10) и Y на(10000, 4, 24).

После предварительной обработки в однократном кодировании (это фактические данные, которые, например, не соответствуют используемому):

X:
[[[1 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 1 0 ... 0 0 0]
  [1 0 0 ... 0 0 0]]

 [[0 0 1 ... 0 0 0]
  [0 0 0 ... 0 1 0]
  [1 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]
  [0 0 0 ... 0 0 0]]

 ...

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 1 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [1 0 0 ... 0 0 0]
  [1 0 0 ... 0 0 0]
  [0 1 0 ... 0 0 0]]]



Y:
[[[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]
  [0 0 0 ... 0 0 0]]

 ...

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 1 0 0]]

 [[0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]
  [0 0 0 ... 0 0 0]]]

Этокод для моей модели LSTM:

    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 1)
    model = Sequential()
    model.add(LSTM(output_dim = 24, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
    model.add(LSTM(output_dim = 24, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
    model.add(LSTM(output_dim = 24, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
    model.add(LSTM(output_dim = 24, input_shape = X_train.shape[1:], return_sequences = True, init = 'glorot_normal', inner_init = 'glorot_normal', activation = 'sigmoid'))
    model.compile(loss = 'categorical_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
    model.fit(X_train, Y_train, nb_epoch = 500, validation_data = (X_test, Y_test))
    model.save('LSTM500.h5')

    predictions = model.predict(X_test)
    predictions = np.array(predictions, dtype = np.float64)
    predictions = predictions.reshape(2000, 4, 24)

Вывод:

[[[[0.1552688  0.15805855 0.2013046  ... 0.16005482 0.19403476
    0.        ]
   [0.0458279  0.09995601 0.06456595 ... 0.09573169 0.07952237
    0.        ]
   [0.19871283 0.19968285 0.06270849 ... 0.14653654 0.18313469
    0.        ]
   [0.08407309 0.091876   0.09707277 ... 0.12661831 0.12858406
    0.        ]]

  [[0.15482235 0.14433247 0.18260191 ... 0.15641384 0.20746264
    0.        ]
   [0.03096719 0.05375536 0.05373315 ... 0.05018555 0.07592873
    0.        ]
   [0.20420487 0.17884348 0.13145864 ... 0.17901334 0.19768076
    0.        ]
   [0.03465272 0.06732351 0.02182322 ... 0.06144218 0.07827628
    0.        ]]

  [[0.15116604 0.15068266 0.18474537 ... 0.17088319 0.15841168
    0.        ]
   [0.09633015 0.11277901 0.10069521 ... 0.09309217 0.11326427
    0.        ]
   [0.17512578 0.13187788 0.10418645 ... 0.10735759 0.10635827
    0.        ]
   [0.13673681 0.12714103 0.06212005 ... 0.03213149 0.14153068
    0.        ]]

  ...

Форма прогноза: (1, 2000, 4, 24)

Я изменил формумассив прогнозирования до (2000, 4, 24).

[[[0.1552688  0.15805855 0.2013046  ... 0.16005482 0.19403476 0.        ]
  [0.0458279  0.09995601 0.06456595 ... 0.09573169 0.07952237 0.        ]
  [0.19871283 0.19968285 0.06270849 ... 0.14653654 0.18313469 0.        ]
  [0.08407309 0.091876   0.09707277 ... 0.12661831 0.12858406 0.        ]]

 [[0.15482235 0.14433247 0.18260191 ... 0.15641384 0.20746264 0.        ]
  [0.03096719 0.05375536 0.05373315 ... 0.05018555 0.07592873 0.        ]
  [0.20420487 0.17884348 0.13145864 ... 0.17901334 0.19768076 0.        ]
  [0.03465272 0.06732351 0.02182322 ... 0.06144218 0.07827628 0.        ]]

 [[0.15116604 0.15068266 0.18474537 ... 0.17088319 0.15841168 0.        ]
  [0.09633015 0.11277901 0.10069521 ... 0.09309217 0.11326427 0.        ]
  [0.17512578 0.13187788 0.10418645 ... 0.10735759 0.10635827 0.        ]
  [0.13673681 0.12714103 0.06212005 ... 0.03213149 0.14153068 0.        ]]

 ...

Кажется, я не понимаю, какой вывод получил.Что это за цифры?Разве массив предсказаний не должен содержать значения только в 0 и 1 (таким образом, я могу получить фактическое значение) так же, как Y_test?Спасибо.

1 Ответ

0 голосов
/ 28 ноября 2018

Эти числа являются числами, которые вы получили с вашего последнего слоя, который является сигмовидным слоем, сигмоид будет возвращать значения в диапазоне от 0 до 1, что мы и видим в вашем выводе.

Как интерпретировать эти значения?

Так как вы подаете и ищете горячие выходы, вы можете выбрать максимальное число на последней оси и получить значение индекса на этой оси с помощью np.argmax(prediction, axis = -1), это должно дать вам массив с формой (2000, 4), каждый элемент - это число между [0,24), формат которого совпадает с исходными данными.Эти значения - то, что ваша модель LSTM предсказывает как наиболее вероятный результат.

Второе по величине число будет вторым наиболее вероятным результатом.

...