【问题标题】:Recurrent neural network using different time steps with keras使用 keras 的不同时间步长的循环神经网络
【发布时间】:2018-09-13 16:14:26
【问题描述】:

我使用 keras 构建 RNN,但是当我想将时间步长更改为不同大小时,我得到一个错误,我无法完成它 这是我的虚拟数据示例

from numpy import array
import numpy as np

import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
from sklearn.preprocessing import MinMaxScaler
from keras import optimizers


X=array(
    [
        [#first sample
            [0,2],[1,2],[2,2]    # three time steps and 2 features
        ]
        ,
        [# sample 2
            [0,2],[1,2],[2,2]    # three time steps and 2 features
        ]
        ,
        [# sample 3
            [7,2], [9,2], [4,2]  # three time steps and 2 features
        ]
        ,
        [# sample 4
            [2,2], [5,2], [4,2],[7,9]  # four steps and 2 features
        ]
    ]
)


Y=np.array([1,2,3,4])


model = Sequential()
model.add(LSTM(8, input_shape=(None, 2),return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(32,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128,return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(58, activation='softmax'))
optimize=optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
model.compile(optimize,loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()

model.fit(X,Y,batch_size=1,epochs=50,shuffle=True,verbose=2)

从代码中可以看出,我有 4 个序列和每个序列中的 2 个特征。 在最后一个序列中,我有 4 个时间步而不是 3 个,如果我将其更改为 3 个时间步,代码就可以正常工作,这就是问题所在, 但我希望它在不同的时间步骤上工作,如何在不使用填充或遮罩的情况下实现这一目标。

我确实阅读了描述不同解决方案的不同主题,但我无法在上面的示例中使用它

当我尝试运行上面的代码时出现错误

ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (4, 1)

【问题讨论】:

    标签: python tensorflow keras lstm recurrent-neural-network


    【解决方案1】:

    您的X 不是有效数组。一个 numpy 数组必须是矩形而不是锯齿状的。 Keras 只能将有效的 numpy 数组作为输入。你有两个选择:

    1. 一次将样品送入您的模型 1 样品中。 IE。使用 1 的 batch_size,使用 fit_on_batchfit_generator 而不仅仅是 fit。请注意,这将删除所有与矢量化相关的速度优化,并且如果您有大量数据,则会减慢您的训练速度。
    2. 填充您的训练集,使它们都具有相同的时间维度。 0-padding 不应该真正影响模型的性能。这是推荐的方法。

    请参阅this 线程了解更多详情。

    【讨论】:

    • 感谢您的出色回答。如果我使用 fit_on_batch 而不是填充训练集,它应该给出更好的结果吗?即使需要很多时间?还是不?
    • @osama 通常填充训练集是首选方法,它应该不会对您的模型准确性产生太大影响。
    • 与零填充一起,使用Masking 层,以便真正忽略零keras.io/layers/core/#masking
    猜你喜欢
    • 2018-04-24
    • 2016-03-06
    • 2017-02-19
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多