На этом шаге мы рассмотрим особенности создания такой модели.
Задача классификации по темам напоминает предыдущую задачу с отзывами: в обоих случаях мы пытаемся классифицировать короткие фрагменты текста. Но теперь количество выходных классов увеличилось с 2 до 46. Размерность выходного пространства стала намного больше.
В стеке слоев Dense, как в предыдущем примере, каждый слой имеет доступ только к информации, предоставленной предыдущим слоем. Если один слой отбросит какую-то информацию, важную для решения задачи классификации, последующие слои не смогут восстановить ее: каждый слой может стать для нее бутылочным горлышком. В предыдущем примере мы использовали 16-мерные промежуточные слои, но 16-мерное пространство может оказаться слишком ограниченным для классификации на 46 разных классов: именно такие малоразмерные слои могут сыграть роль бутылочного горлышка для информации, не пропуская важные данные.
По этой причине в данном примере мы будем использовать слои с большим количеством измерений. Давайте выберем 64 нейрона.
from tensorflow import keras from tensorflow.keras import layers model = keras.Sequential([ layers.Dense(64, activation="relu"), layers.Dense(64, activation="relu"), layers.Dense(46, activation="softmax") ])
Отметим еще две особенности этой архитектуры.
Лучшим претендентом на роль функции потерь в данном случае является функция categorical_crossentropy. Она определяет расстояние между распределениями вероятностей: в данном случае между распределением вероятности на выходе модели и истинным распределением меток. Минимизируя расстояние между этими двумя распределениями, мы учим модель выводить результат, максимально близкий к истинным меткам.
model.compile(optimizer="rmsprop", loss="categorical_crossentropy", metrics=["accuracy"] )
На следующем шаге мы рассмотрим проверку решения.