+ Ответить в теме
Показано с 1 по 3 из 3

Тема: Keras - классификация текста - оверфиттинг, и как улучшить модель

  1. #1
    dummy glorsh66 is on a distinguished road
    Регистрация
    09.07.2017
    Возраст
    40
    Сообщений
    3
    Вес репутации
    0

    По умолчанию 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_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?

    Буду рад любым советам.

  2. По умолчанию

     
    Хотите избавиться от рекламы? Зарегистрируйтесь
  3. #2
    Administrator Админ
    system architect
    AiK is on a distinguished road Аватар для AiK
    Регистрация
    13.02.2004
    Адрес
    СПб
    Сообщений
    2,298
    Вес репутации
    80

    По умолчанию Re: Keras - классификация текста - оверфиттинг, и как улучшить модель

    Некоторые соображения:

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

    2. Не видно работы по оценке качества первичной классификации. Собственно никто не запрещает существование неверно классифицированных текстов в обучающей выборке. После обнаружения таких текстов есть два варианта действий - выбросить их, если их мало или научиться классифицировать их, если таких аномальных текстов много.

    3. С учётом пп.1 и 2 соотношение 98% - 74% не выглядит плохим. То есть как минимум требуется обосновать, почему такая точность считается плохой.

    4. С количеством текстов решить проблему элементарно - разбить тексты одного автора на предложения и рандомно сгенерировать из них любое количество текстов любой нужной длины. Если информации об авторстве нет, то разбивать тексты на предложения внутри одного класса.
    Даже самый дурацкий замысел можно воплотить мастерски

  4. #3
    dummy glorsh66 is on a distinguished road
    Регистрация
    09.07.2017
    Возраст
    40
    Сообщений
    3
    Вес репутации
    0

    По умолчанию Re: Keras - классификация текста - оверфиттинг, и как улучшить модель

    Кстати да! Попробовал почистить тестовые данные. Основной проблемой оказалось, что некоторые штуки можно было отнести сразу к нескольким категориям.
    Иначе говоря категория: прочее, иное
    Убрал эту категорию и точность значительно увеличилась

    И удалось поднять точность до 95% процентов.

+ Ответить в теме

Похожие темы

  1. Как улучшить макрос?!
    Добрый день! Подскажите, пожалуйста, есть следующий макрос: Sub Макрос1() Sheets("26.06.09").Select Range("A2:L3").Select ...
    от Gerek в разделе MS Office и VB(A).
  2. графический режим, каркасная модель
    Нужна пощь: требуется написать программу вывода на экран каркасной модели тора("бублик"). Представляю себе, как выглядит тор, знаю как задать его в...
    от alexini в разделе Delphi и Pascal
  3. Как улучшить(усложнить) поиск
    Дело в том , что берётся для поиска например это: С-2384-Н/С-2818-Н Гарнитур д/мальчика 110,116-60 А там где ищет вот так: С-2384-Н/С-2818-Н...
    от Alex_2006 в разделе MS Office и VB(A).
  4. Объектная модель браузеров
    Я сделал движущиеся новости. Все хорошо токо вот работает токо для IE а для NetScape и Мазилы не пашет. Для Opera для последней версии пашет на...
    от Bolat в разделе JScript, VBScript, DHTML...
  5. Мат.модель шахмат
    Уважаемые участники форума, помогите мне с поиском и выбором алгоритма для создания ИИ к шахматам (можно на Си или Java, но с коментариями).
    от DeuSeX в разделе Алгоритмы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения