Разве keras.layers.Flatten не теряет информацию?

Совершенно новый для keras и ML в целом. Я смотрю на https://machinelearningmastery.com/use-word-embedding-layers-deep-learning-keras/, и он использует Flatten между Embedding и Dense, потому что Embedding создает 2D-вектор, а Dense требует одного измерения.

Я уверен, что здесь я упускаю что-то очевидное, но почему это не теряет, какие слова находятся в каких входных векторах? Как мы все еще можем знать, что ввод № 3 был «хорошей работой» и связан с меткой № 3, 1, для «положительного»?

Я предполагаю, что исходные размеры сохраняются из исходного ввода, а затем каким-то образом восстанавливаются для вывода Dense? Или я просто полностью упускаю важный концептуальный аспект?

model = Sequential()
model.add(Embedding(vocab_size, 8, input_length=max_length))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

Спасибо за любое руководство!


person Jeff V.    schedule 29.05.2020    source источник


Ответы (1)


Слой встраивания дает вам вектор для каждого токена слова, поэтому результат будет двумерным. Нам нужно использовать flatten перед любым блоком классификатора.

Некоторая информация теряется, например, когда мы используем сверточные слои, а затем сглаживаем карты объектов, пространственная информация теряется. Но мы уже извлекаем наиболее важные функции с помощью слоев Conv и передаем эти функции полностью связанным слоям.

В вашем примере временное измерение больше не поддерживается, обычно желательно передать выходные данные матрицы внедрения на слой RNN/Conv для дальнейшего извлечения признаков.

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

  • Для каждого образца, скажем, nice work, мы получаем 2 вектора (1 для хорошего, 1 для работы), теперь мы хотим знать только общее настроение из предложения, поэтому, как только мы извлечем функции, мы можем применить плоскость.

person Zabir Al Nazi    schedule 29.05.2020
comment
Спасибо! Я все еще чего-то не хватает. Допустим, наши входные данные nice job, метка 0 this sucks, метка 1 Преобразуется в [[1, 2], [3,4]] Flatten превращает [[1,2], [3,4]] в [1,2,3,4]. Любое обучение происходит на [1,2,3,4], а не [[1,2], [3,4]], да? Но нам нужно разделить входные данные, чтобы выяснить, какие шаблоны применяются для сопоставления данного ввода с его меткой, верно? Но разве мы не потеряли тот факт, что sample[0] было [1,2], а sample[1] было [3,4]? Очевидно, это работает, поэтому я знаю, что упускаю что-то основное. Просто без понятия что. :D - person Jeff V.; 30.05.2020
comment
Я сказал вам в вопросе, что сглаживание не работает в пакетном измерении (первая ось, обозначающая номер образца), это означает, что [1,2] и [3,4] всегда остаются разделенными. Также слой внедрения дает вам вектор для каждого токена, так что 1 -> [0,5, 0,2, -0,5] что-то вроде этого. Также веса будут умножены, и к текстовой последовательности будет добавлено смещение. - person Zabir Al Nazi; 30.05.2020
comment
Хорошо, я думаю понимаю, о чем вы говорите, но мой главный вывод заключается в том, что исходные образцы ДЕЙСТВИТЕЛЬНО остаются отдельными. (Да, я знаю о векторизации, смещении и т. д. Я просто пытался сделать это простым и кратким.) Еще раз спасибо! РЕДАКТИРОВАТЬ: О, подождите, может быть, то упрощение, которое я ввел, запятнало всю цель сглаживания. В любом случае, я готов двигаться дальше. Спасибо за помощь. - person Jeff V.; 30.05.2020