【问题标题】:How to use the LSTM model for multi-step LABEL forecast?如何使用LSTM模型进行多步LABEL预测?
【发布时间】:2022-11-22 00:10:21
【问题描述】:

How to use the LSTM model for multi-step forecasting? 在这篇文章中,所需的网络是为回归输出设计的。但我想在接下来的 5 个步骤中使用 LSTM 分类标签。网络应该如何设计?这是我的代码:

import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import *
from tensorflow.keras.layers import *


batch_size = 32
seq_len = 128
nume_epoch = 50
num_candles = 5

train_path = 'data.csv'
df = pd.read_csv(train_path)
df_train = df[:int(len(df)*0.8)]
df_val   = df[int(len(df)*0.84):]

num_labels   = len(df_train['label'].unique())
Y_train_data = df_train['label'].values
Y_val_data   = df_val['label'].values
Y_train_data = tf.keras.utils.to_categorical(Y_train_data, num_classes=num_labels)
Y_val_data   = tf.keras.utils.to_categorical(Y_val_data, num_classes=num_labels)

df_train.drop(columns=['label'], inplace=True)
df_val.drop(columns=['label'], inplace=True)
train_data = df_train.values
val_data   = df_val.values


X_train, y_train = [], []
for i in range(seq_len, len(train_data) - num_candles):
    X_train.append(train_data[i - seq_len:i])
    y_train.append(Y_train_data[i:i + num_candles])
X_train, y_train = np.array(X_train), np.array(y_train)

X_val, y_val = [], []
for i in range(seq_len, len(val_data) - num_candles):
    X_val.append(val_data[i - seq_len:i])
    y_val.append(Y_val_data[i:i + num_candles])
X_val, y_val = np.array(X_val), np.array(y_val)

def create_model():
    model = Sequential()
    model.add(LSTM(128, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(128, return_sequences=True))
    model.add(Dropout(0.2))
    model.add(LSTM(128))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(num_labels, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.summary()

    return model

model = create_model()
callback = tf.keras.callbacks.ModelCheckpoint('LSTM_Class_.hdf5', monitor='val_loss', 

save_best_only=True, verbose=1)
history = model.fit(X_train, y_train, batch_size=batch_size, epochs=nume_epoch, callbacks=[callback], validation_data=(X_val, y_val))

但这给了我这个错误:

ValueError:形状 (None, 5, 2) 和 (None, 2) 不兼容

【问题讨论】:

  • 你可以发布 data.csv 吗?
  • 你在尝试预测多个标签的 softmax 吗?
  • @golden-lion 我想预测下一行 5 的标签,标签可以是二进制的或具有多个值。
  • Lstm可用于多标签输出。您是否考虑过使用限制性玻尔兹曼来了解结果

标签: python deep-learning classification lstm


【解决方案1】:

您可以使用 softmax 和 flatten 来预测多个标签概率

print("build the LSTM model")
look_back=1
model = Sequential()
features=len(X_columns)
model.add(LSTM(units=100, activation='tanh', return_sequences=True, input_shape=(look_back, features),dtype="float32"))
model.add(Dropout(0.2))
model.add(LSTM(units = 50, activation='tanh', return_sequences = True))
model.add(LSTM(units = 50))
model.add(Flatten())
model.add(Dense(len(y_train.columns),activation='softmax'))
model.compile(optimizer="rmsprop", loss='categorical_crossentropy', metrics=['accuracy'])
build the LSTM model
print("X train shape",X_train.shape)

我使用 lstm 变量来预测设备故障的假人类型

https://github.com/dnishimoto/python-deep-learning/blob/master/LSTM%20Classifier%20Equipment%20Failure.ipynb

我想知道限制性玻尔兹曼机是否可以在学习方面做得更好

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2019-02-23
    • 2017-09-14
    • 1970-01-01
    • 2018-09-24
    • 2020-08-24
    • 2019-09-01
    相关资源
    最近更新 更多