【问题标题】:How to resolve the ValueError proj_w in Tensorflow?如何解决 Tensorflow 中的 ValueError proj_w?
【发布时间】:2016-06-29 09:18:14
【问题描述】:

我创建了一个 REST Web 服务来执行机器翻译,并在 translate.py 中进行了一些修改。如果我单独在 translate.py 中运行 decode 函数,在多次运行中我会得到正确的输出。但是当我尝试通过我创建的 web 服务运行解码功能时,我第一次得到了翻译结果。但是在第二次迭代中,我得到了标题中提到的错误。

这是我收到的错误消息:ValueError:变量 proj_w 已存在,不允许。您的意思是在 VarScope 中设置 reuse=true 吗?

REST 网络服务部分:

input = request.json['inputtext']
print "'%s'" % input
print 'Please wait'
#import pdb; pdb.set_trace()
#out = demo1.decode(input);

解码python脚本:

def decode(sentence)

with tf.Session() as sess:
# Create model and load parameters.

model = create_model(sess, True)
model.batch_size = 1  # We decode one sentence at a time.

# Load vocabularies.
en_vocab_path = os.path.join(FLAGS.data_dir,
                             "vocab%d.en" % FLAGS.en_vocab_size)
fr_vocab_path = os.path.join(FLAGS.data_dir,
                             "vocab%d.fr" % FLAGS.fr_vocab_size)
en_vocab, _ = data_utils.initialize_vocabulary(en_vocab_path)
_, rev_fr_vocab = data_utils.initialize_vocabulary(fr_vocab_path)

# Decode from standard input.
#sys.stdout.write("> ")
#sys.stdout.flush()
#sentence = sys.stdin.readline()
print ("reading line %s" % sentence)

token_ids = data_utils.sentence_to_token_ids(tf.compat.as_bytes(sentence), en_vocab)
bucket_id = min([b for b in xrange(len(_buckets))
                   if _buckets[b][0] > len(token_ids)])
encoder_inputs, decoder_inputs, target_weights = model.get_batch(
      {bucket_id: [(token_ids, [])]}, bucket_id)

_, _, output_logits = model.step(sess, encoder_inputs, decoder_inputs,
                                   target_weights, bucket_id, True)
outputs = [int(np.argmax(logit, axis=1)) for logit in output_logits]
if data_utils.EOS_ID in outputs:
    outputs = outputs[:outputs.index(data_utils.EOS_ID)]
#print(" ".join([tf.compat.as_str(rev_fr_vocab[output]) for output in outputs]))
str1 = ([tf.compat.as_str(rev_fr_vocab[output]) for output in outputs])
output = ' '.join(str1)

print ("output line %s\n" % output)
sys.stdout.flush()
sess.close()
return output

它第一次工作。但是对于网络服务的下一次点击,我收到此错误“ValueError : Variable proj_w already exists, disallowed. you mean to set reuse=true in VarScope?

【问题讨论】:

  • 一般来说,您希望创建模型一次,并通过 sess.run() 多次调用它。从您的代码的简短浏览来看,您似乎正在尝试在每次调用 decode() 时重建模型。
  • 你是对的。我正在为每个电话建立模型。我现在已经更改了它,现在似乎可以正常工作了。

标签: python web-services tensorflow tensorflow-serving


【解决方案1】:

通过以下修改,我能够顺利运行 web 服务。我只创建一次模型和 tf.session()。早些时候,它们是为网络服务上的每次点击创建的。

model = None
en_vocab_path =None
fr_vocab_path =None 
sess = None

def decode(sentence)
   global sess

   if sess==None:
     sess = tf.Session()

   global model
   global en_vocab_path
   global fr_vocab_path

   if model==None:
    model = create_model(sess, True)
    model.batch_size = 1  # We decode one sentence at a time.

   # Load vocabularies.
   if en_vocab_path==None:
     en_vocab_path = os.path.join(FLAGS.data_dir,
                             "vocab%d.en" % FLAGS.en_vocab_size)
   if fr_vocab_path==None:
     fr_vocab_path = os.path.join(FLAGS.data_dir,
                             "vocab%d.fr" % FLAGS.fr_vocab_size)

【讨论】:

    猜你喜欢
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2020-08-01
    • 2021-12-19
    • 2023-03-25
    • 2022-11-19
    相关资源
    最近更新 更多