Почему точность моей модели застревает на уровне ~ 32%? - PullRequest
0 голосов
/ 12 июня 2018

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

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

Я создал набор обзоров альбомов отЭнтони Фантано с соответствующими целями от 1 до 9 ( здесь ).Моя цель состояла в том, чтобы использовать анализ настроений для прогнозирования оценки на основе входного текста.

Сначала я использую служебный класс keras Tokenizer для предварительной обработки моего необработанного текста, а затем дополняю / усекаю текст на основе токена.до максимального размера np.mean(num_tokens) + 2 * np.std(num_tokens) и затем я создаю вектор встраивания (используя класс keras Embedding)

Я использую однократное кодирование для моих целевых данных с вектором длины 10.

Моя сеть создает вектор длиной 10 с активацией softmax, и я использую categorical_crossentropy в качестве функции потерь.Я произвольно выбрал размеры для своих ячеек GRU (это правильная терминология?), Но игра с ними не принесла лучших результатов.

model = Sequential()
model.add(embedding)
model.add(GRU(units=32, return_sequences=True))
model.add(GRU(units=16))
model.add(Dense(10, activation='softmax'))
optimizer = SGD(lr=0.01)
model.compile(loss='categorical_crossentropy',
              optimizer=optimizer,
              metrics=['accuracy'])
model.summary()
model.fit(x_pad, y_encoded,
          validation_split=0.05, epochs=5, batch_size=64)

Вот краткий обзор моей сетиот keras

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
layer_embedding (Embedding)  (None, 2290, 8)           8000
_________________________________________________________________
gru_1 (GRU)                  (None, 2290, 32)          3936
_________________________________________________________________
gru_2 (GRU)                  (None, 16)                2352
_________________________________________________________________
dense_1 (Dense)              (None, 10)                170
=================================================================
Total params: 14,458
Trainable params: 14,458
Non-trainable params: 0
_________________________________________________________________
Train on 259 samples, validate on 14 samples

Моя точность при скорости обучения 0,01 всегда сходится к 0,3166, но я не уверен, почему

259/259 [==============================] - 18s 68ms/step - loss: 2.2998 - acc: 0.2124 - val_loss: 2.2935 - val_acc: 0.4286
Epoch 2/10
259/259 [==============================] - 16s 63ms/step - loss: 2.2927 - acc: 0.2973 - val_loss: 2.2854 - val_acc: 0.3571
Epoch 3/10
259/259 [==============================] - 16s 61ms/step - loss: 2.2822 - acc: 0.2471 - val_loss: 2.2767 - val_acc: 0.3571
Epoch 4/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2728 - acc: 0.2973 - val_loss: 2.2681 - val_acc: 0.4286
Epoch 5/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2651 - acc: 0.3166 - val_loss: 2.2575 - val_acc: 0.4286
Epoch 6/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2548 - acc: 0.3166 - val_loss: 2.2496 - val_acc: 0.4286
Epoch 7/10
259/259 [==============================] - 15s 57ms/step - loss: 2.2469 - acc: 0.3166 - val_loss: 2.2420 - val_acc: 0.4286
Epoch 8/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2382 - acc: 0.3166 - val_loss: 2.2325 - val_acc: 0.4286
Epoch 9/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2305 - acc: 0.3166 - val_loss: 2.2265 - val_acc: 0.4286
Epoch 10/10
259/259 [==============================] - 15s 58ms/step - loss: 2.2222 - acc: 0.3166 - val_loss: 2.2158 - val_acc: 0.4286

Есть две возможные причины, по которым я могу думатьиз-за того, что во-первых, моя скорость обучения слишком велика (так как точность кажется скачкообразной, что указывает на превышение).Я пытался снизить его до 0,05, но после 20 эпох моя точность не могла пройти 0,2046.Я также пытался использовать как стохастический градиентный спуск, так и оптимизаторы Адама, но ни один из них не дал совершенно разных результатов.

Другая возможная причина, о которой я мог подумать, состояла в том, что мой набор данных был слишком маленьким (всего 259 выборок), но ядаже не в состоянии получить высокую точность от переоснащения, поэтому я предполагаю, что это не проблема?Кроме того, мои фактические данные о функциях (необработанный текст) очень велики и обширны.

Если это поможет, мой полный файл исходного кода доступен здесь здесь .

Любая помощь будет высоко ценится, будь то точка в правильном направлении или исправление моего понимания где-то.Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Константинос абсолютно прав - потому что результат - это пронумерованный результат, который измеряет количество чего-либо (в данном случае обзор), вы хотите использовать MSE и убедиться, что модель рассматривает числа как «шкалу»вместо индивидуальных занятий.Вы бы использовали отдельные классы, если бы сами определяли жанр музыки (поп, хип-хоп, рок и т. Д.), Но в этом случае есть степень «совершенства» (9 - очень хорошо, а 1 - хорошо).нехорошо).Как правило, любой тип проблемы с оценкой должен использовать эту «MSE-масштабированную» систему.

Яркий пример того, как это используется, приведен в модели / алгоритме в моей книге о DL и Stock Prediction, которую вы можетеПодробнее о здесь .Для оценки акций используется модель глубокого обучения (также известная как «рейтинг покупки»).

Удачи!

0 голосов
/ 13 июня 2018

Я бы сказал, что вы плохо обращаетесь со своим набором данных.У вас есть отзывы по шкале от 1 до 9, и хотя это не непрерывный диапазон, он характеризуется строгим общим заказом , который вы не используете.Чтобы прояснить мою точку зрения, если ваш алгоритм предсказывает, что обзору присваивается 8 баллов, а истинная метка равна 9, то это может быть неправильно, но это лишь немного.С другой стороны, если бы он сделал прогноз 1, это было бы далеко.Ваша текущая система не имеет возможности проводить такое различие, поскольку вы рассматриваете все 10 отдельных классов как одинаково удаленные друг от друга.Мое предложение состояло бы в том, чтобы переключить целевую функцию на MSE, несмотря на дискретный характер ваших данных, и использовать обертку для измерения точности.Это определенно должно помочь в обучении, и вы можете позже вернуться к Кросс-Энтропии.

Отказ от ответственности: я не прочитал ваш код, но у меня были подобные проблемы довольно часто, и я смог решить их так, как я описал.

...