Получение очень низкой точности с помощью lstm для обзоров IMDB - PullRequest
0 голосов
/ 10 октября 2018

Я преобразовал обзоры IMDB в 300 измерений, используя Word2Vec.

Я сохранил embedding_vecor_length = 32, input_length = 300 из 25000 обзоров.

Я получаю очень плохую точность и большие потери.

В конце 10 эпох я получаю точность 0,4977 и потери 0,6932.

    embedding_vecor_length = 32
    model = Sequential()
    model.add(Embedding(25000, embedding_vecor_length, input_length=300))
    model.add(LSTM(100))
    model.add(Dense(1, activation='sigmoid'))
    model.compile(loss='binary_crossentropy', optimizer='adam', metrics['accuracy'])

Что я должен добавить или удалить, чтобы повысить точность и уменьшить потери?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

вы можете использовать предварительно подготовленную перчатку для встраивания слов, вы можете использовать glove.6B.50d.txt, который вы можете скачать с http://nlp.stanford.edu/data/glove.6B.zip, использовать 50d

def read_glove_vecs(glove_file):
    with open(glove_file,'r',encoding='UTF-8') as f:
         words = set()
         word_to_vec_map = {}
         for line in f:
             line = line.strip().split()
             curr_word = line[0]
             words.add(curr_word)
             word_to_vec_map[curr_word] = np.array(line[1:], dtype=np.float64)

         i = 1
         words_to_index = {}
         index_to_words = {}
         for w in sorted(words):
             words_to_index[w] = I
             index_to_words[i] = w
             i = i + 1
    return words_to_index, index_to_words, word_to_vec_map

Теперь вызовите вышефункция, которая будет возвращать

word_to_index, index_to_word, word_to_vec_map = read_glove_vecs('data/glove.6B.50d.txt')

Теперь создайте встраивание слов из этих предварительно обученных слов

vocab_len = len(word_to_index) 
emb_dim = 50 # the above word vector are trained for 50 dim
emb_matrix = np.zeros((vocab_len, emb_dim))

for word, index in word_to_index.items():
    emb_matrix[index,:] = word_to_vec_map[word]
embedding_layer = Embedding(vocab_len, emb_dim, trainable = False)
embedding_layer.build((None,))

embedding_layer.set_weights([emb_matrix])

Теперь используйте этот слой для встраивания в вашу модель, что повысит вашу точность

0 голосов
/ 10 октября 2018

25000 - это количество сэмплов, которое у вас есть, а не входное измерение слоя внедрения.Я думаю, что вы должны проверить, какие размеры вы хотите в этой функции.Я думаю, что, не видя ваших данных, вы на самом деле хотите:

model.add(Embedding(300, embedding_vecor_length))

Но поскольку вы уже использовали word2vec, это уже вложение!Вам не нужен слой для встраивания.Я думаю, что вы должны удалить его, а затем увидеть свою точность.

...