尝试从Keras运行顺序模型时发生ValueError

如何解决尝试从Keras运行顺序模型时发生ValueError

我正在尝试使用Keras构建NARX NN。我仍然不确定在LSTM神经元中使用参数 return_sequence = True ,但是,在我能确认之前,我需要使代码正常工作。当我尝试运行它时,出现以下消息:

ValueError: Error when checking input: expected lstm_84_input to have 3 dimensions,but got array with shape (6686,3)

请参阅下面的代码。运行 model.fit 命令时会引发错误。我的数据数据具有40101个时间步长x 6个特征(3个外部输入,3个系统响应)的形状。

import numpy as np
import pandas as pd
from sklearn.model_selection import TimeSeriesSplit
import tensorflow as tf
from tensorflow.keras import initializers

# --- main
data = pd.read_excel('example.xlsx',usecols=['wave','wind','current','X','Y','RZ'])
data.plot(subplots=True,figsize=[15,10])

x_data = np.array(data.loc[:,['wave','current']])
y_data = np.array(data.loc[:,['X','RZ']])

timeSeriesCrossValidation = TimeSeriesSplit(n_splits=5)
for train,validation in timeSeriesCrossValidation.split(x_data,y_data):  

    # create model
    model = tf.keras.models.Sequential()
    
    # input layer
    model.add(tf.keras.layers.LSTM(units=50,input_shape=(40101,3),dropout=0.01,recurrent_dropout=0.2,kernel_initializer=initializers.RandomNormal(mean=0,stddev=.5),bias_initializer=initializers.Zeros(),return_sequences = True))
    
    # 1st hidden layer
    model.add(tf.keras.layers.LSTM(units=50,return_sequences = True))
    
    # 2nd hidder layer
    model.add(tf.keras.layers.LSTM(units=50,return_sequences = False))
    
    # output layer
    model.add(tf.keras.layers.Dense(3))
    
    model.compile(loss='mse',optimizer='nadam',metrics=['accuracy'])

    model.fit(x_data[train],y_data[train],verbose=2,batch_size=None,epochs=10,validation_data=(x_data[validation],y_data[validation])
              #callbacks=early_stop
              )
    
    prediction = model.predict(x_data[validation])
    y_validation = y_data[validation]

解决方法

LSTM层需要在3维上输入:

(n_samples,time_steps,features)

您以以下格式传递了数据:

(n_samples,features)

由于您没有创建时间步的功能,因此最简单的解决方案是将输入更改为形状:

(40101,1,3)

伪造数据:

x_data = np.random.rand(40101,3)
y_data = np.random.rand(40101,3)

此外,您不应在Keras层的input_shape参数中传递样本数。只需使用此:

input_shape=(1,3)

这是经过纠正的代码(带有伪造的数据):

import numpy as np
from sklearn.model_selection import TimeSeriesSplit
import tensorflow as tf
from tensorflow.keras import initializers
from tensorflow.keras.layers import *

x_data = np.random.rand(40101,3)

timeSeriesCrossValidation = TimeSeriesSplit(n_splits=5)
for train,validation in timeSeriesCrossValidation.split(x_data,y_data):
    # create model
    model = tf.keras.models.Sequential()

    # input layer
    model.add(LSTM(units=5,input_shape=(1,3),dropout=0.01,recurrent_dropout=0.2,kernel_initializer=initializers.RandomNormal(mean=0,stddev=.5),bias_initializer=initializers.Zeros(),return_sequences=True))

    # 1st hidden layer
    model.add(LSTM(units=5,return_sequences=True))

    # 2nd hidder layer
    model.add(LSTM(units=50,return_sequences=False))

    # output layer
    model.add(tf.keras.layers.Dense(3))

    model.compile(loss='mse',optimizer='nadam',metrics=['accuracy'])

    model.fit(x_data[train],y_data[train],verbose=2,batch_size=None,epochs=1,validation_data=(x_data[validation],y_data[validation])
              # callbacks=early_stop
              )

    prediction = model.predict(x_data[validation])
    y_validation = y_data[validation]

如果您希望函数创建时间步,请使用以下方法:

def multivariate_data(dataset,target,start_index,end_index,history_size,target_size,step,single_step=False):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
    end_index = len(dataset) - target_size

  for i in range(start_index,end_index):
    indices = range(i-history_size,i,step)
    data.append(dataset[indices])

    if single_step:
      labels.append(target[i+target_size])
    else:
      labels.append(target[i:i+target_size])

  return np.array(data),np.array(labels)

它将为您提供正确的形状,例如:

multivariate_data(dataset=np.random.rand(40101,target=np.random.rand(40101,len(x_data),5,True)[0].shape
(40096,3)

您丢失了5个数据点,因为在开始时您无法回顾过去的5个步骤。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?