Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2017, 12:13   #1
glorsh66
 
Регистрация: 07.07.2017
Сообщений: 8
По умолчанию Keras - классификация текста - оверфиттинг, и как улучшить модель

Я делаю нейронную сеть для классификации текста на русском языке по этим примерам -
https://github.com/jiegzhan/multi-cl...cation-cnn-rnn
https://machinelearningmastery.com/s...-python-keras/

В учебном наборе у меня используется русский язык, однако в тексте много специфичских терминов, так что использовать заранее обученную модель word2vec не особо будет полезным.

Следующие параметры
Максимальная длина статьи - 969 слов (в среднем значительно меньше), но мы добавляем PAD вместо пустых слов.
размер получающегося словаря - 53886
Колилчество классов - 12 ( и они к сожалению распределены очень неравномерно, например первый класс содержит 5000 записий, а второй только 1500)

Также самая главная проблема - это размер учебного набора -
Всего 9876 записей
И увеличить его к сожалению никак нельзя.


Вот мой код

x, x_test, y, y_test = train_test_split(x_, y_, test_size=0.1)
x_train, x_dev, y_train, y_dev = train_test_split(x, y, test_size=0.1)

embedding_vecor_length = 100

model = Sequential()
model.add(Embedding(top_words, embedding_vecor_length, input_length=max_review_length))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=4, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=5, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=7, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=9, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=12, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(Conv1D(filters=32, kernel_size=15, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2) )
model.add(keras.layers.Dropout(0.3) )
model.add(LSTM(200,dropout=0.3, recurrent_dropout=0.3))
model.add(Dense(labels_count, activation='softmax'))
model.compile(loss='categorical_cro ssentropy', optimizer='adam', metrics=['accuracy'])

print(model.summary())

model.fit(x_train, y_train, epochs=25, batch_size=30)
scores = model.evaluate(x_tеst, y_test)


Я пробовал разные параметры, и сеть вроде работает.
Во время обучения получается очень большая тоночть (до 98%)
Но если проводить оценку - то максимум что я смог взять это было 74 процента (это были маленькие знаничения embedding_vecor_length, и batch_size)
Ну это явно оферфитинг..


Вопросы у меня такие
1) Правильно ли я построил модель в приципе? Я просто не совсем понимаю как текстовые данные сохраняются при конволюции (все примеры в интернете про картинки)
Может мне нужно использовать одновременную конволюцию с разными размерами фильтров и потом их мержить?
Вообще расскажите как правильно делать конволюцию для текста и какие размеры фильтров выбирать?
(мне кажется что в первом слое filters=32, kernel_size=3 конволюцию происходит только по 96 слловам? Или я не прав? и он берет весь текст?)

2) Как Решить проблему с оверффитингом? У меня нет возможности увеличить дата сет..
Я уже добавил Dropout (кстати правильно ли?)

3) Может нужна совсем другая структура сети? Например - читсая RNN?

Буду рад любым советам.
glorsh66 вне форума Ответить с цитированием
Старый 20.11.2017, 00:08   #2
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

1) У тебя странные данные. Каким образом статьи перегоняются в вектора?
Попробуй перевести данные в векторы с помощью tf-idf.
2) Попробуй для начала воспользоваться простой линейной регрессией. Она, внезапно, очень хорошо работает с текстом.
3) Есть ли какая-нибудь ещё информация о текстах?

А какие классы выделяются?
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 20.11.2017, 20:10   #3
glorsh66
 
Регистрация: 07.07.2017
Сообщений: 8
По умолчанию

Текст перегоняется в эмбединги при помощи вот этого кода -
https://github.com/jiegzhan/multi-cl...data_helper.py

tf-id- не пробовал

Текст профессионального плана, очень много сокращений и специфических терминов.
12 классов.
glorsh66 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
deeplearning4j классификация текста glorsh66 Общие вопросы по Java, Java SE, Kotlin 0 06.10.2017 20:51
Как улучшить код?! xEk Помощь студентам 6 08.05.2012 18:08
Как улучшить форум. Гриха О форуме и сайтах клуба 2798 30.11.2011 03:03
Как улучшить память?:-) Kudryavtsev Свободное общение 38 09.05.2011 20:27
Как улучшить макрос? Highlander Microsoft Office Excel 1 23.01.2010 12:15