мой вопрос по своей природе близок к поиску встраивания столбцов функций, однако я не смог прокомментировать там дан ответ (недостаточно репутации), и я думаю, что отвечающий либо не полностью понял вопрос, либо ответ был не совсем тем, что было задано.
ЦЕЛЬ
Для обслуживания специального оценщика, который использует Dataset API для ввода данных. Задача - NMT (seq2seq).
Проблема
Оценщик требует в качестве входных данных feature_columns для обслуживания. В моей задаче NMT есть только одна функция: вводимое предложение для перевода (или, возможно, каждое слово в предложении является функцией?). И поэтому я не уверен, как построить feature_column (и, таким образом, embedding_column и, наконец, input_layer), используя мои входные предложения в качестве функции, которую можно передать в RNN (которая ожидает embedding_lookup [batch_size, max_seqence_len, embedding_dim]), который, наконец, позвольте мне служить Оценщику.
Фон
Я пытаюсь использовать настраиваемый оценщик для реализации NMT в стиле seq2seq. Мне нужно иметь возможность обслуживать модель через tf-serve, что, по-видимому, относительно легко сделать оценщики.
Однако я наткнулся на препятствие с «как» служить модели. Насколько я могу судить, мне нужны «feature_columns», которые будут входить в модель.
Показывает, что вам нужен export_input_fn, который использует feature_spec, которому в качестве входных данных требуется feature_column (s). Это имеет смысл, однако, для моего варианта использования у меня нет набора (разных) функций, вместо этого у меня есть предложения ввода (где каждое слово является функцией), которые нужно искать с помощью встраиваний и использовать в качестве функций ...
Итак, я знаю, что мне нужны входные данные для моей модели в виде столбцов функций. Мой ввод для NMT - это просто тензор [batch_size, max_sequence_len], который заполняется индексами слов из предложений (например, для batch_size = 1 [3, 17, 132, 2, 1, 0, ...] где каждый индекс должен отображаться на вектор внедрения). Обычно я скармливаю это в embedding_lookup через
embs = tf.get_variable('embedding', [vocab_size, embedding_dim])
tf.nn.embedding_lookup(embs, inputs)
и мне было бы хорошо пойти, я мог бы передать это в RNN в качестве входных данных, а остальное - история, а не проблема.
НО, вот где я столкнулся с проблемой, мне нужно использовать feature_columns (чтобы я мог обслуживать модель). Ответ на вопрос, который я упомянул в начале, показывает, как использовать embedding_column, но вместо этого он предлагает, чтобы встраивание рассматривало все предложение как одну единственную функцию, но обычно вы должны искать каждое слово в предложении и получить его вложение.
Точно так же https://www.damienpontifex.com/2018/01/02/using-tensorflow-feature-columns-in-your-custom-estimator-model/
Показывает, «как реализовать функциональный столбец в настраиваемом оценщике», и действительно, его код «До» совершенно правильный (как я написал), tf.get_variable в tf.nn.embedding_lookup, но его код «после», опять же, включает только 1 функцию (все предложение?).
Я проверил это, используя их код и передав свои данные из [batch_size, max_seq_len] в tf.feature_column.categorical_column_with_identity, а выходной тензор равен [batch_size, embedding_dim]
информация о последовательности потеряна? Или просто сплющивается? когда я печатаю вывод его размер (?, embedding_dim) где? обычно мой размер batch_size.
РЕДАКТИРОВАТЬ: Я подтвердил, что форма [batch_size, embedding_dim] не просто сплющена ... Таким образом, информация о последовательности потеряна
Я предполагаю, что он должен обрабатывать ввод как одну функцию ввода (таким образом, batch_size = 1 ex [3, 17, 132, 2, 1, 0, ...], где каждый индекс сопоставляется с вектором внедрения) будет отображать с одной функцией, которая не является тем, что нам нужно, мы хотим, чтобы каждый индекс отображался на встраивание, а требуемый результат - [batch_size, max_seq_len, embedding_dim].
Похоже, что мне вместо этого нужен не один category_column_with_ *, а их количество max_seq_len (1 для каждого слова в моей последовательности), это звучит правильно? Каждое слово будет особенностью моей модели, поэтому я склоняюсь к тому, чтобы это был правильный подход, но здесь также есть проблемы. Я использую Dataset API, поэтому в моем input_train_fn () я загружаю свои данные из файла, а затем использую tf.data.Dataset.from_tensor_slices (data, labels), чтобы разделить данные на тензоры, которые затем я могу dataset.batch ( batch_size) .make_one_shot_iterator (). get_next () для передачи в мой Оценщик. Я не могу выполнять итерацию по каждому пакету (тестеры не повторяются), поэтому я не могу просто создать 100 feature_columns для каждого входного пакета ...
Кто-нибудь знает, как это сделать? Этот встраиваемый поиск - очень простая вещь, которую можно сделать с помощью простых заполнителей или переменных (и это общий подход в задачах НЛП). Но когда я отваживаюсь на Dataset API и оценщики, я наталкиваюсь на стену, в которой очень мало информации (это не базовый пример).
Я допускаю, что у меня могут быть пробелы в моем понимании, пользовательские оценщики и API наборов данных для меня внове, и поиск информации о них иногда может быть затруднен. Так что не стесняйтесь давать мне информацию.
Спасибо, что прочитали мою стену с текстом и, надеюсь, помогли мне (и другие, которых я видел, задают вопрос, похожий на этот, но не получают ответа https://groups.google.com/a/tensorflow.org/forum/#!searchin/Discuss/embeddings 20 долларов США в 20 долларов США по индивидуальному заказу $ 20estimator / Discussion / U3vFQF_jeaY / EjgwRQ3RDQAJ Мне жаль этого парня, на его вопрос не было ответа (по той же причине, что изложена здесь, и его ветка была захвачена ...).