我正在使用python 2.7.9在Mac OS X Yosemite上工作.
这是我尝试过的:
定义一个类
class A:
def test(self):
print "test"
Run Code Online (Sandbox Code Playgroud)
然后运行
A.__mro__
Run Code Online (Sandbox Code Playgroud)
然后我得到了
>>> A.__mro__
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class A has no attribute '__mro__'
Run Code Online (Sandbox Code Playgroud)然后我定义
class B(object):
def test(self):
print "test"
Run Code Online (Sandbox Code Playgroud)
然后运行
B.__mro__
Run Code Online (Sandbox Code Playgroud)
然后我得到了
>>> B.__mro__
(<class '__main__.B'>, <type 'object'>)
Run Code Online (Sandbox Code Playgroud)这两个定义有什么不同?我发现在python 3中,没有"对象"的版本仍然有__mro__方法.
我使用TensorFlow r1.0和GPU Nvidia Titan X训练一个类似Inception的模型.
我添加了一些摘要操作来可视化训练过程,使用如下代码:
def variable_summaries(var):
"""Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
with tf.name_scope('summaries'):
mean = tf.reduce_mean(var)
tf.summary.scalar('mean', mean)
with tf.name_scope('stddev'):
stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
tf.summary.scalar('stddev', stddev)
tf.summary.scalar('max', tf.reduce_max(var))
tf.summary.scalar('min', tf.reduce_min(var))
tf.summary.histogram('histogram', var)
Run Code Online (Sandbox Code Playgroud)
当我运行这些操作时,训练一个纪元的时间成本约为400秒.但是当我关闭这些操作时,训练一个纪元的时间成本仅为90秒.
如何优化图表以最小化汇总操作时间成本?
我的训练集包含两种文件:训练图像,文件名如"1.png",标签文件,名称如"1.label.txt".
我在教程中发现了一些Queue和Reader的用法,如下所示:
filename_queue = tf.train.string_input_producer(filenames)
result.key, value = reader.read(filename_queue)
Run Code Online (Sandbox Code Playgroud)
但是,因为我的训练集包含两种文件,一种对应一种.我怎样才能像上面的代码一样使用Queue和Reader?
编辑
我正在考虑使用一个包含基本名称的队列来提供给另外两个队列,分别是图像和标签.像这样的代码:
with tf.Session() as sess:
base_name_queue = tf.train.string_input_producer(['image_names'], num_epochs=20)
base_name = base_name_queue.dequeue()
image_name = base_name + ".png"
image_name_queue = data_flow_ops.FIFOQueue(32, image_name.dtype.base_dtype)
image_name_queue.enqueue([image_name])
x = image_name_queue.dequeue()
print_op = tf.Print(image_name, [image_name])
qr = tf.train.QueueRunner(base_name_queue, [base_name_queue] * 4)
coord = tf.train.Coordinator()
enqueue_threads = qr.create_threads(sess, coord=coord, start=True)
for step in range(1000000):
if coord.should_stop():
break
print(sess.run(print_op))
coord.request_stop()
coord.join(enqueue_threads)
Run Code Online (Sandbox Code Playgroud)
但是运行此代码会导致错误:
TypeError:Fetch参数有无效类型,必须是字符串或Tensor.(无法将FIFOQueue转换为Tensor或Operation.)
并且错误指向此行:
coord.join(enqueue_threads)
Run Code Online (Sandbox Code Playgroud)
我想我必须误解TensorFlow队列的工作原理.