Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Keras - классификация текста - оверфиттинг, и как 
:(
    Опции темы
glorsh66
Дата 19.11.2017, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 9.7.2017

Репутация: нет
Всего: нет



Я делаю нейронную сеть для классификации текста на русском языке по этим примерам - 
https://github.com/jiegzhan/multi-class-tex...ication-cnn-rnn
https://machinelearningmastery.com/sequence...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_crossentropy', 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?

Буду рад любым советам.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0987 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.