Точность и потеря Кераса не меняются на протяжении большого периода - PullRequest
1 голос
/ 18 апреля 2020

Я пытаюсь создать сверточную нейронную сеть, чтобы классифицировать, из какого языка происходит определенное «слово». Есть два файла ("english_words.txt" и "spanish_words.txt"), каждый из которых содержит около 60 000 слов каждый. Я преобразовал каждое слово в 29-мерный вектор, где каждый элемент представляет собой число от 0 до 1. Я тренирую модель для 500 эпох с помощью оптимизатора «Адам». Однако, когда я тренирую модель, потеря имеет тенденцию колебаться около 0,7, а точность около 0,5, и независимо от того, как долго я тренируюсь, эти показатели не улучшатся. Вот код:

import keras
import numpy as np
from keras.layers import Dense
from keras.models import Sequential
import re

train_labels = []
train_data = []

with open("english_words.txt") as words:
    full_words = words.read()
    full_words = full_words.split("\n")

    # all of the labels are just 1.

    # we now need to encode them into 29 dimensional vectors. 
    vector = []
    i = 0
    for word in full_words:
        train_labels.append([1,0])
        for letter in word:
            vector.append((ord(letter) - 96) * (1.0 / 26.0))
            i += 1
        if (i < 29):
            for x in range(0, 29 - i):
                vector.append(0)
        train_data.append(vector)
        vector = []
        i = 0
with open("spanish_words.txt") as words:
    full_words = words.read()
    full_words = full_words.replace(' ', '')

    full_words = full_words.replace('\n', ',')
    full_words = full_words.split(",")
    vector = []
    for word in full_words:
        train_labels.append([0,1])
        for letter in word:
            vector.append((ord(letter) - 96) * (1.0 / 26.0))
            i += 1
        if (i < 29):
            for x in range(0, 29 - i):
                vector.append(0)
        train_data.append(vector)
        vector = []
        i = 0


def shuffle_in_unison(a, b):
    assert len(a) == len(b)
    shuffled_a = np.empty(a.shape, dtype=a.dtype)
    shuffled_b = np.empty(b.shape, dtype=b.dtype)
    permutation = np.random.permutation(len(a))
    for old_index, new_index in enumerate(permutation):
        shuffled_a[new_index] = a[old_index]
        shuffled_b[new_index] = b[old_index]
    return shuffled_a, shuffled_b



train_data = np.asarray(train_data, dtype=np.float32)
train_labels = np.asarray(train_labels, dtype=np.float32)



train_data, train_labels = shuffle_in_unison(train_data, train_labels)

print(train_data.shape, train_labels.shape)
model = Sequential()
model.add(Dense(29, input_shape=(29,)))
model.add(Dense(60))
model.add(Dense(40))
model.add(Dense(25))
model.add(Dense(2))

model.compile(optimizer="adam",
              loss="categorical_crossentropy",
              metrics=["accuracy"])
model.summary()

model.fit(train_data, train_labels, epochs=500, batch_size=128)

model.save("language_predictor.model")

Для получения дополнительной информации я запускаю python 3.x с tenorflow 1.15 и keras 1.15 на windows x64.

Ответы [ 2 ]

1 голос
/ 18 апреля 2020

Я вижу несколько потенциальных проблем с вашим кодом.

  1. Вы добавили несколько Dense слоев один за другим, но вам действительно необходимо включить нелинейную функцию активации с параметр activation= .... В отсутствие каких-либо нелинейных функций активации все эти полностью связанные слои Dense математически свернутся в один линейный слой Dense, неспособный к обучению границы нелинейного решения.

  2. В общем, если вы видите, что ваши потери и точность не улучшаются и даже не ухудшаются, первое, что нужно сделать, это снизить скорость обучения.

  3. Вы не Нужно обязательно реализовать свою собственную функцию тасования. Функция Keras fit() может сделать это, если вы используете параметр shuffle=True.

0 голосов
/ 18 апреля 2020

В дополнение к пунктам, упомянутым stackoverflowuser2010:

  1. Я считаю это очень хорошим прочтением и настоятельно рекомендую проверить упомянутые пункты: 37 Причины, по которым ваша нейронная сеть не является работая

  2. Центрируйте свои входные данные: Вычислите средний компонентный вектор и вычтите его из каждого входа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...