Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tensorflow嵌入件don';在第一个RNN示例之后不存在_Python_Tensorflow - Fatal编程技术网

Python tensorflow嵌入件don';在第一个RNN示例之后不存在

Python tensorflow嵌入件don';在第一个RNN示例之后不存在,python,tensorflow,Python,Tensorflow,我已经设置了一个print语句,我注意到在第一批输入RNN时,嵌入存在,但在第二批之后,它们不存在,我得到以下错误: ValueError:变量RNNLM/RNNLM/Embedding/Adam_2/不存在,或者不是使用tf.get_Variable()创建的。您的意思是在VarScope中设置重用=无吗 以下是生成嵌入的代码: def add_embedding(self): with tf.device('/gpu:0'): embedding = tf.get_var

我已经设置了一个print语句,我注意到在第一批输入RNN时,嵌入存在,但在第二批之后,它们不存在,我得到以下错误:

ValueError:变量RNNLM/RNNLM/Embedding/Adam_2/不存在,或者不是使用tf.get_Variable()创建的。您的意思是在VarScope中设置重用=无吗

以下是生成嵌入的代码:

def add_embedding(self):
    with tf.device('/gpu:0'):
      embedding = tf.get_variable("Embedding", [len(self.vocab), self.config.embed_size])
      e_x = tf.nn.embedding_lookup(embedding, self.input_placeholder)
      inputs = [tf.squeeze(s, [1]) for s in tf.split(1, self.config.num_steps, e_x)] 
      return inputs
下面是模型是如何seutp的,这就是我怀疑问题所在的地方

def model(self, inputs):
   with tf.variable_scope("input_drop"):
      inputs_drop = [tf.nn.dropout(i, self.dropout_placeholder) for i in inputs]

    with tf.variable_scope("RNN") as scope:
      self.initial_state = tf.zeros([self.config.batch_size, self.config.hidden_size], tf.float32)
      state = self.initial_state
      states = []
      for t, e in enumerate(inputs_drop):
        print "t is {0}".format(t)
        if t > 0:
          scope.reuse_variables()
        H = tf.get_variable("Hidden", [self.config.hidden_size, self.config.hidden_size])
        I = tf.get_variable("I", [self.config.embed_size, self.config.hidden_size])
        b_1 = tf.get_variable("b_1", (self.config.hidden_size,))

        state = tf.sigmoid(tf.matmul(state, H) + tf.matmul(e, I) + b_1)
        states.append(state)

    with tf.variable_scope("output_dropout"):
      rnn_outputs = [tf.nn.dropout(o, self.dropout_placeholder) for o in states]
    return rnn_outputs
当我进入损失函数时,问题就出现了,定义如下

def add_training_op(self, loss):
    opt = tf.train.AdamOptimizer(self.config.lr)
    train_op = opt.minimize(loss)
    return train_op
编辑:下面是一些更新的代码,可以帮助大家解决问题

 def __init__(self, config):
    self.config = config
    self.load_data(debug=False)
    self.add_placeholders()
    self.inputs = self.add_embedding()
    self.rnn_outputs = self.add_model(self.inputs)
    self.outputs = self.add_projection(self.rnn_outputs)
    self.predictions = [tf.nn.softmax(tf.cast(o, 'float64')) for o in self.outputs]
    output = tf.reshape(tf.concat(1, self.outputs), [-1, len(self.vocab)])
    self.calculate_loss = self.add_loss_op(output)
    self.train_step = self.add_training_op(self.calculate_loss)
这里还有其他方法,与
add\u projection
calculate\u loss
有关,我们可以排除它们

def add_loss_op(self, output):
   weights = tf.ones([self.config.batch_size * self.config.num_steps], tf.int32)
    seq_loss = tf.python.seq2seq.sequence_loss(
      [output], 
      tf.reshape(self.labels_placeholder, [-1]), 
      weights
      )
    tf.add_to_collection('total_loss', seq_loss)
    loss = tf.add_n(tf.get_collection('total_loss')) 
    return loss

def add_projection(self, rnn_outputs):
   with tf.variable_scope("Projection", initializer=tf.contrib.layers.xavier_initializer()) as scope:
      U = tf.get_variable("U", [self.config.hidden_size, len(self.vocab)])
      b_2 = tf.get_variable("b_2", [len(self.vocab)])

      outputs = [tf.matmul(x, U) + b_2 for x in rnn_outputs]
      return outputs


def train_RNNLM():
  config = Config()
  gen_config = deepcopy(config)
  gen_config.batch_size = gen_config.num_steps = 1

  with tf.variable_scope('RNNLM') as scope:
    model = RNNLM_Model(config)
    # This instructs gen_model to reuse the same variables as the model above
    scope.reuse_variables()
    gen_model = RNNLM_Model(gen_config)

  init = tf.initialize_all_variables()
  saver = tf.train.Saver()

  with tf.Session() as session:
    best_val_pp = float('inf')
    best_val_epoch = 0

    session.run(init)
    for epoch in xrange(config.max_epochs):
      print 'Epoch {}'.format(epoch)
      start = time.time()
      ###
      train_pp = model.run_epoch(
          session, model.encoded_train,
          train_op=model.train_step)
      valid_pp = model.run_epoch(session, model.encoded_valid)
      print 'Training perplexity: {}'.format(train_pp)
      print 'Validation perplexity: {}'.format(valid_pp)
      if valid_pp < best_val_pp:
        best_val_pp = valid_pp
        best_val_epoch = epoch
        saver.save(session, './ptb_rnnlm.weights')
      if epoch - best_val_epoch > config.early_stopping:
        break
      print 'Total time: {}'.format(time.time() - start)
def add_loss_op(自身,输出):
权重=tf.ones([self.config.batch\u size*self.config.num\u steps],tf.int32)
seq_loss=tf.python.seq2seq.sequence_loss(
[输出],
tf.重塑(self.labels_占位符,[-1]),
砝码
)
tf.在托收单中添加(“总损失”,顺序损失)
损耗=tf.add\u n(tf.get\u集合(“总损耗”))
回波损耗
def add_投影(自身、rnn_输出):
使用tf.variable_scope(“Projection”,initializer=tf.contrib.layers.xavier_initializer())作为作用域:
U=tf.get_变量(“U”,[self.config.hidden_size,len(self.vocab)])
b_2=tf.get_变量(“b_2”,[len(self.vocab)])
输出=[tf.matmul(x,U)+b_2表示rnn_输出中的x]
返回输出
def序列号\u RNNLM():
config=config()
gen_config=deepcopy(配置)
gen\u config.batch\u size=gen\u config.num\u steps=1
以tf.variable_scope('RNNLM')作为作用域:
模型=RNNLM_模型(配置)
#这指示gen_模型重用与上述模型相同的变量
作用域。重用_变量()
发电机组模型=RNNLM发电机组模型(发电机组配置)
初始化所有变量()
saver=tf.train.saver()
使用tf.Session()作为会话:
最佳值pp=float('inf')
最佳值=0
会话运行(init)
对于xrange中的历元(config.max_历元):
打印“历元{}”。格式(历元)
开始=时间。时间()
###
列车运行时间=模型运行时间(
第二节,模型列车,
列车运行计划=模型列车运行计划(步骤)
有效\u pp=model.run\u epoch(会话,model.encoded\u有效)
打印“训练困惑:{}”。格式(训练pp)
打印“验证困惑:{}”。格式(有效)
如果有效config.early\u停止:
打破
打印“总时间:{}”。格式(time.time()-start)

代码似乎试图在每个批中创建一个新的Adam变量。 是否可能调用了两次
add\u training\u op

另外,
def add_training_op
的代码段不完整,因为没有返回语句。

问题是以下代码行:

model = RNNLM_Model(config)
    # This instructs gen_model to reuse the same variables as the model above
    scope.reuse_variables()
    gen_model = RNNLM_Model(gen_config)

通过使用
reuse\u variables()
,发现第二个模型是一个问题。通过删除此行,问题消失了

你能提供更多的代码吗?我似乎无法理解功能
add\u training\u op
add\u embedding
是如何与其他功能一起发挥作用的code@martianwars我继续添加了代码设置。缺少return语句是一个拼写错误,现已修复。我将继续添加print语句以查看调用代码的频率。我添加了另一个我正在调用的方法,可能是它导致了问题。