Тензорные формы вывода декодера и softmax_cross_entropy_with_logits
Я делаю пару encoder_decoder в тензорном потоке. Это генерация текста со стандартным использованием softmax для прогнозирования следующего слова.
stepwise_cross_entropy = tf.nn.softmax_cross_entropy_with_logits( labels =
tf.one_hot( decoder_tgt, depth = vocab_size,
dtype = tf.float32), logits = decoder_logits )
decoder_tgt - целевой текст декодера, вектор идентификаторов слов. tf.one_hot изменяет форму этого вектора с [ num_timesteps, batch_size ] на [num_timesteps, batch_size, vocabulary_size].
decoder_logits имеет форму (?,?, vocabulary_size) и поэтому должен быть подходящей формой для наших целей.
Данные, которые я использую для проверки этого, имеют длину последовательности 5, размер партии 100 и размер словаря 27994. Таким образом, dec_tgt должен иметь форму [ 5, 100, 27994 ].
Все это кажется чистым, и когда я работаю над этим на бумаге, это чисто. Но когда я запускаю свой график, я получаю сообщение об ошибке:
logits and labels must be same size: logits_size=[1000,27994] labels_size=
[500,27994]
Похоже, что tf.one_hot для меток ошибочно возвращает тензор формы [num_timesteps * batch_size, vocabulary_size] (чего не происходит, если я сам выполняю операцию), а logits возвращает [2*num_timesteps*batch_size, vocabulary_size] без причины пока не вижу.
Я просматривал свой код в течение пары часов и ничего не могу найти.
Код здесь: https://github.com/scottleith/lstm/blob/master/Attempted%20encoder-decoder%20LSTM.py
Конкретный рассматриваемый раздел начинается со строки 246 (формы декодера), хотя проблема может быть в другом месте.