【问题标题】:TensorFlow 1.x 预测会话从训练会话输出不同的值,给定相同的输入
【发布时间】:2022-01-23 07:45:02
【问题描述】:

我正在训练一个基于 CNN 的模型,该模型适用于时间序列,并且应该将评估的时间序列分为 3 类 (0,1,2)。在训练期间,我能够达到非常高的准确度。通过在培训课程结束时提供测试数据集,我可以获得以下图表:

我用来训练和保存模型的代码如下:

     sess = tf1.Session()
     saver = tf1.train.Saver()
            
    sess.run(tf1.global_variables_initializer())
    for epoch in range(0,epochs):
        step = 0
        l = 0.0
        val_acc = 0
        np.random.shuffle(TRAIN)
        for x,y in TRAIN:
            feed_dict = {self.net.input_tensor: x, self.label: y}
            _, compute_loss,comp_acc = sess.run([train_op, loss,accuracy], feed_dict=feed_dict)

            l += compute_loss
            val_acc += comp_acc

            if step%100 == 0:
                #print(compute_loss,comp_acc)
                print('train step = %d,loss = %f,accuracy = %f'%(step, l/step, val_acc/step))
            step += 1
        val_acc = 0
        val_step = 0
        for x,y in TEST:
            feed_dict = {self.net.input_tensor: x, self.label: y}
            compute_accuracy = sess.run(accuracy, feed_dict=feed_dict)
            val_acc += compute_accuracy
            val_step += 1

        print("Validation set accuracy: %s" % str(val_acc/val_step))
        
    saver.save(sess, './model_v1/demo2/infer2')
    P = tf1.argmax(self.pred,1)
    evaluate(TX,TY,sess,self.net.input_tensor,P) # generates the plot, with input TX,TY

但是,当我恢复会话时,模型将生成一个完全不同的图,给定相同的输入 TX,TY:

我确保在从文件系统加载会话时不运行 global_variables_initializer,因为权重应该来自恢复,而且当我恢复时我启动了一个新程序,但它仍然无法正常工作:

with tf1.compat.v1.Session() as sess:
  saver = tf1.compat.v1.train.import_meta_graph(r'./model_v1/demo2/infer2.meta')
  saver.restore(sess,r'./model_v1/demo2/infer2')
  graph = sess.graph
  inpt = graph.get_tensor_by_name('net_input:0') #name of the input placeholder
  output = graph.get_tensor_by_name('net_output:0') #name of the network output
  output = tf1.argmax(output, axis=1)    
  evaluate(TX,TY,sess, inpt,output)

网络定义如下:

def build_net_graph(self):
    self.input_tensor = tf1.placeholder(tf1.float32, [None, self.time_step, self.senor_data_num],name='net_input')

    #dense
    input_x = tf1.reshape(self.input_tensor, [-1, self.senor_data_num])
    
    weights_x = self._get_variable_weights([self.senor_data_num, self.num_units],"inputx_w")    
    biases_x = self._get_variable_biases([self.num_units],"inputx_b")
    x_mul = tf1.matmul(input_x, weights_x)
    x_output = tf1.reshape(tf1.add(x_mul, biases_x),[-1, self.time_step, self.num_units])
    
    #hidden layers        
    
    weights_outputs = self._get_variable_weights([avg_output.shape[1], self.class_num],"outputx_w")
    print("wo",weights_outputs.shape)
    biases_outputs = self._get_variable_biases([self.class_num],"outputx_b")
    
    m = tf1.matmul(hidden_layers_output, weights_outputs)
    a = tf1.add(m, biases_outputs)
    a = tf1.nn.softmax(a,name='net_output')
    return a

任何人都可以就正在发生的事情提供一些帮助吗?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

    所以我找到了解决方案。希望这对遇到同样问题的人有所帮助。

    似乎 session.save 将权重的 2 个版本保存在同一个文件中,并通过提供原始输入和输出名称“net_input”和“net_output”来恢复不是最终版本的第一个版本。

    我发现这样做, print(self.pred.name) 在保存之前打印的是 net_output_1,而不是 net_output
    通过运行以下推理代码,我能够获得与训练中相同的评估图:

    with tf1.compat.v1.Session() as sess:
      saver = tf1.compat.v1.train.import_meta_graph(r'./model_v1/demo2/infer2.meta')
      saver.restore(sess,r'./model_v1/demo2/infer2')
      graph = sess.graph
      inpt = graph.get_tensor_by_name('net_input_1:0') #name of the input placeholder
      output = graph.get_tensor_by_name('net_output_1:0') #name of the network output
      output = tf1.argmax(output, axis=1)    
      evaluate(TX,TY,sess, inpt,output)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2021-01-25
      • 2020-04-07
      相关资源
      最近更新 更多