我有一个文本分类问题,我正在使用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
_________________________________________________________________
答案 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)