Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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中恢复训练模型并计算测试精度_Python_Python 3.x_Tensorflow_Conv Neural Network - Fatal编程技术网

Python 如何在Tensorflow中恢复训练模型并计算测试精度

Python 如何在Tensorflow中恢复训练模型并计算测试精度,python,python-3.x,tensorflow,conv-neural-network,Python,Python 3.x,Tensorflow,Conv Neural Network,我已经训练了我的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 = []

我已经训练了我的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))
运行上面的代码时,我得到了错误

名称错误:未定义名称“layer_fc2”


如何正确地恢复模型并计算测试精度?

layer\u fc2
是在您的培训脚本中定义的python变量(您在其中定义了图形),此处不存在该变量。你需要做的是找到这一层。不幸的是,你没有在火车时刻说出它的名字。将
create\u fc\u图层
code更改为

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\u pred
y\u pred\u cls
,等等。给他们起个名字,然后从恢复的图表中简单地得到它。

谢谢您的回复。但是,在按照您的建议进行更改后,我遇到了以下错误:“'layer_fc2'这个名称指的是一个不在图中的操作。”
对。我想你没有对模型进行再培训。因此,您现在拥有的模型没有
layer\u fc2
的名称。它得到一些内部名称,比如'Relu:0'。您可以尝试使用它,但它很容易出错。我建议您更改培训脚本,重新培训一个新模型,其中所需的操作已正确命名,并使用itI。在按照您的建议进行更改后,我已重新培训模型。但是仍然是相同的错误。
session.graph.get\u operations()
告诉我们什么?还可以尝试
layer\u fc2:0
我尝试将
layer\u fc2
更改为
layer\u fc2:0
。现在我得到了这个错误
ValueError:Name'layer_fc2:0'似乎是指一个张量,而不是一个操作。
在使用fc层之前你不需要创建它吗?请不要在堆栈溢出上发布像paste.ofcode.org这样的短暂内容。