如何使用经过训练的CNN张量流模型来测试另一个.py文件中的输入图像

时间:2018-03-07 20:15:04

标签: python tensorflow deep-learning classification

我已经使用tensorflow成功训练并保存了我的模型(图像分类器),所以现在我有.meta,索引和检查点文件。

我想为我的模型提供一个图像以供测试,所以我创建了另一个.py文件并恢复了我的模型:

 with tf.Session() as sess:
    saver = tf.train.import_meta_graph('model-24900.meta')
    saver.restore(sess,"model-24900")
    graph = tf.get_default_graph() 

之后我尝试提供图像:

    Prediction=sess.run([output],feed_dict={input_img : testImage,})

'输出'和input_img在另一个文件中定义(我已经构建并训练了模型,因此它们在我想要测试模型的文件中未定义。

这是我在火车档案中写的:

    with tf.name_scope("Input") as scope:
    input_img = tf.placeholder(dtype='float', shape=[None, 128, 128, 1], name="input")

with tf.name_scope("Target") as scope:
    target_labels = tf.placeholder(dtype='float', shape=[None, 2], name="Targets")

nb = NetworkBuilder()

with tf.name_scope("ModelV2") as scope:
    model = input_img
    model = nb.attach_conv_layer(model, 32)
    model = nb.attach_relu_layer(model)
    model = nb.attach_conv_layer(model, 32)
    model = nb.attach_relu_layer(model)
    model = nb.attach_pooling_layer(model)

    model = nb.attach_conv_layer(model, 64)
    model = nb.attach_relu_layer(model)
    model = nb.attach_conv_layer(model, 64)
    model = nb.attach_relu_layer(model)
    model = nb.attach_pooling_layer(model)

    model = nb.attach_conv_layer(model, 128)
    model = nb.attach_relu_layer(model)
    model = nb.attach_conv_layer(model, 128)
    model = nb.attach_relu_layer(model)
    model = nb.attach_pooling_layer(model)

    model = nb.flatten(model)
    model = nb.attach_dense_layer(model, 200)
    model = nb.attach_sigmoid_layer(model)
    model = nb.attach_dense_layer(model, 32)
    model = nb.attach_sigmoid_layer(model)
    model = nb.attach_dense_layer(model, 2)
    output = nb.attach_softmax_layer(model)



with tf.name_scope("Optimization") as scope:
    global_step = tf.Variable(0, name='global_step', trainable=False)
    cost = tf.nn.softmax_cross_entropy_with_logits(logits=model, labels=target_labels)
    cost = tf.reduce_mean(cost)
    tf.summary.scalar("cost", cost)

    optimizer = tf.train.AdamOptimizer().minimize(cost,global_step=global_step)

with tf.name_scope('accuracy') as scope:
    correct_pred = tf.equal(tf.argmax(output, 1), tf.argmax(target_labels, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

所以我的问题是如何定义'输出'和' input_img' (我已经在火车文件中使用过)我的测试文件,所以我可以将图像提供给我的CNN模型

1 个答案:

答案 0 :(得分:0)

1] .ckpt文件进行测试并重新创建整个模型:

  • 您可以使用在培训期间在培训中使用的.py文件中执行的输入张量和输出张量重新定义整个模型
  • 现在你需要通过将测试图像提供给你定义的输入张量来进行前向传递,并从输出张量中获得预测但是不应该进行训练
  • 您在测试.py文件中定义的模型必须具有与培训中使用的结构相同的结构

2] .ckpt文件进行测试并使用张量名称

  • 您可以在培训中明确命名张量
  • 在测试.py文件期间,您可以轻松获得在培训期间明确指定的.get_tensor_by_name("example:0")函数的输入和输出张量
  • 您可以在sess.run中使用这些张量,将数据输入到输入张量并获得预测

3] .pb冻结图测试并使用张量名称

  • 以上两种方法仍然可以训练,文件大小比.pb文件大
  • .pb冻结文件是一个无法训练的冻结图
  • 您可以使用此文件导入冻结图
  • 现在,您可以通过.get_tensor_by_name("example:0")函数获取输入和输出张量并进行预测

<强> =========================修订================== =======

有两种方法可以知道张量的名称:

1] 使用Tensor-Board:

  • 培训后保存模型
  • 打开终端并运行命令tensorboard --logdir =“path_where_you_have_stored_ckpt_file”
  • 打开http://0.0.0.0:6006/到您的网络浏览器
  • 转到图形部分,通过单击特定的张量节点
  • 来识别张量的名称

2] 在代码中:

  • 每个Tensor都有名称属性
  • 您可以这样做:

    for node in graph_def.node:
       print(node.name)
    
  • 如果您想要特定张量的名称,您可以这样做:

    x = tf.placeholder(tf.float32, [None, 784])
    print(x.name)
    
  • 获得名称后,您可以使用以下名称轻松使用该名称来检索张量:.get_tensor_by_name(x.name)