【问题标题】:How can I get multiple outputs in an LSTM network in Python with Keras and Tensorflow?如何使用 Keras 和 Tensorflow 在 Python 中的 LSTM 网络中获得多个输出?
【发布时间】:2018-11-20 08:54:10
【问题描述】:

我第一次使用 Keras 中的 LSTM 和 Python 中的 Tensorflow,我想创建一个具有一些层并提供 10 个输出值的神经网络。我在神经网络中生成了多个层,并创建了一个包含 10 个元素的输出 DenseLayer。我有下一个代码:

from pandas import DataFrame
from pandas import Series
from pandas import concat
from pandas import read_csv
from pandas import datetime
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from math import sqrt
from matplotlib import pyplot
import numpy
from numpy import array
import math


# 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]
        dataX.append(a)
        dataY.append(dataset[i + look_back, 0])
    return numpy.array(dataX), numpy.array(dataY)

look_back = 10
epochs = 1000
batch_size = 50

data = data.astype('float32')

scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(data)


# 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)


# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = numpy.reshape(testX, (testX.shape[0], 1, testX.shape[1]))


# create and fit the LSTM network
model = Sequential()
model.add(LSTM(100, activation = 'tanh', inner_activation = 'hard_sigmoid', return_sequences=True))#, input_shape=(1, look_back)))
model.add(LSTM(50, activation = 'tanh', inner_activation = 'hard_sigmoid', return_sequences=True))
model.add(LSTM(25, activation = 'tanh', inner_activation = 'hard_sigmoid'))
# I want 10 outputs    
model.add(Dense(10))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=epochs, batch_size=batch_size, verbose=2)

但是当我执行代码时,我收到下一条错误消息:

ValueError: Error when checking target: expected dense_1 to have shape (10,) but got array with shape (1,)

我能做些什么来解决这个问题?我想对接下来的 10 个元素进行预测,这就是我放置最后一层 10 个元素的原因。

【问题讨论】:

  • 目标(trainyY)的形状是什么?
  • 这是一个 trainY 数组的示例:array([0.5125213 , 0.52500796, 0.53751385, ..., 0.52500796, 0.5250104 ,0.56250316], dtype=float32)
  • 这是 trainY 数组还是 train 数组的一个元素?如果是 trainY 数组,那么错误就在这里,否则我还不知道
  • 是的,这是 trainY 数组。
  • 但是,我该如何解决呢?我是否也必须重塑 trainY,就像我对 trainX 所做的那样?

标签: python tensorflow keras layer prediction


【解决方案1】:

根据您上面所说的错误ValueError: Error when checking target: expected dense_1 to have shape (10,) but got array with shape (1,) 是由于您的目标存在问题:

  • 您有一个作为目标值的列表。
  • 您尝试预测十个值,但只有一个值可供比较。

您需要重新设计 trainY 矩阵以包含您希望预测的每个值。 例如,如果您希望预测最接近的未来的 5 个值,则需要包含所有值的大小为 5 的目标行(即每个元素)。

因此,您将训练网络预测 5 个未来值。 我会尽力为您提供代码,但它只是通过滚动重塑以获得未来值。

更准确地说,对于 1 X(一个输入),您需要 y=[v1,v2,v3,v4,v5] 所以如果你有train = [X1,X2,..] 那么Y = [[v1,v2,v3,v4,v5],[v2,v3,v4,v5,v6]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2019-09-16
    • 2020-01-03
    • 2019-10-08
    相关资源
    最近更新 更多