Python Keras LSTM:检查模型输入尺寸时出错

Python Keras LSTM:检查模型输入尺寸时出错,python,neural-network,deep-learning,keras,lstm,Python,Neural Network,Deep Learning,Keras,Lstm,我是keras的新用户,正在尝试实现LSTM模型。对于测试,我声明了如下所示的模型,但由于输入维度的不同,它失败了。虽然我在这个网站上发现了类似的问题,但我自己却找不到自己的错误 ValueError: Error when checking model input: expected lstm_input_4 to have 3 dimensions, but got array with shape (300, 100) 我的环境 python 3.5.2 keras 1.2.0(T

我是keras的新用户,正在尝试实现LSTM模型。对于测试,我声明了如下所示的模型,但由于输入维度的不同,它失败了。虽然我在这个网站上发现了类似的问题,但我自己却找不到自己的错误

ValueError: 
Error when checking model input: 
expected lstm_input_4 to have 3 dimensions, but got array with shape (300, 100)
我的环境
  • python 3.5.2
  • keras 1.2.0(Theano)
代码 编辑1(不起作用,在Marcin Możejko的评论之后) 谢谢Marcin Możejko。但我有一个类似的错误,如下所示。我更新了虚拟数据以供检查。这个代码有什么问题

ValueError:检查模型目标时出错:应为 时间分布_36为3维,但得到形状为的数组 (208,1)


这是
Keras
中的
LSTM
的典型问题
LSTM
输入形状应为
2d
-带有形状
(序列长度,特征的nb)
。额外的第三维度来自示例维度-因此馈送到模型的表格具有形状
(示例的nb\u,序列的nb\u长度,特征的nb\u)
。这就是你的问题所在。请记住,
1-d
序列应表示为具有形状
(序列长度,1)
2-d
数组。这应该是
LSTM
的输入形状:

model.add(LSTM(nb_hidden, 
           name='lstm',
           activation='tanh',
           return_sequences=True,
           input_shape=(in_size, 1)))

请记住将您的输入重塑为适当的格式。

请提供导入。@j0e1对不起,我添加了完整导入。我完全误解了LSTM。输入必须是[样本、时间步、特征]。我将在重新实现后上传我的代码。哈-我刚刚给出了相同的答案:)谢谢你的评论。但我有一个类似的错误,如下所示。我更新了我的代码。你能再检查一下我的代码吗?看来你的目标有问题。它是什么形状的?这是。打印(trainX.shape,trainY.shape)#(208,1,1)(208,1)。我想seq_length==1,num_of_features==1,这是有问题的。为简单起见,为什么要对长度为
1
的序列使用
LSTM
。我的实际数据集假设人机对话数据,实际序列长度大于1。但我认为seq_length==1不是这个错误的原因。。
def create_dataset(X, Y, loop_back=1):
    dataX, dataY = [], []
    for i in range(len(X) - loop_back-1):
        a = X[i:(i+loop_back), :]
        dataX.append(a)
        dataY.append(Y[i+loop_back, :])
    return np.array(dataX), np.array(dataY)

data_size = 300
dataset = np.zeros((data_size, feature_size), dtype=np.float32)
dataset_labels = np.zeros((data_size, 1), dtype=np.float32)

train_size = int(data_size * 0.7)
trainX = dataset[0:train_size, :]
trainY = dataset_labels[0:train_size, :]
testX = dataset[train_size:, :]
testY = dataset_labels[train_size:, 0]
trainX, trainY = create_dataset(trainX, trainY)
print(trainX.shape, trainY.shape) # (208, 1, 1) (208, 1)

# in_size = 100
feature_size = 1
out_size = 1
nb_hidden = 8

model = Sequential()
model.add(LSTM(nb_hidden, 
               name='lstm',
               activation='tanh',
               return_sequences=True,
               input_shape=(1, feature_size)))

model.add(TimeDistributed(Dense(out_size, activation='softmax')))
adadelta = Adadelta(clipnorm=1.)
model.compile(optimizer=adadelta,
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit(trainX, trainY, nb_epoch=10, batch_size=1)
model.add(LSTM(nb_hidden, 
           name='lstm',
           activation='tanh',
           return_sequences=True,
           input_shape=(in_size, 1)))