Keras:输入0与lstm_26层不兼容:预期的ndim = 3,找到的ndim = 2

时间:2018-10-05 18:33:57

标签: python machine-learning keras deep-learning lstm

我有一个文本分类问题,我正在使用LSTM层通过Keras获取上下文向量。

我使用了tokenizer并填充了序列,因此我的X_train的形状为(21226, 1500),其中1500是最大序列长度。

如何直接将此序列传递给具有64个单位的LSTM?我尝试直接这样做,但是尺寸似乎有问题。

  

输入0与lstm_26层不兼容:预期ndim = 3,找到ndim = 2

以下是Keras中的代码:

input = Input(shape=(1500,))
lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
out = lstm1(input)

编辑:

这是更新的代码:

def getm():
    inp = Input(shape=(1500,1))
    lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
    out = lstm1(inp)
    model = Model(inputs=inp, outputs=out)
    model.compile(optimizer='rmsprop', loss=custom_loss, metrics=[custom_loss])
    return model

现在,X_train的形状为(21226,1500),用np.expand_dims重塑后,形状为(21226,1500,1)。

我阅读了Keras文档,其形状为X_train,第一个属性应为批处理大小,应为None,因为Keras的预测和拟合函数会注意这一点。

EDIT2:

这是完整的代码:

def getm():
    inp = Input(shape=(1500,1))
    lstm1 = LSTM(units=64, dropout=0.2, recurrent_dropout=0.2)
    out = lstm1(inp)
    model = Model(inputs=inp, outputs=out)
    model.compile(optimizer='rmsprop', loss=custom_loss, metrics=[custom_loss])
    return model

model = getm()

X_train.shape = (21226, 500)

我使用

my_data = X_train.reshape(X_train.shape + (1,))

现在

my_data.shape = (21226, 1500, 1)

我正在尝试预测一个数据点的输出:

 model.predict(my_data[0])

并抛出此错误:

ValueError: Error when checking input: expected input_25 to have 3 dimensions, but got array with shape (1500, 1) 

EDIT3:

这是模型摘要

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_25 (InputLayer)        (None, 1500, 1)           0         
_________________________________________________________________
lstm_16 (LSTM)               (None, 64)                16896     
=================================================================
Total params: 16,896
Trainable params: 16,896
Non-trainable params: 0
_________________________________________________________________

1 个答案:

答案 0 :(得分:0)

LSTM层需要一个形状为(batch_size, num_timesteps or sequence_length, num_features)的3D输入数组(这就是为什么会出现expected ndim=3, found ndim=2错误的原因)。因此,如果您想将标记了标记词和单词索引的句子直接输入到LSTM层,则需要对其进行重塑,使其具有特征轴(在这种情况下,它将包含词典中单词的索引): / p>

# using np.reshape
my_data = my_data.reshape(my_data.shape + (1,))

# using np.expand_dims
my_data = np.expand_dims(my_data, axis=-1)