我是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'输入图和层图不一样'
请帮帮我。
答案 0 :(得分:2)
我自己也是张力流动的新手,所以请耐心等待。
AFAICT,当您拨打任何创建"张贴"的tf
API时或"操作"它们被创建为一个名为Graph
的上下文。
此外,我相信当Estimator
运行时,它会为每次运行创建一个新的空Graph
。它通过运行Graph
和model_fn
来填充input_fn
,tf
和Graph
应该调用model_fn
API来添加"张贴"和"操作"在这个新的input_fn
。
Graph
和Estimator
的返回值只提供参考,以便部件可以正确连接 - 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);
的上下文中创建所有输入操作和张量。