Керас: Вывод Softmax в слой вложений

Вопрос или проблема

Я пытаюсь создать сеть кодировщик-декодировщик в Keras для генерации предложения определённого стиля. Так как моя задача является неконтролируемой, то есть у меня нет эталонных данных для сгенерированных предложений, я использую классификатор, чтобы помочь в процессе обучения. Я передаю вывод декодировщика в классификатор, чтобы он сказал мне, какой стиль у декодированного предложения.

Декодировщик выдает распределение softmax, которое я собирался напрямую передать классификатору, но я понял, что у него есть слой встраивания, который в Keras принимает только последовательности целых чисел, а не softmax/one-hot. Кто-нибудь знает, как это исправить?

Спасибо

Вы описываете вариацию Генеративных состязательных сетей (GANs). Генератор, часть модели, которая создает новые примеры, должен выводить полные предложения. Дискриминатор, классификатор, принимает эти полные предложения в качестве входных данных.

В частности, вы описываете DiscoGAN, который находит отношения между доменами, учитывая непарные данные. DiscoGAN были применены к стилю изображений.

Ответ или решение

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

Вот несколько шагов, которые помогут вам преодолеть эту проблему:

  1. Вывод токенов из softmax-распределения: Один из подходов заключается в том, чтобы взять выходные вероятности из softmax и преобразовать их в индексы токенов. Вы можете выбрать токены на основе максимального значения (argmax) из выходного распределения. Например:

    import numpy as np
    
    # декларация softmax выхода декодера
    softmax_output = model.decoder_output  # softmax выход декодера, shape: (batch_size, seq_length, vocab_size)
    predicted_indices = np.argmax(softmax_output, axis=-1)  # получаем индексы предполагаемых токенов
  2. Использование слоя Embedding: Далее, вы можете использовать эти индексы в слое Embedding. Если ваш классификатор ожидает вход в виде вложений, вы можете создать новую модель, которая будет включать этот слой Embedding, и передавать ей индексы, которые вы получили на предыдущем шаге:

    from keras.models import Model
    from keras.layers import Input, Embedding, LSTM, Dense
    
    # Пример структуры классификатора
    embedding_layer = Embedding(input_dim=vocab_size, output_dim=embedding_dim)
    classifier_input = Input(shape=(None,), dtype='int32')  # формы входа
    embeddings = embedding_layer(classifier_input)
    classifier_output = LSTM(units=hidden_units)(embeddings)
    classifier_output = Dense(num_classes, activation='softmax')(classifier_output)
    
    classifier_model = Model(classifier_input, classifier_output)
  3. Обучение модели: Обучение модели может происходить при помощи обратного распространения ошибки. Вы можете комбинировать потери от декодера и классификатора. Например, вы можете использовать кросс-энтропийную потерю для обоих выходов и суммировать их во время обучения.

  4. Тестирование подхода: Важно протестировать различные подходы к извлечению токенов из softmax-распределения, включая использование методов семплирования (например, топ-k выборка или ядерное семплирование) для создания более разнообразного и креативного вывода.

Таким образом, вы сможете передавать выход декодера в классификатор, используя токены, полученные из softmax-распределения. Это позволит вашей сети успешно обучаться и генерировать предложения заданного стиля, даже в условиях отсутствия разметки.

Если у вас есть дополнительные вопросы или требуется уточнение по какому-либо этапу, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...