我试图使用双向LSTM将文本数据(句子)分类为某些类。我以其中的3个为例。我遵循了multilabel-classification-post,即“使用Sigmoid激活输出层”,“使用binary_crossentropy进行损耗函数”。我使用了一个嵌入层(大小为300的单词向量)。我的句子被填充和截断,因此每个句子有100个标记。这是我的模型的代码:
model = Sequential()
embedding_layer = Embedding(6695,
300,
weights=[embedding_matrix],
input_length=100,
trainable=True)
model.add(embedding_layer)
model.add(Bidirectional(LSTM(32,
return_sequences=False)))
model.add(Dense(3,
activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['acc'])
print("model fitting - Bidirectional LSTM")
model.summary()
x= model.fit(X_train, y_train,
batch_size=256,
epochs=6,
validation_data=(X_val, y_val),
shuffle = True,
verbose = 1
)
这是模型摘要,这是预期的结果: enter image description here
但是,我收到此错误:
Traceback (most recent call last):
File "/Users/master/Documents/Deep Learning/Learning Keras/reveiw_classification.py", line 159, in <module>
verbose = 1
File "/Users/master/.pyenv/versions/ENV4/lib/python3.6/site-packages/keras/engine/training.py", line 955, in fit
batch_size=batch_size)
File "/Users/master/.pyenv/versions/ENV4/lib/python3.6/site-packages/keras/engine/training.py", line 792, in _standardize_user_data
exception_prefix='target')
File "/Users/master/.pyenv/versions/ENV4/lib/python3.6/site-packages/keras/engine/training_utils.py", line 136, in standardize_input_data
str(data_shape))
ValueError: Error when checking target: expected dense_1 to have shape (3,) but got array with shape (100,)
我不需要LSTM返回一系列隐藏状态输出,我只需要最后一个输出。我以为我在LSTM中使用了return_sequences = False,因此输出应具有维度1,然后具有32个单位的双向LSTM将具有输出维度(None,64),如模型摘要中所示。但是为什么它说期望density_1具有形状(3,)但却得到形状(100,)的数组呢?有人可以帮我吗?
答案 0 :(得分:1)
例如,目标y_train
实际上是句子,而不是标签[1, 0, 1]
的向量。错误不是关于模型,而是您传递的数据。
y_train
应该是形状为(num_samples, 3)
的2D数组,因此对于每个样本(句子),您都有3个标签的向量 target 。X_train
在这种情况下将类似于(num_samples, 100)
,它是长度为100的句子作为您的输入。