【问题标题】:Tensorflow: How to predict a single image from the model trained?Tensorflow:如何从训练的模型中预测单个图像?
【发布时间】:2018-05-26 10:56:55
【问题描述】:

我是 tensorflow 的新手,我正在尝试构建一个图像分类器。我已经成功创建了模型,并且我试图在恢复模型后预测单个图像。我已经阅读了各种教程 (https://github.com/sankit1/cv-tricks.com/blob/master/Tensorflow-tutorials/tutorial-2-image-classifier/predict.py),但我无法弄清楚我的代码中的 feed-dict 内容。加载保存的模型后,我陷入了预测功能。有人可以帮助我并告诉我从保存的模型中加载所有变量后该怎么做吗?

这是训练函数,它返回参数并将它们保存在模型中。

def trainModel(train, test, learning_rate=0.0001, num_epochs=2, minibatch_size=32, graph_filename='costs'):
"""
Implements a three-layer tensorflow neural network: LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX.

Input:
    train : training set
    test : test set
    learning_rate : learning rate 
    num_epochs : number of epochs 
    minibatch_size : size of minibatch
    print_cost : True to print the cost every epoch

Returns:
    parameters : parameters learnt by the model
"""

    ops.reset_default_graph() #for rerunning the model without resetting tf vars

# input and output shapes
    (n_x, m) = train.images.T.shape
    n_y = train.labels.T.shape[0]

    costs = [] #var for storing the costs for later use

    # create placeholders
    X, Y = placeholderCreator(n_x, n_y)

    parameters = paramInitializer()

    # Forward propagation
    Z3 = forwardPropagation(X, parameters)
    # Cost function
    cost = costCalc(Z3, Y)
    #Backpropagation using adam optimizer
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(cost)
    # Initialize tf variables
    init = tf.global_variables_initializer()
    minibatch_size = 32
    # Start session to compute Tensorflow graph
    with tf.Session() as sess:
    # Run initialization
        sess.run(init)

        for epoch in range(num_epochs): # Training loop
            epoch_cost = 0.
            num_minibatches = int(m / minibatch_size)
            for i in range(num_minibatches):
                minibatch_X, minibatch_Y = train.next_batch(minibatch_size)  # Get next batch of training data and labels
                _, minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X.T, Y: minibatch_Y.T}) # Execute optimizer and cost function
                epoch_cost += minibatch_cost / num_minibatches # Update epoch cost

        saver = tf.train.Saver()
        # Save parameters
        parameters = sess.run(parameters)
        saver.save(sess, "~/trained-model.ckpt")
        return parameters

这是我试图预测图像的预测功能。为了便于使用,我已将该图像转换为 MNIST 格式(predicting_data)。我加载我保存的模型,在第 3 层的输出(最终输出)上使用 softmax 函数。

def predict():

train = predicting_data.train
(n_x, m) = train.images.T.shape
n_y = train.labels.T.shape[0]
X, Y = placeholderCreator(n_x, n_y)
with tf.Session() as sess:
    new_saver = tf.train.import_meta_graph('~/trained-model.ckpt.meta')
    new_saver.restore(sess, '~/trained-model.ckpt')
    W1 = tf.get_default_graph().get_tensor_by_name('W1:0')
    b1 = tf.get_default_graph().get_tensor_by_name('b1:0')
    W2 = tf.get_default_graph().get_tensor_by_name('W2:0')
    b2 = tf.get_default_graph().get_tensor_by_name('b2:0')
    W3 = tf.get_default_graph().get_tensor_by_name('W3:0')
    b3 = tf.get_default_graph().get_tensor_by_name('b3:0')
    # forward propagation     
    Z1 = tf.add(tf.matmul(W1,X), b1)     
    A1 = tf.nn.relu(Z1)                  
    Z2 = tf.add(tf.matmul(W2,A1), b2)    
    A2 = tf.nn.relu(Z2)                  
    Z3 = tf.add(tf.matmul(W3,A2), b3) 
    y_pred = tf.nn.softmax(Z3) ####what to do after this????
    cost = sess.run(y_pred, feed_dict={X: train.images.T}) 

提前谢谢你!

【问题讨论】:

  • 如果我在predict函数的最后第二行打印y_pred,输出为空
  • 您的预测部分不正确,您需要使用get_tensor_by_name() 从保存的图形中获取输入并预测张量,然后在您的sess.run 中使用它。检查:stackoverflow.com/questions/50484676/…
  • 感谢您的回答。但这不就是我正在做的吗? @vijaym
  • 不。代码中X和y_pred不是从图中得到的。
  • 我对代码做了一些改动。 trinket.io/python/4e4ead175c请告诉我现在出了什么问题?

标签: tensorflow machine-learning softmax


【解决方案1】:

正如 vijay 在评论中所说:

您的predict 部分不正确,您需要使用get_tensor_by_name() 函数从保存的图形中获取输入并预测张量,然后在您的sess.run 中使用它

如果您查看this post,它涵盖了类似的问题并有一些代码示例。

【讨论】:

  • 感谢您的回答。但这不就是我在做的吗?
【解决方案2】:

在您的代码中,您可以将 1 传递给 next_batch 方法并仅获取一张图像。

minibatch_X, minibatch_Y = train.next_batch(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 2018-03-10
    • 1970-01-01
    • 2021-09-25
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多