将输入管道传递给TensorFlow Estimator

时间:2017-06-28 12:42:50

标签: python tensorflow conv-neural-network

我是TF的菜鸟,所以对我很轻松。

我必须从带有标签的目录中的一堆图像中训练一个简单的CNN。经过四处查看后,我编写了这段准备TF输入管道的代码,并且能够打印图像数组。

    image_list, label_list = load_dataset()

    imagesq = ops.convert_to_tensor(image_list, dtype=dtypes.string)
    labelsq = ops.convert_to_tensor(label_list, dtype=dtypes.int32)

    # Makes an input queue
    input_q = tf.train.slice_input_producer([imagesq, labelsq],
                                                shuffle=True)

    file_content = tf.read_file(input_q[0])
    train_image = tf.image.decode_png(file_content,channels=3)
    train_label = input_q[1]

    train_image.set_shape([120,120,3])

    # collect batches of images before processing
    train_image_batch, train_label_batch = tf.train.batch(
        [train_image, train_label],
        batch_size=5
        # ,num_threads=1
    )

    with tf.Session() as sess:
        # initialize the variables
        sess.run(tf.global_variables_initializer())
        # initialize the queue threads to start to shovel data
        coord = tf.train.Coordinator()
        threads = tf.train.start_queue_runners(coord=coord)
        # print "from the train set:"
        for i in range(len(image_list)):
             print sess.run(train_image_batch)
        # sess.run(train_image)
        # sess.run(train_label)
        # classifier.fit(input_fn=lambda: (train_image, train_label),
        #                steps=100,
        #                monitors=[logging_hook])

        # stop our queue threads and properly close the session
        coord.request_stop()
        coord.join(threads)
        sess.close()

但是看看TF文档中给出的MNIST示例,我看到他们使用 cnn_model_fn 以及 Estimator 类。

我已经定义了自己的 cnn_model_fn ,并希望将两者结合起来。请帮我说明如何继续前进。此代码不起作用

classifier = learn.Estimator(model_fn=cnn_model_fn, model_dir='./test_model')
classifier.fit(input_fn=lambda: (train_image, train_label),
steps=100,
monitors=[logging_hook])

管道似乎只在会话运行时填充,否则为空,它会给出ValueError'输入图和层图不一样'

请帮帮我。

1 个答案:

答案 0 :(得分:2)

我自己也是张力流动的新手,所以请耐心等待。

AFAICT,当您拨打任何创建"张贴"的tf API时或"操作"它们被创建为一个名为Graph的上下文。

此外,我相信当Estimator运行时,它会为每次运行创建一个新的空Graph。它通过运行Graphmodel_fn来填充input_fntfGraph应该调用model_fn API来添加"张贴"和"操作"在这个新的input_fn

的背景下

GraphEstimator的返回值只提供参考,以便部件可以正确连接 - Graph已经包含它们。

但是在此示例中,输入操作已在Graph创建Estimator之前创建,因此其相关操作已添加到隐式默认model_fn(一个是自动创建的)我相信)。因此,当input_fn创建一个新模型并使用(image, labels)填充模型时,输入和模型将位于两个不同的图形上。

要解决此问题,您需要更改lambda。不要只将Estimator对包装到input_fn中,而是将输入的整个结构包装成一个函数,以便Graph运行Input: an integer n > 1. Let A be an array of Boolean values, indexed by integers 2 to n, initially all set to true. for i = 2, 3, 4, ..., not exceeding √n: if A[i] is true: for j = i2, i2+i, i2+2i, i2+3i, ..., not exceeding n: A[j] := false. Output: all i such that A[i] is true. 时所有API调用的副作用将在正确var x = document.createElement("VIDEO"); if (x.canPlayType("video/mp4")) { x.setAttribute("src","movie.mp4"); } else { x.setAttribute("src","movie.ogg"); } x.setAttribute("width", "320"); x.setAttribute("height", "240"); x.setAttribute("controls", "controls"); document.body.appendChild(x); 的上下文中创建所有输入操作和张量。