Моя модель LSTM застревает с точностью 0,5 и потерей 0,7

#tensorflow #keras #lstm

Вопрос:

Я использую модель lstm «многие к одному» для классификации настроений. Набор данных, который я использую, — это набор данных IMDB. Для векторизации слов я решил использовать представления 100D в перчатках.

МОДЕЛЬ

 n_a = 128
def sentiment_model(embedding_layer,n_a):
    model = tf.keras.Sequential([
        embedding_layer,
        LSTM(n_a, input_shape=(MAX_SEQUENCE_LENGTH, 100), return_state = False),
        Dropout(0.25),
        Dense(64),
        Dropout(0.3),
        Dense(1, activation='sigmoid')
    ])
    return model

opt = Adam(learning_rate=0.01)    
modelo.compile(loss='binary_crossentropy',
          optimizer=opt,
          metrics=['accuracy'])

 

ОБУЧЕНИЕ МОДЕЛИ

 modelo.fit(tokens_train,y_train[:,np.newaxis],epochs=10, verbose = 1)
 
 Epoch 1/10
313/313 [==============================] - 63s 202ms/step - loss: 0.7008 - accuracy: 0.4948
Epoch 2/10
313/313 [==============================] - 64s 203ms/step - loss: 0.6980 - accuracy: 0.5084
Epoch 3/10
313/313 [==============================] - 66s 212ms/step - loss: 0.6966 - accuracy: 0.5016
Epoch 4/10
313/313 [==============================] - 69s 220ms/step - loss: 0.6965 - accuracy: 0.4983
Epoch 5/10
313/313 [==============================] - 67s 215ms/step - loss: 0.6959 - accuracy: 0.4970
Epoch 6/10
313/313 [==============================] - 69s 222ms/step - loss: 0.6954 - accuracy: 0.5028
Epoch 7/10
313/313 [==============================] - 68s 218ms/step - loss: 0.6964 - accuracy: 0.4985
Epoch 8/10
313/313 [==============================] - 68s 216ms/step - loss: 0.6976 - accuracy: 0.4965
Epoch 9/10
313/313 [==============================] - 68s 216ms/step - loss: 0.6959 - accuracy: 0.5048
Epoch 10/10
313/313 [==============================] - 68s 217ms/step - loss: 0.6962 - accuracy: 0.5059
 

Редактировать
Я собираюсь представить код, который я реализовал, чтобы векторизовать тексты. (PD: Я удалил папку без регистрации)

 reviews_train = load_files("aclImdb/train/",encoding='utf-8')
text_train, y_train = reviews_train.data, reviews_train.target
reviews_test = load_files("aclImdb/test/",encoding='utf-8')
text_test, y_test = reviews_test.data, reviews_test.target
text_train = text_train[:10000]
y_train = y_train[:10000]

MAX_WORDS = 512
MAX_SEQUENCE_LENGTH = 500
tokenizador = Tokenizer(num_words=MAX_WORDS) 
tokenizador.fit_on_texts(text_train)
tokens_train = tokenizador.texts_to_sequences(text_train)
tokens_test = tokenizador.texts_to_sequences(text_test)
tokens_train = pad_sequences(tokens_train, padding='post', maxlen=MAX_SEQUENCE_LENGTH)
tokens_test = pad_sequences(tokens_test, padding='post', maxlen=MAX_SEQUENCE_LENGTH)
 

После этого я создал словарь с ключевыми словами и значениями вложений каждого слова в соответствии с glove.6B.100d.txt. Этот словарь называется embedding_words.

 embeddings_words = {}
f = open('embedding/glove.6B.100d.txt', encoding="utf8")
for linea in f:
    elems = linea.split()
    word = elems[0]
    embedding = np.asarray(elems[1:], dtype='float32')
    embeddings_words[word] = embedding
f.close()
 

Затем я создал матрицу встраивания, где каждая i-я строка представляет i-е слово векторизации, включая в эту строку соответствующее встраивание перчаток.

 EMBEDDING_DIM = 100
embedding_matrix = np.zeros((len(word_index) 1,EMBEDDING_DIM))
for word, index in word_index.items():
    embedding = embeddings_words.get(word)
    if embedding is not None:
        embedding_matrix[index] = embedding
 

С помощью этого слоя встраивания я создал слой встраивания, который буду использовать в качестве входного слоя модели.

 embedding_layer = Embedding(len(word_index)   1,
                            EMBEDDING_DIM,
                            embeddings_initializer=tf.keras.initializers.Constant(embedding_matrix),
                            trainable=False)
 

Вывод слоя встраивания возвращает тензор формы (10000, 500, 100), как и ожидалось.

Заранее спасибо!

Комментарии:

1. Не могли бы вы приложить код предварительной обработки данных?

2. Добавьте некоторую справочную информацию, какую проблему вы пытаетесь решить, как вы передаете данные в модель?

3. Я отредактировал вопрос, чтобы показать предварительную обработку данных. Надеюсь, этого достаточно. Спасибо, ребята. И извините за мой плохой английский, это не мой родной язык.