LINUX.ORG.RU

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

 ,


0

1

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

Я делаю нейронную сеть для классификации текста на русском языке по этим примерам - 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 (всего исправлений: 3)

Далее мнение (около)диванного ML-ка :

«В учебном наборе у меня используется русский язык, однако в тексте много специфичских терминов, так что использовать заранее обученную модель word2vec не особо будет полезным.» Но почему бы таки не попробовать? Можно же оставить эмбеддинг обучаемым. Правда, хрен знает, будет ли профит. Если будет - понадобится меньшая подстройка эмбеддинга.

«Как Решить проблему с оверффитингом? У меня нет возможности увеличить дата сет.. Я уже добавил Dropout (кстати правильно ли?)» Попробуй снизить число параметров (читай - число нейронов в отдельных слоях - а то и слоёв).

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

«Я просто не совсем понимаю как текстовые данные сохраняются при конволюции (все примеры в интернете про картинки» Подменяем каждой слово вектором. Тогда текст будет соответствовать матрице какого-то размера. А дальше проходимся свёртками по отдельным её строкам (читай - векторам отдельных слов).

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

з.ы.2. да и вообще - вопросы скорее для какого-нибудь ods.ai, не ЛОР-а :-)

anonymous
()
Ответ на: комментарий от anonymous

Ну ненейросетевыми средствми решить трудно - так как важно ухватывать связь между словами. Т.е. просто по ключевым словам плохо работает. даже naive bayes, очень плохо себя показать

Задача просто классифицировать текс по категориям.

glorsh
() автор топика

Родина дала им PyTorch с человеческим API и динамическими графами - не хотим, хотим жрать керас.

anonymous
()
Ответ на: комментарий от glorsh

Запости что ли выхлоп конструкции вида

model.fit(... , validation_split=0.1, verbose=True)

сюда.

з.ы. а сетку таки попробуй упростить.

anonymous
()
Ответ на: комментарий от anonymous

Я, конечно, спец поддиванный (а сейчас ещё и сонный и заебавшийся экспериментами над одним «специфичным» классификатором, так что тупить могу адово), но - можно мне пример, когда возможность «писать на питоне» (а не скормить ИНС какой-то питоновыхлоп или обрабать выход одной tf-й функции/скормить обработанный выхлоп другой) становится прямо-таки киллерфичей применительно к нашему роду задач?

anonymous
()
Ответ на: комментарий от anonymous

Только RNN же реализуемы и без этого.

Или я адово туплю или здесь надо что-то уточнить.

Впрочем, пожалуй я таки лучше попробуй сам таки глянуть, что за зверь, и чем офигенен.

anonymous
()
Ответ на: комментарий от anonymous

Хм, а ведь и в самом деле туплю. То ли по части реализации, то ли по части того, как именно реализуется. Нафиг, надо всё-таки уже ребутнуться :-)

anonymous
()

Кстати хотел просто общего совета спросит - раз уж пошло дело

Как упростить сетку?

Я правильно понимаю что в случае с тектом конвлюция идет по словам? Но как тогда правильно настроить фильтры? и размеры и паддинг? model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')) Это значит что фильтр пройдется по 3-м словм 32 раза?

glorsh
() автор топика
Ответ на: комментарий от glorsh

Попробуй, например, выкинуть какой-либо свёрточно-пулинговый блок. Или уменьшить число фильтров.

«Но как тогда правильно настроить фильтры? и размеры и паддинг? model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')) Это значит что фильтр пройдется по 3-м словм 32 раза?»

Нет. 32 разных фильтра. И они пройдут по 3-граммам, да. (кстати, а не перебор?)

И, кстати, не пытался юзать в качестве бейзлайна сетку отсюда? https://github.com/bhaveshoswal/CNN-text-classification-keras

anonymous
()
Ответ на: комментарий от anonymous

Эту не пробовал еще, спасибо за ссылку интересное решение попробую. Мне кажется норм будет если к нему еще lstm прикрутить.

А в плане перебор? Имеешь ввииду сделать меньше - 2?

Просто во всех примерах используют 3 размера 3,4,5 Но опытным путем я выявил что точность выше есои еще несколько слоев добавить.

glorsh
() автор топика
Ответ на: комментарий от anonymous

Создаем модель _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding_1 (Embedding) (None, 969, 150) 8082900 _________________________________________________________________ conv1d_1 (Conv1D) (None, 969, 32) 14432 _________________________________________________________________ max_pooling1d_1 (MaxPooling1 (None, 484, 32) 0 _________________________________________________________________ conv1d_2 (Conv1D) (None, 484, 32) 4128 _________________________________________________________________ max_pooling1d_2 (MaxPooling1 (None, 242, 32) 0 _________________________________________________________________ conv1d_3 (Conv1D) (None, 242, 32) 5152 _________________________________________________________________ max_pooling1d_3 (MaxPooling1 (None, 121, 32) 0 _________________________________________________________________ conv1d_4 (Conv1D) (None, 121, 32) 7200 _________________________________________________________________ max_pooling1d_4 (MaxPooling1 (None, 60, 32) 0 _________________________________________________________________ conv1d_5 (Conv1D) (None, 60, 32) 9248 _________________________________________________________________ max_pooling1d_5 (MaxPooling1 (None, 30, 32) 0 _________________________________________________________________ conv1d_6 (Conv1D) (None, 30, 32) 12320 _________________________________________________________________ max_pooling1d_6 (MaxPooling1 (None, 15, 32) 0 _________________________________________________________________ conv1d_7 (Conv1D) (None, 15, 32) 15392 _________________________________________________________________ max_pooling1d_7 (MaxPooling1 (None, 7, 32) 0 _________________________________________________________________ lstm_1 (LSTM) (None, 200) 186400 _________________________________________________________________ dropout_1 (Dropout) (None, 200) 0 _________________________________________________________________ dense_1 (Dense) (None, 12) 2412 ================================================================= Total params: 8,339,584 Trainable params: 8,339,584 Non-trainable params: 0 _________________________________________________________________ None Train on 9876 samples, validate on 1098 samples Epoch 1/18 2017-11-19 14:43:46.131272: W C:\tf_jenkins\home\workspace\rel-win\M\windows\PY\36\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations. 9876/9876 [==============================] - 940s - loss: 1.2232 - acc: 0.5966 - val_loss: 0.8698 - val_acc: 0.6894 Epoch 2/18 9876/9876 [==============================] - 608s - loss: 0.7183 - acc: 0.7449 - val_loss: 0.7112 - val_acc: 0.7423 Epoch 3/18 9876/9876 [==============================] - 804s - loss: 0.5169 - acc: 0.8236 - val_loss: 0.6244 - val_acc: 0.7942 Epoch 4/18 9876/9876 [==============================] - 916s - loss: 0.3852 - acc: 0.8665 - val_loss: 0.7041 - val_acc: 0.7887 Epoch 5/18 9876/9876 [==============================] - 1147s - loss: 0.3090 - acc: 0.8946 - val_loss: 0.7218 - val_acc: 0.7869 Epoch 6/18 9876/9876 [==============================] - 902s - loss: 0.2269 - acc: 0.9251 - val_loss: 0.9223 - val_acc: 0.7532 Epoch 7/18 3060/9876 [========>.....................] - ETA: 584s - loss: 0.1917 - acc: 0.9402

Да я чуть упростил модель. Пока считается частичный результат- видно, val_acc начинает падать после 5 эпохи.

glorsh
() автор топика

Гуру - подсказиже вот такой момент -вот максимальная длинна слов в предложении у меня 969

Какой размер фильтра и колличество фильтров я должен ставить в первой конволюции? 969/2 = 482.5 Поулчается 482?

model.add(Conv1D(filters=482, kernel_size=2, padding='same', activation='relu'))

А если в первом размер филтра 3 то 969/3 = 323 model.add(Conv1D(filters=323, kernel_size=3, padding='same', activation='relu'))

Или это не зависит от размера предложения?

А во втором и дальше? Размер колличество фильтров должно быть одно и тоже?

Т.е. - если у меня в первом слое конволюции - размер 3 и колличетсво фильтров 32 то он не пройдет по всем словам? Т.е. 3*32 = 96 слов. и по скольку у меня стоит пуллинг в 2, то это будет половина из этого? 48 И последующие слои конволюции будут выбирать особенности из этих слов?

Во всех гайдах - написанно про картинки. Там один пиксель потерять это фигня, но тексте каждое слово важно...

Или там по другому работает?

Потом - что по поводу -Пуллинга какой размер? model.add(MaxPooling1D(pool_size=2))

Короче может кто нибудь подсказать как эти параметры сходятся с размером предложения и размером эмбедингс?

Также колличество LSTM ячеек должно соответсвовать чему?

glorsh
() автор топика
Ответ на: комментарий от anonymous

9876/9876 [==============================] - 940s - loss: 1.2232 - acc: 0.5966 - val_loss: 0.8698 - val_acc: 0.6894 Epoch 2/18 9876/9876 [==============================] - 608s - loss: 0.7183 - acc: 0.7449 - val_loss: 0.7112 - val_acc: 0.7423 Epoch 3/18 9876/9876 [==============================] - 804s - loss: 0.5169 - acc: 0.8236 - val_loss: 0.6244 - val_acc: 0.7942 Epoch 4/18 9876/9876 [==============================] - 916s - loss: 0.3852 - acc: 0.8665 - val_loss: 0.7041 - val_acc: 0.7887 Epoch 5/18 9876/9876 [==============================] - 1147s - loss: 0.3090 - acc: 0.8946 - val_loss: 0.7218 - val_acc: 0.7869 Epoch 6/18 9876/9876 [==============================] - 902s - loss: 0.2269 - acc: 0.9251 - val_loss: 0.9223 - val_acc: 0.7532 Epoch 7/18 9876/9876 [==============================] - 863s - loss: 0.1743 - acc: 0.9464 - val_loss: 0.7812 - val_acc: 0.8042 Epoch 8/18 9876/9876 [==============================] - 649s - loss: 0.1385 - acc: 0.9605 - val_loss: 0.8151 - val_acc: 0.7878 Epoch 9/18 9876/9876 [==============================] - 1024s - loss: 0.1166 - acc: 0.9667 - val_loss: 0.8727 - val_acc: 0.7896 Epoch 10/18 9876/9876 [==============================] - 1156s - loss: 0.0971 - acc: 0.9728 - val_loss: 0.8907 - val_acc: 0.7969 Epoch 11/18 9876/9876 [==============================] - 879s - loss: 0.0839 - acc: 0.9769 - val_loss: 0.9333 - val_acc: 0.8133 Epoch 12/18 9876/9876 [==============================] - 1061s - loss: 0.0774 - acc: 0.9780 - val_loss: 1.0237 - val_acc: 0.7942 Epoch 13/18 9876/9876 [==============================] - 1198s - loss: 0.0685 - acc: 0.9813 - val_loss: 1.1245 - val_acc: 0.7851 Epoch 14/18 9876/9876 [==============================] - 1370s - loss: 0.0702 - acc: 0.9796 - val_loss: 1.0527 - val_acc: 0.8078 Epoch 15/18 9876/9876 [==============================] - 1197s - loss: 0.0581 - acc: 0.9845 - val_loss: 1.1206 - val_acc: 0.7914 Epoch 16/18 9876/9876 [==============================] - 1444s - loss: 0.0522 - acc: 0.9854 - val_loss: 1.0479 - val_acc: 0.7887 Epoch 17/18 9876/9876 [==============================] - 1304s - loss: 0.0613 - acc: 0.9833 - val_loss: 1.1822 - val_acc: 0.7905 Epoch 18/18 9876/9876 [==============================] - 1211s - loss: 0.0536 - acc: 0.9862 - val_loss: 1.0543 - val_acc: 0.7869 Оцениваем модель 1220/1220 [==============================] - 22s Accuracy: 78.77%

Accuracy: 78.77% - это точность на отдельном сете.

glorsh
() автор топика

Это у тебя тренировочная задача или реальная? Зачем это нужно? Серьёзно интересуюсь, я не тролль.

djambeyshik ★★★★★
()
Ответ на: комментарий от djambeyshik

Ну наполовину так наполовину так. Наполовину для увинера в качестве курсача (да да, есть норм преподы которые интересные темы задают)

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

Кстати заметил какую особенность - Если убрать размеры фильтров 9,12,15 то сеть перестает тренироваться в принципе. Т.е. с 3,4,5 она вообще не тренируется.

Видимо значит есть связь между большим колличеством слов.

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

glorsh
() автор топика
Ответ на: комментарий от glorsh

Наполовину для увинера в качестве курсача (да да, есть норм преподы которые интересные темы задают)

Ну, у нас преподы предоставляют свободу выбора темы. А по списку выбирают только отсталые дногруппники. Какая у тебя тема курсача, собственно?

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

Там есть разноплановые документы, которые необходимо систематизировать?

djambeyshik ★★★★★
()

У тебя тупо нет данных для обучения сети такой глубины. Смирись, выдохни, возьми BoW + LogReg и будет лучше.

Solace ★★
()
Ответ на: комментарий от djambeyshik

Не документы просто текст в ограмных колилчествах. Скажем так описание продукта и его нужно помещать в разные категории.

Ну тема была выбрана не случайно) Просто она интересная и практичная.

glorsh
() автор топика
Ответ на: комментарий от glorsh

Ну да, с объемом данных все плохо....

Я плохо себе представляю механизм работы подобной нейросети, но почему с объёмом данных всё плохо? Маленький корпус текстов для того, чтобы «скормить» их ей?

djambeyshik ★★★★★
()
Ответ на: комментарий от djambeyshik

Защита информации, но там вообще не этому учат, и если честно токо нейросети интересы из всей программы.

Не, просто мало примеров. Желательно сотни тысяч примеров для норм обучения.

Удалось немного повысить точность. Вот доведу до 90% и успокоюсь☻

9876/9876 [==============================] - 1149s - loss: 1.3075 - acc: 0.5727 - val_loss: 1.1405 - val_acc: 0.6266 Epoch 2/18 9876/9876 [==============================] - 5263s - loss: 0.9275 - acc: 0.6808 - val_loss: 0.8602 - val_acc: 0.7222 Epoch 3/18 9876/9876 [==============================] - 930s - loss: 0.6462 - acc: 0.7856 - val_loss: 0.6979 - val_acc: 0.7869 Epoch 4/18 9876/9876 [==============================] - 1176s - loss: 0.4205 - acc: 0.8662 - val_loss: 0.6963 - val_acc: 0.7969 Epoch 5/18 9876/9876 [==============================] - 1230s - loss: 0.2822 - acc: 0.9134 - val_loss: 0.6923 - val_acc: 0.7942 Epoch 6/18 9876/9876 [==============================] - 1355s - loss: 0.2004 - acc: 0.9401 - val_loss: 0.8544 - val_acc: 0.7714 Epoch 7/18 9876/9876 [==============================] - 1308s - loss: 0.1621 - acc: 0.9540 - val_loss: 0.7375 - val_acc: 0.8106 Epoch 8/18 9876/9876 [==============================] - 1436s - loss: 0.1189 - acc: 0.9675 - val_loss: 0.9071 - val_acc: 0.8024 Epoch 9/18 9876/9876 [==============================] - 1215s - loss: 0.1148 - acc: 0.9677 - val_loss: 0.9344 - val_acc: 0.8115 Epoch 10/18 9876/9876 [==============================] - 1060s - loss: 0.0942 - acc: 0.9734 - val_loss: 0.9908 - val_acc: 0.8005 Epoch 11/18 9876/9876 [==============================] - 978s - loss: 0.0839 - acc: 0.9779 - val_loss: 0.9646 - val_acc: 0.8169 Epoch 12/18 9876/9876 [==============================] - 1459s - loss: 0.0743 - acc: 0.9792 - val_loss: 1.0403 - val_acc: 0.8042 Epoch 13/18 9876/9876 [==============================] - 1518s - loss: 0.0723 - acc: 0.9801 - val_loss: 1.0395 - val_acc: 0.8197 Epoch 14/18 9876/9876 [==============================] - 1321s - loss: 0.0669 - acc: 0.9809 - val_loss: 1.0074 - val_acc: 0.8224 Epoch 15/18 9876/9876 [==============================] - 970s - loss: 0.0656 - acc: 0.9840 - val_loss: 1.0333 - val_acc: 0.8024 Epoch 16/18 9876/9876 [==============================] - 893s - loss: 0.0552 - acc: 0.9850 - val_loss: 1.0649 - val_acc: 0.8124 Epoch 17/18 9876/9876 [==============================] - 904s - loss: 0.0492 - acc: 0.9868 - val_loss: 1.0862 - val_acc: 0.8142 Epoch 18/18 9876/9876 [==============================] - 897s - loss: 0.0464 - acc: 0.9877 - val_loss: 1.1304 - val_acc: 0.8151 Оцениваем модель 1220/1220 [==============================] - 15s Accuracy: 80.41%

glorsh
() автор топика
Ответ на: комментарий от glorsh

Не, просто мало примеров. Желательно сотни тысяч примеров для норм обучения.

Прошу прощения за череду тупых и нубских вопросов, но какого рода примеры используются? Допустим, записи из блогов и статьи из википедии можно парсить и скармливать? Там полно материала. Ещё можно брать из открытого доступа разнообразные юридические документы, государственные организации обычно обязывают это выкладывать на сайты. Я уверен, что есть возможность каким-нибудь скриптом это автоматически оттуда утаскивать. В конце концов, можно кодексы и конституции разных стран и эпох давать. Это если я правильно понял суть, если нет - поправь...

djambeyshik ★★★★★
()
Ответ на: комментарий от glorsh

Я упросил модель тем, что убрал кучу dopout слоев

Поздравляю. Дропауты-то убирать зачем - они тебе как-раз таки нелишни - да и тебе надо снизить число «обучаемых» параметров, а их у дропаута нет?

Я бы таки убирал свёртки. И да - на обучающей выборке результат, конечно, упадёт. Вопрос в том, какой максимальный лосс будет на валидационной выборке.

з.ы. и да, кстати, в самом деле - а нет ли возможности сделать следующее:

- найти кучу текстов схожей тематики, обучить на них эмбеддинг

- (возможно) если эти тексты классифицированы, или их можно классифицировать - обучить сеть на них

- а потом использовать предобученную сеть на своей задаче.

з.ы.2. и всё же, для сравнения - какой скор достигается на Bag Of Words с логистической регрессией? И на какие категории/какого рода классифицируешь тексты?

anonymous
()
Ответ на: комментарий от anonymous

Такая схема почему то вообще не учиться....

main_input = Input(shape=(max_review_length,), dtype='int32', name='main_input')
embd = Embedding(top_words,embedding_vecor_length, input_length=max_review_length)(main_input)

conv1 = Conv1D(filters=32, kernel_size=3, padding='same', activation='relu')(embd)
conv2 = Conv1D(filters=32, kernel_size=4, padding='same', activation='relu')(embd)
conv3 = Conv1D(filters=32, kernel_size=5, padding='same', activation='relu')(embd)
conv4 = Conv1D(filters=32, kernel_size=7, padding='same', activation='relu')(embd)
conv5 = Conv1D(filters=32, kernel_size=9, padding='same', activation='relu')(embd)
conv6 = Conv1D(filters=32, kernel_size=12, padding='same', activation='relu')(embd)
conv7 = Conv1D(filters=32, kernel_size=15, padding='same', activation='relu')(embd)



pool1 = MaxPooling1D(pool_size=2)(conv1)
pool2 = MaxPooling1D(pool_size=2)(conv2)
pool3 = MaxPooling1D(pool_size=2)(conv3)
pool4 = MaxPooling1D(pool_size=2)(conv4)
pool5 = MaxPooling1D(pool_size=2)(conv5)
pool6 = MaxPooling1D(pool_size=2)(conv6)
pool7 = MaxPooling1D(pool_size=2)(conv7)


concat = keras.layers.concatenate([pool1, pool2,pool3,pool4,pool5,pool6,pool7])
lstm_out = LSTM(200)(concat)

output_test = Dense(labels_count, activation='softmax')(lstm_out)

model = Model(inputs=main_input, outputs=output_test)
#model = Model(inputs=main_input, outputs=output_test)

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(x_train, y_train, epochs=18, batch_size=50,validation_split=0.1, verbose=True)

glorsh
() автор топика

Короче сильно увеличил точность тем, что убрал категории которые не совсем одназначны (из тестовых данных) (ну которые могут две или более категории содержать)

И точность стала около 95 процентов на тестовых данных!

glorsh
() автор топика
Ответ на: комментарий от glorsh

Потом как в надлежащий вил приведу код и немного потещу - выложу на github

glorsh
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.