Tensorflow keras输入层(Nnoe,2)具有LSTM,但没有';行不通

Tensorflow keras输入层(Nnoe,2)具有LSTM,但没有';行不通,tensorflow,deep-learning,keras,lstm,rnn,Tensorflow,Deep Learning,Keras,Lstm,Rnn,我尝试创建样本,它们是X_列和y_列 这两个样本的格式和我的真实数据相似 代码就是我用的 这是我的密码: import matplotlib.pyplot as plt import numpy as np import time import csv import keras from keras.models import Sequential from keras.layers.core import Dense, Activation, Dropout from keras.layers

我尝试创建样本,它们是X_列和y_列

这两个样本的格式和我的真实数据相似

代码就是我用的

这是我的密码:

import matplotlib.pyplot as plt
import numpy as np
import time
import csv
import keras
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.layers.core import Masking
from keras.layers.wrappers import TimeDistributed
from openpyxl import load_workbook
from datetime import datetime

X_arryA = np.array([[1, 2],[3, 8],[9, 10],[6, 7]])
X_arryB = np.array([[1, 2],[3, 8]])
X_arryC = np.array([[1, 2],[3, 8],[9, 10],[6, 7],[9, 10],[6, 7]])
X_train = np.array([X_arryA,X_arryB,X_arryC])
y_arryA = np.array([1,5,3,4])
y_arryB = np.array([2,1])
y_arryC = np.array([6,7,4,2,3,1])
y_train = np.array([y_arryA,y_arryB,y_arryC])
model = Sequential()
layers = [2, 50, 100, 1]
model.add(LSTM(
    input_shape=(None, 2),
    output_dim=layers[1],
    return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(
    layers[2],
    return_sequences=False))
model.add(Dropout(0.2))

model.add(Dense(
    output_dim=layers[3]))
model.add(Activation("linear"))

start = time.time()
model.compile(loss="mse", optimizer="rmsprop")
#print "Compilation Time : ", time.time() - start
model.summary()
model.fit(X_train, y_train, batch_size=1, nb_epoch=1, validation_split=0.05)
我已经检查了model.summary()

我认为结构是好的

一些信息显示:

C:\Users\user\Anaconda3\envs\py35\lib\site-packages\ipykernel_launcher.py:14: UserWarning: Update your `LSTM` call to the Keras 2 API: `LSTM(units=50, input_shape=(None, 2), return_sequences=True)`

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_77 (LSTM)               (None, None, 50)          10600     
_________________________________________________________________
dropout_65 (Dropout)         (None, None, 50)          0         
_________________________________________________________________
lstm_78 (LSTM)               (None, 100)               60400     
_________________________________________________________________
dropout_66 (Dropout)         (None, 100)               0         
_________________________________________________________________
dense_36 (Dense)             (None, 1)                 101       
_________________________________________________________________
activation_33 (Activation)   (None, 1)                 0         
=================================================================
Total params: 71,101
Trainable params: 71,101
Non-trainable params: 0
_________________________________________________________________
C:\Users\user\Anaconda3\envs\py35\lib\site-packages\ipykernel_launcher.py:23: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(units=1)`
C:\Users\user\Anaconda3\envs\py35\lib\site-packages\keras\models.py:848: UserWarning: The `nb_epoch` argument in `fit` has been renamed `epochs`.
  warnings.warn('The `nb_epoch` argument in `fit` '
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-509-c6f954bdb474> in <module>()
     28 #print "Compilation Time : ", time.time() - start
     29 model.summary()
---> 30 model.fit(X_train, y_train, batch_size=1, nb_epoch=1, validation_split=0.05)

C:\Users\user\Anaconda3\envs\py35\lib\site-packages\keras\models.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    865                               class_weight=class_weight,
    866                               sample_weight=sample_weight,
--> 867                               initial_epoch=initial_epoch)
    868 
    869     def evaluate(self, x, y, batch_size=32, verbose=1,

C:\Users\user\Anaconda3\envs\py35\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)
   1520             class_weight=class_weight,
   1521             check_batch_axis=False,
-> 1522             batch_size=batch_size)
   1523         # Prepare validation data.
   1524         do_validation = False

C:\Users\user\Anaconda3\envs\py35\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
   1376                                     self._feed_input_shapes,
   1377                                     check_batch_axis=False,
-> 1378                                     exception_prefix='input')
   1379         y = _standardize_input_data(y, self._feed_output_names,
   1380                                     output_shapes,

C:\Users\user\Anaconda3\envs\py35\lib\site-packages\keras\engine\training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    130                                  ' to have ' + str(len(shapes[i])) +
    131                                  ' dimensions, but got array with shape ' +
--> 132                                  str(array.shape))
    133             for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])):
    134                 if not j and not check_batch_axis:

ValueError: Error when checking input: expected lstm_77_input to have 3 dimensions, but got array with shape (3, 1)
C:\Users\user\Anaconda3\envs\py35\lib\site packages\ipykernel\u launcher.py:14:UserWarning:更新对Keras 2 API的'LSTM'调用:`LSTM(单位=50,输入形状=(无,2),返回序列=True)`
_________________________________________________________________
层(类型)输出形状参数
=================================================================
lstm_77(lstm)(无,无,50)10600
_________________________________________________________________
辍学(辍学)(无、无、50)0
_________________________________________________________________
lstm_78(lstm)(无,100)60400
_________________________________________________________________
辍学(辍学)(无,100)0
_________________________________________________________________
致密(致密)(无,1)101
_________________________________________________________________
激活_33(激活)(无,1)0
=================================================================
总参数:71101
可培训参数:71101
不可训练参数:0
_________________________________________________________________
C:\Users\user\Anaconda3\envs\py35\lib\site packages\ipykernel_launcher.py:23:UserWarning:更新对Keras 2 API的'densite'调用:'densite(units=1)`
C:\Users\user\Anaconda3\envs\py35\lib\site packages\keras\models.py:848:UserWarning:fit中的'nb_epoch'参数已重命名为'epochs'。
warnings.warn('fit'中的'nb_epoch'参数)
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
28#打印“编译时间:”,Time.Time()-开始
29范本摘要()
--->30模型拟合(X列、y列、批量尺寸=1、nb列=1、验证列=0.05)
C:\Users\user\Anaconda3\envs\py35\lib\site packages\keras\models.py适合(self、x、y、批大小、历元、详细、回调、验证分割、验证数据、随机排列、类权重、样本权重、初始历元、**kwargs)
865级重量=级重量,
866样品重量=样品重量,
-->867初始_历元=初始_历元)
868
869 def评估(自我、x、y、批次大小=32、详细=1、,
C:\Users\user\Anaconda3\envs\py35\lib\site packages\keras\engine\training.py in fit(self、x、y、批大小、历元、详细、回调、验证分割、验证数据、混洗、类权重、样本权重、初始历元、每个历元的步骤、验证步骤、**kwargs)
1520级重量=级重量,
1521检查批次轴=错误,
->1522批次大小=批次大小)
1523#准备验证数据。
1524 do_验证=错误
C:\Users\user\Anaconda3\envs\py35\lib\site packages\keras\engine\training.py in\u-standard\u-user\u数据(自身、x、y、样本重量、类别重量、检查批次轴、批次大小)
1376自输入形状,
1377检查批次轴=错误,
->1378异常(前缀为“输入”)
1379 y=\u标准化\u输入\u数据(y,自。\u输入\u输出\u名称,
1380个输出_形,
C:\Users\user\Anaconda3\envs\py35\lib\site packages\keras\engine\training.py in\u standard\u input\u data(数据、名称、形状、检查批处理轴、异常前缀)
130'具有'+str(长度(形状[i]))+
131'维度,但得到了具有形状的数组'+
-->132 str(数组形状))
133对于枚举(zip(array.shape,shapes[i])中的j,(dim,ref_dim):
134如果不是j且不检查批次轴:
ValueError:检查输入时出错:预期lstm_77_输入有3个维度,但得到了形状为(3,1)的数组
我花了5个小时来解决这个问题,但仍然不起作用


任何帮助。我很感激。

LSTM层只接受
(numberofsequence、numberOfSteps、featuresPerStep)

这些是错误消息中提到的3个预期维度。 您需要正确准备数据以适应这些维度

问题是numpy数组不能接受可变大小。它必须是一个定义良好的矩阵

当您为numpy数组指定3个不同长度的
X_arry
时,结果不可能适合一个numpy数组,而是生成一个数组数组。(Keras无法处理此问题,它需要单个阵列)

使用可变长度,您必须使用虚拟值填充每个数组并添加一个层,或者只需单独训练每个长度

X_arryLen4 = np.asarray([[[1, 2],[3, 8],[9, 10],[6, 7]]])
X_arryLen2 = np.asarray([[[1, 2],[3, 8]]])
X_arryLen6 = np.asarray([[[1, 2],[3, 8],[9, 10],[6, 7],[9, 10],[6, 7]]])

model.fit(X_arryLen4, .....)
model.fit(X_arryLen2, .....)
model.fit(X_arryLen6, .....)
可能有帮助的答案:


因此,我必须在每个样本中放入相同的大小,包括列和行?对吧?每批都有。但是你可以有不同的批次,每个批次都有一个“步骤数”。或者有三种解决方法,(1)用虚拟值填充每个数组(2)掩蔽层(3)单独训练每个长度。我的理解正确吗?非常感谢。我能给每批不同的“步骤数(NOF)”吗?例:第一批形状为(NOF=10,FPS=2),第二批形状为(NOF=4,FPS=2),依此类推。FPS是功能步骤。是的,您可以。:-但是批量需要shape
(NumberOfVideos,NOF,FeaturesPerS