【问题标题】:LSTM not learning, no MSELSTM 不学习,没有 MSE
【发布时间】:2021-01-13 06:23:30
【问题描述】:

您好,我无法为我的 LTSM 模型找到正确的输入形状。我一直在努力寻找合适的形状,但无法理解需要什么。

我认为问题在于 ytest 和 ytrain 形状。为什么和xtrain和xtest的形状不一样?

xtrain (80304, 37)
xtest (39538, 37)
ytrain (80304,)
ytest (39538,)
Epoch 1/3
2510/2510 [==============================] - 34s 13ms/step - loss: nan
Epoch 2/3
2510/2510 [==============================] - 32s 13ms/step - loss: nan
Epoch 3/3
2510/2510 [==============================] - 33s 13ms/step - loss: nan
Model: "sequential_9"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_10 (LSTM)               (None, 4)                 96        
_________________________________________________________________
dense_9 (Dense)              (None, 1)                 5         
=================================================================
Total params: 101
Trainable params: 101
Non-trainable params: 0

模型不是基于MSE训练的:

当我尝试拟合这个模型时:

print('tf version', tf.version.VERSION)

train_size = int(len(oral_ds) * 0.67)
print(train_size)
test_size = len(oral_ds) - train_size
print(test_size)
train = oral_ds[:train_size]
test = oral_ds[80319:119881]

print(len(train), len(test))

X_train = train.drop(columns=['PRICE','WEEK_END_DATE','Optimized rev','Original rev'])
y_train = train.PRICE

X_test = test.drop(columns=['PRICE','WEEK_END_DATE','Optimized rev','Original rev'])
y_test = test.PRICE

print('xtrain',np.shape(X_train))
print('xtest',np.shape(X_test))
print('ytrain',np.shape(y_train))
print('ytest',np.shape(y_test))


X_train=X_train.values.reshape(X_train.shape[0],X_train.shape[1],1)
#y_train=y_train.values.reshape(y_train.shape[0],y_train.shape[1],1)
X_test=X_test.values.reshape(X_test.shape[0],X_test.shape[1],1)
#y_test=y_test.values.reshape(y_test.shape[0],y_test.shape[1],1)

#print('reshaped xtrain',np.shape(X_train))
#print('reshaped xtest',np.shape(X_test))
#print('reshaped ytrain',np.shape(y_train))
#print('reshaped ytest',np.shape(y_test))


single_step_model = tf.keras.models.Sequential()
single_step_model.add(tf.keras.layers.LSTM(4,
                                            input_shape=(37,1)))
single_step_model.add(tf.keras.layers.Dense(units = 1))
single_step_model.compile(optimizer = 'adam', loss = 'mean_squared_error')



BATCH_SIZE=32
train_data = tf.data.Dataset.from_tensor_slices((X_train, y_train))
train_data = train_data.cache().shuffle(10000).batch(BATCH_SIZE)
valid_data = tf.data.Dataset.from_tensor_slices((X_test, y_test))

history = single_step_model.fit(train_data, epochs=3)
single_step_model.summary()

我已尝试实施其他帖子中的解决方案,例如:

但这些都不起作用。

有什么指导吗?

【问题讨论】:

  • 点击此链接解决您的问题。这里解释的很清楚。 stackoverflow.com/a/54416792/12598386
  • 谢谢 Tamang,我已经尝试过了,但它似乎不起作用。我已更新我的代码以显示相同的错误消息

标签: python tensorflow machine-learning keras lstm


【解决方案1】:

所以通常 LSTM 需要 3 个维度的输入:

 (#batch_size, #number_of_features, #timesteps) 

特征和时间步长索引根据平台而变化。我猜你有 37 个时间步长和 1 个特征,所以只需将输入更改为:

 (#batch_size,37,1) or (#batch_size,1,37)

请看下面的虚拟示例:

import tensorflow as tf
inputs = tf.random.normal([100, 37, 1])
lstm = tf.keras.layers.LSTM(units =50 ,input_shape=(37,1))
output = lstm(inputs)
>>print(output.shape)
(100, 50)

以下代码是端到端工作的:

X_train = np.random.rand(80319,37,1)
y_train = np.random.randint(0,1,80319)
BATCH_SIZE=32
train_data = tf.data.Dataset.from_tensor_slices((X_train, y_train))
train_data = train_data.cache().shuffle(10000).batch(BATCH_SIZE)

    
single_step_model = tf.keras.models.Sequential()
single_step_model.add(tf.keras.layers.LSTM(4,
                                            input_shape=(37,1)))
single_step_model.add(tf.keras.layers.Dense(units = 1))

single_step_model.compile(optimizer = 'adam', loss = 'mean_squared_error')
single_step_model.fit(train_data, epochs=10)

如果您删除批量大小选择,则会引发完全相同的错误。

【讨论】:

  • 谢谢 Berkay,我已经尝试过了,但仍然收到错误消息。要清楚我已经尝试过:regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (1000, 1,37)) regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (1000, 37,1)) regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (1,37)) regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (37,1)) @ 987654325@
  • 请添加您的模型摘要和 tensorflow 版本
  • tf 版本 = 2.2,有问题的模型摘要已更新。谢谢伯凯!
  • 对于前两个你不需要指定batchsize(我假设1000是你的batch size)。对于最后两个,如果你正确地争论你的输入,它应该可以实际工作。
  • 我仍然收到相同的错误消息。我不应该重塑 y 数据是否正确?我也不确定你所说的争吵是什么意思。你的意思是我没有正确拆分数据?
猜你喜欢
  • 2021-01-14
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2016-02-25
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多