首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Keras的RNN多特征序列填充和掩蔽

基于Keras的RNN多特征序列填充和掩蔽
EN

Stack Overflow用户
提问于 2018-08-07 06:32:20
回答 1查看 3.3K关注 0票数 2

我已经使用Keras构建了LSTM体系结构,但我不确定复制时间步骤是否是处理可变序列长度的好方法。

我有一个多维数据集,具有多特征序列和不同的时间步长.这是一个多变量时间序列数据,包含多个训练样本,Y值为0或1。目前,我正在复制每个序列的最后一步,以确保timesteps = 3

如果有人能回答以下问题或关注,我很感激: 1.用零表示的特征值创建额外的时间步骤是否更合适?

  1. 什么是正确的方式来框架这个问题,垫序列,和掩码评估。
  2. 为了预测,我在Y变量中复制最后一个时间步骤,并且Y中的值1仅在最后一步出现,如果有的话。
代码语言:javascript
复制
# The input sequences are
trainX = np.array([
        [
            # Input features at timestep 1
            [1, 2, 3],
            # Input features at timestep 2
            [5, 2, 3] #<------ duplicate this to ensure compliance
        ],
        # Datapoint 2
        [
            # Features at timestep 1
            [1, 8, 9],
            # Features at timestep 2
            [9, 8, 9],
            # Features at timestep 3
            [7, 6, 1]
        ]
    ])

# The desired model outputs is as follows:
trainY = np.array([
        # Datapoint 1
        [
            # Target class at timestep 1
            [0],
            # Target class at timestep 2
            [1] #<---------- duplicate this to ensure compliance
        ],
        # Datapoint 2
        [
            # Target class at timestep 1
            [0],
            # Target class at timestep 2
            [0]
            # Target class at time step 3
            [0]
        ]
    ])

timesteps = 3
model = Sequential()
model.add(LSTM(3, kernel_initializer ='uniform', return_sequences=True, batch_input_shape=(None, timesteps, trainX.shape[2]), 
               kernel_constraint=maxnorm(3), name='LSTM'))
model.add(Dropout(0.2))
model.add(LSTM(3, return_sequences=True, kernel_constraint=maxnorm(3), name='LSTM-2'))
model.add(Flatten(name='Flatten'))
model.add(Dense(timesteps, activation='sigmoid', name='Dense'))
model.compile(loss="mse", optimizer="sgd", metrics=["mse"])
model.fit(trainX, trainY, epochs=2000, batch_size=2)
predY = model.predict(testX)
EN

回答 1

Stack Overflow用户

发布于 2018-08-07 06:57:54

在我看来,对你的问题有两种解决办法。(重复的时间步骤不是所有这些步骤):

  1. 结合使用序列层掩蔽层。这是常见的做法。现在,由于填充,每个示例具有相同的时间步骤数。这个方法的好处是,它很容易实现。此外,掩蔽层将给你一点性能提升。这种方法的缺点是:如果您在GPU上进行培训,那么CuDNNLSTM就是要走的一层,它是为gpu高度优化的,因此速度要快得多。但是它不适用于掩蔽层,如果您的数据集具有很高的时间步数,您将失去性能。
  2. 将您的时间步骤设置为None,并编写一个keras生成器,该生成器将按时间步骤对批进行分组(我认为您还必须使用functional ),现在您可以实现CuDNNLSTM,并且每个示例将只使用相关的时间步骤(而不是填充的时间步骤)来计算,这样效率要高得多。

如果你是新手,而绩效并不是很重要,那就选择1。如果你有一个生产环境,你经常需要培训网络,并且它与成本相关,那就试试备选方案2。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51720236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档