难以理解 LSTM 输出。
Trouble understanding LSTM output.
我有两个包含数字序列的数据集。其中一个是我的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的范围内。
我在 Keras 中使用 LSTM 实现来训练 X 和 Y。由于 LSTM 模型要求输入是 3 维的,所以我预处理了数据并将 X 更改为 (10000, 4, 10) 并将 Y 更改为 ( 10000, 4, 24).
预处理为one-hot编码后(这些是实际数据,并不代表示例中使用的数据):
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 一样吗?谢谢。
这些数字是你从最后一层得到的数字,这是一个 sigmoid 层,sigmoid 将 return 值介于 0 和 1 之间,这就是我们在你的输出中看到的。
如何解读这些值?
由于您正在提供并寻找单热输出,您可以 select 最后一个轴中的最大数字并使用 np.argmax(prediction, axis = -1)
在该轴上获取其索引值这应该会给你一个 numpy形状为 (2000,4) 的数组,每个元素都是 [0,24) 之间的数字,与原始数据的格式相同。这些值是您的 LSTM 模型预测的最可能结果。
第二大数字将是第二大可能的结果。
我有两个包含数字序列的数据集。其中一个是我的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的范围内。
我在 Keras 中使用 LSTM 实现来训练 X 和 Y。由于 LSTM 模型要求输入是 3 维的,所以我预处理了数据并将 X 更改为 (10000, 4, 10) 并将 Y 更改为 ( 10000, 4, 24).
预处理为one-hot编码后(这些是实际数据,并不代表示例中使用的数据):
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 一样吗?谢谢。
这些数字是你从最后一层得到的数字,这是一个 sigmoid 层,sigmoid 将 return 值介于 0 和 1 之间,这就是我们在你的输出中看到的。
如何解读这些值?
由于您正在提供并寻找单热输出,您可以 select 最后一个轴中的最大数字并使用 np.argmax(prediction, axis = -1)
在该轴上获取其索引值这应该会给你一个 numpy形状为 (2000,4) 的数组,每个元素都是 [0,24) 之间的数字,与原始数据的格式相同。这些值是您的 LSTM 模型预测的最可能结果。
第二大数字将是第二大可能的结果。