Tensorflow.js - У слова dict, представленного в model.execute(dict), есть неиспользованные ключи: [0,1,2,3,4,5,6,7,8,9...]

В настоящее время у меня есть модель seq2seq, которая обучалась TF, и я также могу успешно тестировать через TF. Я хотел посмотреть, смогу ли я экспортировать его для tenorflow.js, но мне еще не удалось заставить его работать с tfjs или TF Serving. Я, наконец, смог вчера заморозить модель и преобразовать ее в tenorflow.js, однако есть кое-что, чего я не понимаю в общем процессе реализации, и я надеялся, что кто-то с большим опытом может увидеть, что я делаю неправильно или нет схватившись в необходимом процессе и может обеспечить удар в нужном направлении.

Теперь я могу загрузить модель с помощью функции loadFrozenModel tenorflow.js, однако, когда я иду к прогнозу, я получаю следующую ошибку.

Диктовка, представленная в model.execute(dict), имеет неиспользованные ключи: [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190]. Пожалуйста, предоставьте только следующие ключи: [].

Это теперь заставило меня задуматься, не правильно ли я экспортирую режим, а также логику, выполняемую при изменении ввода, однако кажется, что он не хочет, чтобы что-либо передавалось в вызов execute.

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

Если у кого-нибудь есть совет, пожалуйста, бросьте его мне. Я отправлю обратно, если я выясню это.

Фрагмент логики, которую я использую в реализации tenorflow.js:

...
async init(urls) {
    this.urls = urls;
    this.model = await loader.loadHostedPretrainedModel(urls.model, urls.metadata);
    return this;
  }

  predict(text) {
    var retval = this.model.execute(text);
    console.log(retval);

Фрагмент учебного кода и "модель-заставка":

...
add_arguments(parser)
args = parser.parse_args()
with open("args.pickle", "wb") as f:
    pickle.dump(args, f)

if not os.path.exists("saved_model"):
    os.mkdir("saved_model")

print("Building dictionary...")
word_dict, reversed_dict, article_max_len, summary_max_len = build_dict("train", args.toy)
print("Loading training dataset...")
train_x, train_y = build_dataset("train", word_dict, article_max_len, summary_max_len, args.toy)

tf.reset_default_graph()

with tf.Session() as sess:

    model = Model(reversed_dict, article_max_len, summary_max_len, args)
    saver = tf.train.Saver(tf.global_variables())
    ckpt = tf.train.get_checkpoint_state(SAVE_PATH)

    if ckpt is None:
      sess.run(tf.global_variables_initializer())
    else:
      print("Loading checkpoint")
      saver.restore(sess, ckpt.model_checkpoint_path)

    batches = batch_iter(train_x, train_y, args.batch_size, args.num_epochs)
    num_batches_per_epoch = (len(train_x) - 1) // args.batch_size + 1

    print("Iteration starts.")
    print("Number of batches per epoch :", num_batches_per_epoch)
    for batch_x, batch_y in batches:
        batch_x_len = list(map(lambda x: len([y for y in x if y != 0]), batch_x))
        batch_decoder_input = list(map(lambda x: [word_dict["<s>"]] + list(x), batch_y))
        batch_decoder_len = list(map(lambda x: len([y for y in x if y != 0]), batch_decoder_input))
        batch_decoder_output = list(map(lambda x: list(x) + [word_dict["</s>"]], batch_y))

        batch_decoder_input = list(
            map(lambda d: d + (summary_max_len - len(d)) * [word_dict["<padding>"]], batch_decoder_input))
        batch_decoder_output = list(
            map(lambda d: d + (summary_max_len - len(d)) * [word_dict["<padding>"]], batch_decoder_output))

        train_feed_dict = {
            model.batch_size: len(batch_x),
            model.X: batch_x,
            model.X_len: batch_x_len,
            model.decoder_input: batch_decoder_input,
            model.decoder_len: batch_decoder_len,
            model.decoder_target: batch_decoder_output
        }

        _, step, loss = sess.run([model.update, model.global_step, model.loss], feed_dict=train_feed_dict)

        #-------------------------------------
        # First time through so save the model
        #-------------------------------------
        if first_iter == True: 
            first_iter = False
            #Lets try saving this badboy
            cwd = os.getcwd()
            path = os.path.join(cwd, 'simple')
            shutil.rmtree(path, ignore_errors=True)

            inputs_dict = {
                "batch_decoder_input": tf.convert_to_tensor(batch_decoder_input)
            }
            outputs_dict = {
                "batch_decoder_output": tf.convert_to_tensor(batch_decoder_output)
            }

            tf.saved_model.simple_save(
                sess, path, inputs_dict, outputs_dict
            )
            print('Model Saved')
            #End save model code

Эта логика успешно будет работать для тестирования:

import tensorflow as tf
import pickle
from model import Model
from utils import build_dict, build_dataset, batch_iter


with open("args.pickle", "rb") as f:
    args = pickle.load(f)

print("Loading dictionary...")
word_dict, reversed_dict, article_max_len, summary_max_len = build_dict("valid", args.toy)
print("Loading validation dataset...")
valid_x, valid_y = build_dataset("valid", word_dict, article_max_len, summary_max_len, args.toy)
valid_x_len = list(map(lambda x: len([y for y in x if y != 0]), valid_x))

with tf.Session() as sess:
    print("Loading saved model...")
    model = Model(reversed_dict, article_max_len, summary_max_len, args, forward_only=True)
    saver = tf.train.Saver(tf.global_variables())
    ckpt = tf.train.get_checkpoint_state("./saved_model/")
    saver.restore(sess, ckpt.model_checkpoint_path)

    batches = batch_iter(valid_x, valid_y, args.batch_size, 1)

    print("Writing summaries to 'result.txt'...")
    for batch_x, batch_y in batches:
        batch_x_len = list(map(lambda x: len([y for y in x if y != 0]), batch_x))

        valid_feed_dict = {
            model.batch_size: len(batch_x),
            model.X: batch_x,
            model.X_len: batch_x_len,
        }

        prediction = sess.run(model.prediction, feed_dict=valid_feed_dict)
        prediction_output = list(map(lambda x: [reversed_dict[y] for y in x], prediction[:, 0, :]))

        with open("result.txt", "a") as f:
            for line in prediction_output:
                summary = list()
                for word in line:
                    if word == "</s>":
                        break
                    if word not in summary:
                        summary.append(word)
                print(" ".join(summary), file=f)

    print('Summaries are saved to "result.txt"...')

0 ответов

Другие вопросы по тегам