Разная точность для одного и того же кода в классификации текста в керасе - PullRequest
0 голосов
/ 06 февраля 2019

Я тренирую рекуррентную нейронную сеть на основе LSTM для классификации текста, и у меня странное поведение.С одним и тем же кодом и одним и тем же обучающим набором я получаю совершенно другой уровень точности.

Я знаю, что нормально иметь другое значение, но иногда я получаю значение 40% точности, а другие 90%.Как это возможно?

Более того, иногда я зацикливаюсь на уровне точности, я имею в виду, что потери и точность не меняются в разные эпохи, поэтому оба значения остаются одинаковыми.Чем это объясняется?

Еще один аспект, который я не уверен, что я действительно понимаю, это факт заполнения моего входного текста (я использую обучение в пакетном режиме).Я думаю, поскольку я использую RNN, лучше использовать левый отступ.Вы знаете, как дополнить ввод?Лучше левый или правый отступ?

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

Это реализация моего RNN:

sentence_indices = Input(shape=input_shape, dtype=np.int32)
embedding_layer =  pretrained_embedding_layer(word_to_vec_map, word_to_index, emb_dim)

embeddings = embedding_layer(sentence_indices)   
X = LSTM(128, return_sequences=True)(embeddings)
X = Dropout(0.5)(X)
X = LSTM(128)(X)
X = Dropout(0.5)(X)
X = Dense(num_activation, activation='softmax')(X)
X =  Activation('softmax')(X)
model = Model(sentence_indices, X)
  • слой вложений получен из GloVeМодель предварительно обучена.
  • Я использую 5 категорий и 300 образцов более или менее
  • Мой тренировочный набор не унифицирован

Буду признателен за любой намек на вопрос выше итакже некоторые предложения по улучшению моей нейронной сети.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я думаю, что это высокое значение отсева, которое вы используете, несмотря на то, что вы не используете очень глубокую сеть.Выпадения являются случайными и использование значения, равного 0,5, вдвое, определенно даст вам радикально отличающиеся результаты.Выпадения обычно держатся где-то в пределах 0,2 - 0,3, и самые высокие значения только для более глубоких сетей, чтобы избежать перегрузки.Попробуйте избавиться от отсева или удерживать его на уровне около 0,15.

0 голосов
/ 06 февраля 2019

Тренируетесь ли вы столько же эпох?

Одна из вещей, которая может произойти, это то, что у вас есть взрывные градиенты на некоторых трассах.Возможно, вы могли бы ввести градиентное ограничение ( градиентное ограничение в кератах ), чтобы избежать этой проблемы.Вы также можете использовать регуляризацию ( keras ruglarizers ), чтобы провести другое измерение.Насколько я знаю, когда дело доходит до заполнения, то правильное заполнение - обычная вещь.Обоснование состоит в том, что начальное скрытое состояние всегда равно 0 для входящих последовательностей. В противном случае вы начинаете с различных скрытых заявленных значений, в зависимости от того, сколько отступов у вас было слева.

В вашей модели есть одна проблема,У вас есть два слоя softmax.Так что достаточно просто иметь

X = Dense(num_activations, activation='softmax')(X)

. Далее вам не нужен слой активации.

Вы просто используете 300 образцов для обучения или теста?Для обучения это похоже на очень мало образцов, больше будет лучше.Вы можете попытаться увеличить LSTM (например, 512), если у вас есть вычислительные ресурсы для этого.Но если у вас будет только 300 сэмплов, это не повлияет на производительность.Еще можно попробовать настроить гиперпараметры, такие как оптимизатор и скорость обучения.И вы можете попробовать использовать CNN вместо LSTM, возможно, это также немного увеличит производительность.

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