我编写了一个LSTM回归模型.它是最后一个LSTM层的BATCH_SIZE=1和RETURN_Sequence=True的模型.我还设置了VERIFICATION_DATA和耐心进行培训.但似乎存在一些问题.

以下是我的代码.我也有一些基本的问题.

# Import the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import TimeDistributed
from keras import optimizers
from keras.callbacks import EarlyStopping

# x and y are numpy array with shape (1,251,1)
x_test = x[:,-84:,:] # use the last 84 data as test data
y_test = y[:,-84:,:]
x_val = x[:,-36-84:-84,:] # the number of validation data is 36
y_val = y[:,-36-84:-84,:]
x = x[:,:-36-84,:] # x and y are training data
y = y[:,:-36-84,:]
# the first 36 data are not used to calculate the loss,
# set a numpy array for sample_weight used in Model.fit
sw = (np.arange(251) >= 36).astype('float64')
sw = np.reshape(sw, (1, sw.shape[0]))
sw = sw[:,:-36-84]

regressor = Sequential()
# an LSTM model of 3 layers
for k in range(3):
  if k == 0:
    regressor.add(LSTM(units = 200, return_sequences = True, input_shape = (None, 1)))
  else:
    regressor.add(LSTM(units = 200, return_sequences = True))
  regressor.add(Dropout(0.2))

regressor.add(TimeDistributed(Dense(units = 1)))

opt1 = optimizers.Adam(learning_rate=0.005,global_clipnorm=0.3)
regressor.compile(optimizer = opt1, loss = 'mean_squared_error')

callback = EarlyStopping(monitor='val_loss', patience=200, restore_best_weights=True)
history = regressor.fit(x, y, epochs = 10000, batch_size = x.shape[0], sample_weight=sw,
              validation_data=(x_val, y_val), callbacks=[callback])

我有以下问题

  1. 设置SAMPLE_WEIGHT是否正确,以便模型在前36个时间步长内不会输出?还有别的办法吗?

  2. 我为第一个LSTM层设置INPUT_Shape=(None,1)是否正确?因为训练数据和验证数据具有不同的时间步长.

  3. 我的输出层正确吗?每个TimeStep都有一个输出.

  4. VAL_LOSS的计算是否包括辍学层?

  5. 计算完成后,计算验证数据的均方根,并将其与最小Val_Loss进行比较.值​​​​分别为0.00047和0.0010,因此我的代码中存在错误.

非常感谢.

训练数据和验证数据不被视为单个序列.

推荐答案

关于问题2、3和4,我试着给你一些答案和考虑:

  1. 第一个LSTM级别的输入形状:如果希望模型处理可变长度序列,则为第一个级别LSTM设置INPUT_Shape=(NONE,1)是正确的.无尺寸允许模型接受不同长度的输入序列.当数据包含可变长度的序列时,这尤其有用.

  2. 回归的输出层: 您的输出层使用TimeDistributed(密集(单位=1)),适用于每个TimeStep有一个输出的回归任务.这种配置确保了模型可以为序列中的每个时间步长生成预测.

  3. 退学和验证: 我不确定我是否理解了你的意思,但辍学程度并不影响损失的计算,最多是受一些连接丢失的事实的影响.在推断过程中,通常会关闭丢弃级别,因此它们不应影响验证损失计算.在训练期间(FIT方法),通过随机移除一些单元来应用丢弃以防止过度匹配,但在验证或测试期间,丢弃被关闭.

进一步的考虑:200的耐心值可能有点高.虽然等于1的批次略少,但典型的值是8、16、32、64、128.

Python相关问答推荐

使用Python和PRNG(不是梅森龙卷风)有效地生成伪随机浮点数在[0,1)中均匀?

Python -Polars库中的滚动索引?

将numpy数组存储在原始二进制文件中

通过优化空间在Python中的饼图中添加标签

如何在msgraph.GraphServiceClient上进行身份验证?

Django管理面板显示字段最大长度而不是字段名称

根据不同列的值在收件箱中移动数据

' osmnx.shortest_track '返回有效源 node 和目标 node 的'无'

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

如何使regex代码只适用于空的目标单元格

LocaleError:模块keras._' tf_keras. keras没有属性__internal_'''

matplotlib图中的复杂箭头形状

在pandas/python中计数嵌套类别

ConversationalRetrivalChain引发键错误

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

如何在Python中使用Iscolc迭代器实现观察者模式?

在numpy数组中寻找楼梯状 struct

如何将泛型类类型与函数返回类型结合使用?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

SpaCy:Regex模式在基于规则的匹配器中不起作用