Keras中LSTM的第一层中input形状的确定

Keras中的Sequential 顺序模型中输入数据结构的讨论

在LSTM序列模型搭建时,使用Sequential 顺序模型中的model.add.(LSTM())是较为简单的一种方式。
比如下面的一个实例:

from keras.models import Sequential
from keras.layers import Dense,Dropout
from keras.layers import LSTM, Activation

# 搭建一个 LSTM 多分类过程
# 将输入转化成为[sample, time steps, feature]
trainX = np.reshape(X, (X.shape[0],1, X.shape[1]))        #化为三维
model = Sequential()
model.add(LSTM(50, return_sequences=True, 
               input_shape=(trainX.shape[1],trainX.shape[2])))
model.add(Dropout(0.3))
model.add(LSTM(40,return_sequences=True))  
model.add(Dropout(0.3))
model.add(LSTM(30,return_sequences=False))  
model.add(Dropout(0.3))
model.add(Dense(k2))
model.add(Activation('tanh'))
model.compile(loss='categorical_crossentropy',  # 模型解译
              optimizer='rmsprop',
              metrics=['accuracy'])

但是遇到一个比较奇怪的问题,就是在LSTM中的第一层中,input_shape的确定。

input_shape=[sample, timesteps, feature]

基本所有的文章中都规定 训练的 X 的形状为 [sample, time steps, feature],按照我的理解:
sample:也就是训练样本的数量
time steps和feature 表示一次训练中 X 的形状。其中,
time steps:表X的长度
feature:表X的维度
比如,我有一组单维时间序列,想用序列S的前m个预测后n个,

#  确定LSTM网络的结构。m个输入,n个输出
def get_LSTM_XY(S,m,n):
    L=len(S)
    X=np.empty((L-(m+n)+1,m))
    Y=np.empty((L-(m+n)+1,n))
    for i in np.arange(L-(m+n)+1):
        X[i]=S[i:m+i].reshape(m,)
        Y[i]=S[m+i:m+n+i].reshape(n,)
    return X,Y

利用上述代码获得训练集上X和Y后,需对X进行维度的转化,这时问题来了。

trainX1 = np.reshape(X, (X.shape[0],X.shape[1]1))        #化为三维
trainX2 = np.reshape(X, (X.shape[0],1, X.shape[1]))        #化为三维

trainX1是按照标准的格式进行转化的,但模型训练时特别慢,
将X的形状按照trainX2转换后,模型训练的速度和精度都可以接受,但这时模型的输入与大家常规的定义存在出入。
请问大家是否遇到过类似的问题?
tensorflow的版本时1.2.1

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Keras是一个神经网络库,可以用于快速创建、调试、训练和部署深度学习模型。LSTM是一种常见的循环神经网络,它可以处理时间序列或序列数据的预测问题。多LSTM是指将多个LSTM堆叠在一起以增加模型的深度和复杂性。 在Keras,可以使用LSTM()函数创建一个LSTM,并使用add()函数将多个LSTM顺序添加到模型。对于每一,可以指定该的输出维度、输入形状和其他超参数。例如,下面是一个创建含有两个LSTM的模型的示例: ``` from keras.models import Sequential from keras.layers import LSTM, Dense model = Sequential() model.add(LSTM(units=64, input_shape=(timesteps, features), return_sequences=True)) model.add(LSTM(units=32, return_sequences=False)) model.add(Dense(units=1, activation='sigmoid')) ``` 在这个例子,我们指定了一个含有两个LSTM的模型。第一个LSTM的输出维度是64,输入形状是(timesteps,features),其timesteps是时间步长,features是每个时间步的特征数。这个LSTM将返回一个包含序列的输出,因此我们将return_sequences参数设置为True。第二个LSTM的输出维度是32,它将接收第一个LSTM的输出作为输入,并返回一个单个输出。最后,我们通过一个单一的Dense将输出压缩到一个标量值,使用sigmoid激活函数将其转换为一个0到1之间的概率值。 在训练模型之前,我们还需要指定模型的损失函数、优化器和评估指标。例如: ``` model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 这个模型使用二元交叉熵作为损失函数,Adam优化器进行优化,并使用精度作为评估指标。一旦完成编译,我们可以使用fit()函数来训练模型。例如: ``` model.fit(x_train, y_train, batch_size=64, epochs=10, validation_data=(x_val, y_val)) ``` 这个模型将使用大小为64的批次在训练集上进行10次迭代,同时使用验证集进行验证。训练完成后,我们可以使用evaluate()函数在测试集上评估模型的性能,例如: ``` score = model.evaluate(x_test, y_test) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 这将打印测试集的损失和精度,用于评估模型的性能。在建立LSTM模型时,需要注意合适的超参数选择以及训练时应防止单独训练每个LSTM导致梯度消失或爆炸的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzy路灯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值