如何从受过训练的CNN培训师那里获得预测

时间:2018-05-23 14:44:52

标签: tensorflow machine-learning deep-learning

我已经使用tf.estimator API训练了CNN,但是我无法以对我有用的方式进行预测。

我需要在从相机收到图像时实时向我的CNN提供图像。在一个较旧的网络设计中,我制作了Controller_tf类,这样做很好。所以我试图让它适应一个使用tf.estimator培训的新CNN(如前所述)。

在estimator.predict接口似乎想将通过tf.app.run()调用(很乐意被证明是错误的事情)调用,这就是为什么我试图运行CNN使用tf.Session ()(使用模型函数中的if语句仅运行相关部分)但我目前收到错误:

ValueError: Fetch argument 'infer' cannot be interpreted as a Tensor. ("The name 'infer' refers to an Operation not in the graph.")

我无法确定我哪里出错了。受过训练的模型是否与PREDICT模式下的运行无法匹配?任何帮助将非常感谢。这里的任何方式都是代码:

    class Controller_tf:

    set_speed = None

    def __init__(self, model, ckpt_path, set_speed_in):

        self.set_speed = set_speed_in

        self.x = tf.placeholder(tf.float32, shape = (None, 104, 160, 3))
        self.y = model(self.x, None, tf.estimator.ModeKeys.PREDICT)

        # make TF use memory growth method
        config = tf.ConfigProto()
        config.gpu_options.allow_growth = True
        self.sess = tf.Session(config=config)

        saver = tf.train.Saver()
        saver.restore(self.sess, ckpt_path)


    def update(self, message):
        # The current speed of the car

        image = frame2numpy(message['frame'], (160,104))
        image_array = np.asarray(image)

        turn_logits = self.sess.run(self.y, {self.x: image_array[None, :, :, :]})        
        return turn_logits

model = cnn_model_fn3
ckpt = 'ckpts/stc_model3/model.ckpt-27621'
controller = Controller_tf(model, ckpt, 18)

image_file = 'G:/Datasets/ds072.001/ds072.001-fm-0008465.jpg'
#image_file = 'G:/Datasets/ds072.001/ds072.001-fm-0009156.jpg'

satnavimg = load_image(image_file)
satnavimg = np.asarray([satnavimg])
satnavimg = (satnavimg/127.5) - 1.0
print(np.shape(satnavimg))
msg = {'frame': satnavimg}
turn = controller.update(msg)

print(turn)

模型功能是:

def cnn_model_fn3(features, labels, mode):

    if mode == tf.estimator.ModeKeys.PREDICT:
        input_layer = features
    else:
        input_layer = tf.reshape(features["image_data"], [-1, 104, 160, 3])

    conv1 = tf.layers.conv2d(
        inputs=input_layer,
        filters=32,
        kernel_size=[10, 10],
        padding="same",
        activation=tf.nn.relu,
        name='Conv1')

... removed layer code for brevity ...

    logits = tf.layers.dense(
        inputs=dropout1, 
        units=3,
        name='Dense3')

    predictions = {
        "classes": tf.argmax(input=logits, axis=1),
        "probabilities": tf.nn.softmax(logits, name="softmax_tensor")
    }
    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

    # Calculate Loss (for both TRAIN and EVAL modes)
    loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

    # Configure the Training Op (for TRAIN mode)
    if mode == tf.estimator.ModeKeys.TRAIN:
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
        train_op = optimizer.minimize(
            loss=loss,
            global_step=tf.train.get_global_step())
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)

    # Add evaluation metrics (for EVAL mode)
    if mode == tf.estimator.ModeKeys.EVAL:
        eval_metric_ops = {
            "accuracy": tf.metrics.accuracy(
                labels=labels, predictions=predictions["classes"])}
    if mode == tf.estimator.ModeKeys.PREDICT:
        return logits
    return tf.estimator.EstimatorSpec(
        mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

0 个答案:

没有答案