Skip to main content
 首页 » 编程设计

python之如何在 Tensorflow 中恢复训练好的模型并计算测试精度

2025年01月19日32zhujiabin

我已经训练了我的 CNN 模型并将其存储在名为 model 的目录中,该目录包含如下所示的文件

\model 
|--- checkpoint 
|--- model.data-00000-of-00001 
|--- model.index 
|--- model.meta 

我想恢复模型并计算我正在使用以下代码的测试精度

import tensorflow as tf 
import numpy as np 
import cv2 
import os 
import glob 
 
images    = [] 
labels    = [] 
img_names = [] 
cls       = [] 
 
test_path = 'data\\cifar-10\\test' 
image_size = 32 
num_channels    = 3 
 
# Prepare input data 
with open('data\\cifar-10\\wnids.txt') as f: 
    classes = f.readlines() 
classes = [x.strip() for x in classes]  
 
num_classes = len(classes) 
 
for fields in classes:    
    index = classes.index(fields) 
    print('Read {} files (Index: {})'.format(fields, index)) 
    path = os.path.join(test_path, fields, '*g') 
    files = glob.glob(path) 
    for fl in files: 
        image = cv2.imread(fl) 
        image = cv2.resize(image, (image_size, image_size),0,0, cv2.INTER_LINEAR) 
        image = image.astype(np.float32) 
        image = np.multiply(image, 1.0 / 255.0) 
        images.append(image) 
        label = np.zeros(len(classes)) 
        label[index] = 1.0 
        labels.append(label) 
        flbase = os.path.basename(fl) 
        img_names.append(flbase) 
        cls.append(fields) 
 
images    = np.array(images) 
labels    = np.array(labels) 
img_names = np.array(img_names) 
cls       = np.array(cls) 
 
session = tf.Session() 
tf_saver = tf.train.import_meta_graph('model\\model.meta') 
tf_saver.restore(session, tf.train.latest_checkpoint('model')) 
 
x      = tf.placeholder(tf.float32, shape=[None, image_size, image_size, num_channels], name='x') 
y_true = tf.placeholder(tf.float32, shape=[None, num_classes], name='y_true') 
y_true_cls = tf.argmax(y_true, axis=1) 
 
y_pred     = tf.nn.softmax(layer_fc2, name='y_pred') 
y_pred_cls = tf.argmax(y_pred, axis=1) 
 
correct_prediction = tf.equal(y_pred_cls, y_true_cls) 
accuracy           = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 
 
feed_dict_test  = {x: images, y_true: labels} 
 
test_acc = session.run(accuracy, feed_dict=feed_dict_test) 
 
msg     = "Test Accuracy: {1:>6.1%}" 
print(msg.format(test_acc)) 

运行上面的代码时出现错误

NameError: name 'layer_fc2' is not defined

如何正确还原模型并计算测试精度?

请您参考如下方法:

layer_fc2 是在您的训练脚本(您定义图形的地方)中定义的 python 变量,此处不存在。你需要做的就是找到这一层。不幸的是,你没有在训练时间命名它。将您的 create_fc_layer 代码更改为

def create_fc_layer(input, num_inputs, num_outputs, name, use_relu=True): 
  weights = create_weights(shape=[num_inputs, num_outputs]) 
  biases = create_biases(num_outputs) 
  layer = tf.matmul(input, weights) + biases 
  if use_relu: 
    layer = tf.nn.relu(layer) 
 
  return tf.identity(layer, name=name)  # return a named layer 
 
... 
 
layer_fc2   = create_fc_layer(input=layer_fc1, num_inputs=fc_layer_size, num_outputs=num_classes, name='layer_fc2', use_relu=False) 

在此之后,在您的新脚本中:

layer_fc2 = session.graph.get_operation_by_name('layer_fc2') 

顺便说一下,您也不需要重新定义 y_pred、y_pred_cls 等。给它们命名,只需从恢复的图中获取即可。