#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. Я отредактировал вопрос, чтобы показать предварительную обработку данных. Надеюсь, этого достаточно. Спасибо, ребята. И извините за мой плохой английский, это не мой родной язык.