我正在尝试使用lstm
构建Keras
文本分类器。
这是模型结构:
model_word2vec = Sequential()
model_word2vec.add(Embedding(input_dim=vocabulary_dimension,
output_dim=embedding_dim,
weights=[word2vec_weights,
input_length=longest_sentence,
mask_zero=True,
trainable=False))
model_word2vec.add(LSTM(units=embedding_dim, dropout=0.25, recurrent_dropout=0.25, return_sequences=True))
model_word2vec.add(Dense(3, activation='softmax'))
model_word2vec.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
results = model_word2vec.fit(X_tr_word2vec, y_tr_word2vec, validation_split=0.16, epochs=3, batch_size=128, verbose=0)
其中
y_tr_word2vec
是3维one-hot
编码变量。当我运行上面的代码时,出现此错误:
ValueError: Error when checking model target: expected dense_2 to have 3 dimensions, but got array with shape (15663, 3)
我想问题可能与
y_tr_word2vec
形状或batch size
尺寸有关,但我不确定。更新:
我已将
return_sequences=False
,y_tr_word2vec
从one-hot
更改为categorical
,1
密集层中的神经元,现在我使用的是sparse_categorical_crossentropy
而不是categorical_crossentropy
。现在,我收到此错误:
ValueError: invalid literal for int() with base 10: 'countess'
。因此,现在我假设在
fit()
期间,包含句子的输入向量X_tr_word2vec
出了问题。 最佳答案
问题是这段代码
model_word2vec.add(LSTM(units=dim_embedding, dropout=0.25, recurrent_dropout=0.25, return_sequences=True))
model_word2vec.add(Dense(3, activation='softmax'))
您已经设置了
return_sequences=True
,这意味着LSTM将3D数组返回到密集层,而密集不需要3D数据...所以删除return_sequences = Truemodel_word2vec.add(LSTM(units=dim_embedding, dropout=0.25, recurrent_dropout=0.25))
model_word2vec.add(Dense(3, activation='softmax'))
你为什么要设置return_sequences = True?