【问题标题】:Implementation of Stateful LSTM有状态 LSTM 的实现
【发布时间】:2017-02-21 18:11:40
【问题描述】:

我想创建一个有状态的 LSTM

我的数据是 68871 x 43,其中的特征在列中。 1-42 并在第 1 列中标注。 43

我用于数据分类的 keras LSTM 代码是

import numpy
import matplotlib.pyplot as plt
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM, Dropout
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
# convert an array of values into a dataset matrix
def create_dataset(dataset, look_back):
    dataX, dataY= [], []
    for i in range(len(dataset)-look_back-1):
        a = dataset[i:(i+look_back), 0:43]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 43])
    return numpy.array(dataX), numpy.array(dataY)
# fix random seed for reproducibility
#numpy.random.seed(7)
# load the dataset
look_back=5
dataset = numpy.loadtxt("Source.txt", delimiter=" ")
# normalize the dataset
scaler = MinMaxScaler(feature_range=(0, 1))
dataset[:,0:43] = scaler.fit_transform(dataset[:,0:43])
# split into train and test sets
train_size = int(len(dataset) * 0.67)
test_size = len(dataset) - train_size
train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:]
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)
print trainX.shape
#trainX=numpy.reshape(trainX,(46117,43,25))
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(10, input_dim=43))
#model.add(Dropout(0.3))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adagrad')
model.fit(trainX, trainY, nb_epoch=10, batch_size=5)
model.evaluate(testX, testY, batch_size=1)

请建议进行哪些更改以使 LSTM 有状态 提前非常感谢!!!!!

【问题讨论】:

    标签: machine-learning tensorflow deep-learning keras


    【解决方案1】:
    model.add(LSTM(10, input_shape=(5,43), stateful=True))
    

    我想这就是你要找的东西。见here for documentation

    另外,如果您想使用有状态的 lstm,那么对训练数据进行洗牌(这是默认设置)是没有意义的。因此也修改这一行:

    model.fit(trainX, trainY, nb_epoch=10, batch_size=5, shuffle=False)
    

    【讨论】:

    • 输入形状必须在 model.add() 中提供,我尝试了很多输入大小,但它会抛出错误。你能建议一些有效的输入尺寸吗?
    • print trainX.shape 有什么作用?
    • 它打印 (46137, 5, 43) : 46137 是编号。训练样本数 5 是 lstm 时间步长 43 是输入维数
    • 编辑了我的答案。如果我理解正确,您正在输入长度为 5 的序列,其中每个时间戳都是长度为 43 的一维张量。所以你的 lstm 的输入是形状 (5,43)。
    • 这回答了你的问题吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2021-09-04
    • 1970-01-01
    • 2016-11-09
    • 2017-09-28
    • 2018-04-04
    • 1970-01-01
    • 2021-07-02
    相关资源
    最近更新 更多