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"...')