2017-10-14 307 views
0

我已經訓練我的CNN模型,並將其存儲在一個名爲model它包含文件的目錄如下圖所示如何恢復訓練模型和計算測試精度Tensorflow

\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

如何正確恢復模型並計算測試精度。

其中包含的代碼用於訓練模型

原始文件train.py

+0

在使用它之前,你不需要創建fc層嗎? – jdv

回答

0

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_predy_pred_cls等給他們的名字和簡單地得到它從恢復的圖形。

+0

感謝您的回覆。但我在修改後出現錯誤,如您所建議 'KeyError:'名稱'layer_fc2'是指操作不在圖中。'' –

+0

請參閱上述更新的註釋 –

+0

正確。我想你沒有重新訓練模型。所以你現在的模型沒有'layer_fc2'的名字。它獲得了一些內部名稱,如'Relu:0'。你可以嘗試使用它,但它很容易出錯。我建議你改變你的訓練腳本,*重新訓練*一個新的模型,其中所需的操作命名正確,並使用它 – Maxim