LINUX.ORG.RU

Сообщения glorsh

 

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

Благодаря советам на этом форуме, я немного разобрался с особенностями конволюшион нетворк, но не понимаю их особенностей для классификации текста.

Я делаю нейронную сеть для классификации текста на русском языке по этим примерам - https://github.com/jiegzhan/multi-class-text-classification-cnn-rnn https://machinelearningmastery.com/sequence-classification-lstm-recurrent-neu...

В учебном наборе у меня используется русский язык, однако в тексте много специфичских терминов, так что использовать заранее обученную модель 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?

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

 ,

glorsh
()

Настройка нейронной сети для классификации текста

Нашел вот такой вот пример - https://github.com/jiegzhan/multi-class-text-classification-cnn-rnn для классификации текстов.

Но мне нужно немного подкорректировать код и настройки для того что бы распозновать статьи по 500 слов и на русскмо языке

Кто может сказать, какие настройки что значат тут?

«batch_size»: 256, «dropout_keep_prob»: 0.5, «embedding_dim»: 300, «evaluate_every»: 100, «filter_sizes»: «3,4,5», «hidden_unit»: 300, «l2_reg_lambda»: 0.0, «max_pool_size»: 4, «non_static»: false, «num_epochs»: 1, «num_filters»: 128

Особо интересно «dropout_keep_prob»: 0.5, «embedding_dim»: 300, «max_pool_size»: 4,

А то в гугле нет особой информации.

 ,

glorsh
()

RSS подписка на новые темы