Tensorflow保存和恢复模型的问题

时间:2017-06-03 10:33:26

标签: python tensorflow

我正在尝试使用转移学习方法。以下是我的代码正在学习培训数据的代码的快照:

max_accuracy = 0.0
    saver = tf.train.Saver()
    for epoch in range(epocs):
        shuffledRange = np.random.permutation(n_train)
        y_one_hot_train = encode_one_hot(len(classes), Y_input)
        y_one_hot_validation = encode_one_hot(len(classes), Y_validation)
        shuffledX = X_input[shuffledRange,:]
        shuffledY = y_one_hot_train[shuffledRange]
        for Xi, Yi in iterate_mini_batches(shuffledX, shuffledY, mini_batch_size):
            sess.run(train_step,
                     feed_dict={bottleneck_tensor: Xi,
                                ground_truth_tensor: Yi})
            # Every so often, print out how well the graph is training.
            is_last_step = (i + 1 == FLAGS.how_many_training_steps)
            if (i % FLAGS.eval_step_interval) == 0 or is_last_step:
                train_accuracy, cross_entropy_value = sess.run(
                  [evaluation_step, cross_entropy],
                  feed_dict={bottleneck_tensor: Xi,
                             ground_truth_tensor: Yi})
                validation_accuracy = sess.run(
                  evaluation_step,
                  feed_dict={bottleneck_tensor: X_validation,
                             ground_truth_tensor: y_one_hot_validation})
                print('%s: Step %d: Train accuracy = %.1f%%, Cross entropy = %f, Validation accuracy = %.1f%%' %
                    (datetime.now(), i, train_accuracy * 100, cross_entropy_value, validation_accuracy * 100))
                result_tensor = sess.graph.get_tensor_by_name(ensure_name_has_port(FLAGS.final_tensor_name))
                probs = sess.run(result_tensor,feed_dict={'pool_3/_reshape:0': Xi[0].reshape(1,2048)})
                if validation_accuracy > max_accuracy :
                   saver.save(sess, 'models/superheroes_model')
                   max_accuracy = validation_accuracy
                   print(probs)
            i+=1  

这是我的代码,我在这里加载模型:

def load_model () :
    sess=tf.Session()    
    #First let's load meta graph and restore weights
    saver = tf.train.import_meta_graph('models/superheroes_model.meta')
    saver.restore(sess,tf.train.latest_checkpoint('models/'))
    sess.run(tf.global_variables_initializer())
    result_tensor = sess.graph.get_tensor_by_name(ensure_name_has_port(FLAGS.final_tensor_name))  
    X_feature = features[0].reshape(1,2048)        
    probs = sess.run(result_tensor,
                         feed_dict={'pool_3/_reshape:0': X_feature})
    print probs
    return sess  

所以现在对于相同的数据点,我在训练和测试时会得到完全不同的结果。它甚至没有接近。在测试期间,我的概率接近25%,因为我有4个班级。但在训练期间,最高等级概率为90% 保存或恢复模型时是否有任何问题?

2 个答案:

答案 0 :(得分:2)

小心 - 你正在打电话

sess.run(tf.global_variables_initializer())

之后

saver.restore(sess,tf.train.latest_checkpoint('models/'))

之前我做过类似的事情,我认为会重置你训练过的所有重量/偏差/等等。在恢复的模型中。

如果必须,请在恢复模型之前调用初始化程序,如果需要初始化已恢复模型中的特定内容,请单独执行。

答案 1 :(得分:2)

在您的函数sess.run(tf.global_variables_initializer())中删除load_model,如果您这样做,所有训练过的参数都会被初始值替换,每个类产生1/4的概率