掩蔽和直觉的 LSTM 回归问题(keras)
LSTM Regression issues with masking and intuition (keras)
我正在使用这个架构(一个用于不同轨迹长度的掩蔽层,用 0 填充到最大长度轨迹,然后是一个带有密集层的 LSTM,之后输出 2 个值)来构建一个预测 2 个值的回归器在轨道上。
samples, timesteps, features = x_train.shape[0], x_train.shape[1], x_train.shape[2]
model = Sequential()
model.add(tf.keras.layers.Masking(mask_value=0., input_shape=(timesteps, features), name="mask"))
model.add(LSTM(30, return_sequences=True, name="lstm1"))
model.add(LSTM(30, return_sequences=False, name="lstm2"))
model.add(Dense(20, activation='relu', name="dense1"))
model.add(Dense(20, activation='relu', name="dense2"))
model.add(Dense(2, activation='linear', name="output"))
model.compile(optimizer="adam", loss="mse")
培训:
model.fit(x_train, y_train, epochs = 10, batch_size = 32)
我的输入数据的形状:
x_train (269, 527, 11) (269 trajectories of 527 timesteps of 11 features)
y_train (269, 2) (these 269 trajectories have 2 target values)
x_test (30, 527, 11) (--- same ---)
y_test (30, 2) (--- same ---)
我已经对我的数据进行了预处理,因此我的所有序列都具有固定长度,而较小的序列在缺少的时间步长处用 0 填充。
因此,我使用掩蔽层来跳过这些时间步长,因为它们不提供任何信息。
正如预期的那样,输出的形状为:
(30, 2)
但仔细观察它似乎回归了相同的值。
[[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48257 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.7025465 ]
[42.243515 0.6581909 ]
[37.48258 0.70254654]
[37.48257 0.70254654]
[37.48258 0.70254654]
[37.48261 0.7025462 ]
[37.48257 0.7025466 ]
[37.482582 0.70254654]
[37.482567 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.482567 0.7025465 ]
[37.48261 0.7025462 ]
[37.482574 0.7025466 ]
[37.48261 0.7025462 ]
[37.48261 0.70254624]
[37.48258 0.70254654]
[37.48261 0.7025462 ]]
而我的目标值 (y_test) 是这样的:
[[70. 0.6]
[40. 0.6]
[ 6. 0.6]
[94. 0.7]
[50. 0.6]
[60. 0.6]
[16. 0.6]
[76. 0.9]
[92. 0.6]
[32. 0.8]
[22. 0.7]
[70. 0.7]
[36. 1. ]
[64. 0.7]
[ 0. 0.9]
[82. 0.9]
[38. 0.6]
[54. 0.8]
[28. 0.8]
[62. 0.7]
[12. 0.6]
[72. 0.8]
[66. 0.8]
[ 2. 1. ]
[98. 1. ]
[20. 0.8]
[82. 1. ]
[38. 1. ]
[68. 0.6]
[62. 1. ]]
这就像将整个数据集视为 1 个数据点。
有经验的人能在这里找到任何明显的错误吗?
感谢任何形式的帮助!
当权重随机时,它们会混乱地参与具体的输入计算,而我们总是得到几乎相同的输出。
你训练模型了吗?看起来不像,训练前考虑简单的 MNIST 求解器输出:
[-2.39 -2.54 -2.23 -2.24 -2.29 -2.37 -2.39 -2.10 -2.34 -2.20]
[-2.28 -2.43 -2.25 -2.33 -2.28 -2.42 -2.26 -2.19 -2.37 -2.25]
[-2.43 -2.44 -2.25 -2.33 -2.33 -2.37 -2.30 -2.10 -2.37 -2.17]
[-2.33 -2.43 -2.28 -2.27 -2.34 -2.34 -2.28 -2.16 -2.37 -2.26]
及之后:
[-31.72 -31.65 -25.43 -20.04 -29.68 -0.00 -22.74 -25.88 -16.28 -13.30] (5)
[-12.44 -29.92 -21.19 -25.86 -22.53 -12.01 -0.00 -22.61 -18.88 -23.54] (6)
[-23.86 -25.77 -11.88 -9.18 -19.51 -20.85 -28.71 -0.00 -22.11 -14.57] (7)
[-33.67 -23.45 -17.82 -0.00 -28.89 -14.20 -32.54 -14.45 -11.13 -15.40] (3)
UPD:因此提供了培训,但未完成其目标。好吧,很多事情都可以成为一个原因。除了技术问题,神经网络的任务可能过于复杂,例如,如果目标函数无法通过逐步改进来学习。
检查数据路径,尝试简化任务,找到一些示例解决方案,解决关闭问题,检查并返工。
我正在使用这个架构(一个用于不同轨迹长度的掩蔽层,用 0 填充到最大长度轨迹,然后是一个带有密集层的 LSTM,之后输出 2 个值)来构建一个预测 2 个值的回归器在轨道上。
samples, timesteps, features = x_train.shape[0], x_train.shape[1], x_train.shape[2]
model = Sequential()
model.add(tf.keras.layers.Masking(mask_value=0., input_shape=(timesteps, features), name="mask"))
model.add(LSTM(30, return_sequences=True, name="lstm1"))
model.add(LSTM(30, return_sequences=False, name="lstm2"))
model.add(Dense(20, activation='relu', name="dense1"))
model.add(Dense(20, activation='relu', name="dense2"))
model.add(Dense(2, activation='linear', name="output"))
model.compile(optimizer="adam", loss="mse")
培训:
model.fit(x_train, y_train, epochs = 10, batch_size = 32)
我的输入数据的形状:
x_train (269, 527, 11) (269 trajectories of 527 timesteps of 11 features)
y_train (269, 2) (these 269 trajectories have 2 target values)
x_test (30, 527, 11) (--- same ---)
y_test (30, 2) (--- same ---)
我已经对我的数据进行了预处理,因此我的所有序列都具有固定长度,而较小的序列在缺少的时间步长处用 0 填充。 因此,我使用掩蔽层来跳过这些时间步长,因为它们不提供任何信息。
正如预期的那样,输出的形状为:
(30, 2)
但仔细观察它似乎回归了相同的值。
[[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48257 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.7025465 ]
[42.243515 0.6581909 ]
[37.48258 0.70254654]
[37.48257 0.70254654]
[37.48258 0.70254654]
[37.48261 0.7025462 ]
[37.48257 0.7025466 ]
[37.482582 0.70254654]
[37.482567 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48257 0.7025466 ]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.48258 0.70254654]
[37.482567 0.7025465 ]
[37.48261 0.7025462 ]
[37.482574 0.7025466 ]
[37.48261 0.7025462 ]
[37.48261 0.70254624]
[37.48258 0.70254654]
[37.48261 0.7025462 ]]
而我的目标值 (y_test) 是这样的:
[[70. 0.6]
[40. 0.6]
[ 6. 0.6]
[94. 0.7]
[50. 0.6]
[60. 0.6]
[16. 0.6]
[76. 0.9]
[92. 0.6]
[32. 0.8]
[22. 0.7]
[70. 0.7]
[36. 1. ]
[64. 0.7]
[ 0. 0.9]
[82. 0.9]
[38. 0.6]
[54. 0.8]
[28. 0.8]
[62. 0.7]
[12. 0.6]
[72. 0.8]
[66. 0.8]
[ 2. 1. ]
[98. 1. ]
[20. 0.8]
[82. 1. ]
[38. 1. ]
[68. 0.6]
[62. 1. ]]
这就像将整个数据集视为 1 个数据点。 有经验的人能在这里找到任何明显的错误吗?
感谢任何形式的帮助!
当权重随机时,它们会混乱地参与具体的输入计算,而我们总是得到几乎相同的输出。 你训练模型了吗?看起来不像,训练前考虑简单的 MNIST 求解器输出:
[-2.39 -2.54 -2.23 -2.24 -2.29 -2.37 -2.39 -2.10 -2.34 -2.20]
[-2.28 -2.43 -2.25 -2.33 -2.28 -2.42 -2.26 -2.19 -2.37 -2.25]
[-2.43 -2.44 -2.25 -2.33 -2.33 -2.37 -2.30 -2.10 -2.37 -2.17]
[-2.33 -2.43 -2.28 -2.27 -2.34 -2.34 -2.28 -2.16 -2.37 -2.26]
及之后:
[-31.72 -31.65 -25.43 -20.04 -29.68 -0.00 -22.74 -25.88 -16.28 -13.30] (5)
[-12.44 -29.92 -21.19 -25.86 -22.53 -12.01 -0.00 -22.61 -18.88 -23.54] (6)
[-23.86 -25.77 -11.88 -9.18 -19.51 -20.85 -28.71 -0.00 -22.11 -14.57] (7)
[-33.67 -23.45 -17.82 -0.00 -28.89 -14.20 -32.54 -14.45 -11.13 -15.40] (3)
UPD:因此提供了培训,但未完成其目标。好吧,很多事情都可以成为一个原因。除了技术问题,神经网络的任务可能过于复杂,例如,如果目标函数无法通过逐步改进来学习。
检查数据路径,尝试简化任务,找到一些示例解决方案,解决关闭问题,检查并返工。