【问题标题】:Why I get a very low accuracy with LSTM and pretrained word2vec?为什么我使用 LSTM 和预训练的 word2vec 的准确率非常低?
【发布时间】:2020-04-20 14:52:52
【问题描述】:

我正在研究一个只有两个类别 0(负面)和 1(正面)的评论分类模型。我正在使用来自谷歌的预训练 word2vec 和 LSTM。问题是我得到了大约 50% 的准确度,根据这篇论文,它应该在 83% 左右。我尝试了许多不同的超参数组合,但仍然获得了可怕的准确性。我还尝试更改数据预处理技术并尝试进行词干提取,但仍未解决问题

这是我的代码

X, y = read_data()
X = np.array(clean_text(X)) #apply data preprocessing  
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X)

#converts text to sequence and add padding zeros
sequence = tokenizer.texts_to_sequences(X)
X_data = pad_sequences(sequence, maxlen = length, padding = 'post')

X_train, X_val, y_train, y_val = train_test_split(X_data, y, test_size = 0.2)

#Load the word2vec model
word2vec = KeyedVectors.load_word2vec_format(EMBEDDING_FILE, binary=True)

word_index = tokenizer.word_index
nb_words = min(MAX_NB_WORDS, len(word_index))+1

embedding_matrix = np.zeros((nb_words, EMBEDDING_DIM))
null_words = []
for word, i in word_index.items():
    if word in word2vec.wv.vocab:
        embedding_matrix[i] = word2vec.word_vec(word)
    else:
        null_words.append(word)

embedding_layer = Embedding(embedding_matrix.shape[0], # or len(word_index) + 1
                            embedding_matrix.shape[1], # or EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=701,
                            trainable=False)

model = Sequential()
model.add(embedding_layer)
model.add(LSTM(100))
model.add(Dropout(0.4))
model.add(Dense(2, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, y_train, batch_size=32, epochs=2, validation_data=(X_val, y_val), workers = -1, verbose=1)

score, acc = model.evaluate(X_val, y_val, batch_size=64)

我还尝试了其他优化器,例如 AdaMax 和 MSLE 损失函数,无论我增加多少 epoch 或更改批量大小,准确性都不会变得更好。如果问题不在于模型和预处理,我会很困惑,它可能在哪里?谢谢

【问题讨论】:

    标签: python deep-learning lstm tf.keras word-embedding


    【解决方案1】:

    我注意到的几件事,

    为什么你有trainable=False 它限制了你的模型,使模型无法微调嵌入。必须使用一组固定的嵌入来学习问题比使用可训练的嵌入要困难。因此,请尝试设置trainable=True

    embedding_layer = Embedding(embedding_matrix.shape[0], # or len(word_index) + 1
                                embedding_matrix.shape[1], # or EMBEDDING_DIM,
                                weights=[embedding_matrix],
                                input_length=701,
                                trainable=False)
    

    第二个问题是您正在使用 2 个具有 sigmoid 激活和 binary_crossentropy 的单元。这种组合不起作用。你有两个选择。

    model = Sequential()
    ...
    model.add(Dense(2, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    

    选项 1

    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
    

    如果您选择此选项,请注意您的标签必须是 [sample size, 1] 形状。

    选项 2

    model.add(Dense(2, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    

    【讨论】:

      猜你喜欢
      • 2020-09-03
      • 1970-01-01
      • 2020-02-11
      • 2020-03-12
      • 2018-02-08
      • 2020-10-17
      • 2023-03-17
      • 2020-04-07
      • 1970-01-01
      相关资源
      最近更新 更多