Tensorflow是个很好的机器学习的框架,他提供了很多必要函数库,既能够用很基础函数快速实现实验原型,又能用很工程化的方式开发一套比较像样的系统,并且TF能够高效的运行在分布式的计算集群上。
但是他的编程方式很诡异,写了一大堆代码,都只是描述计算流程。
1 2 3 4 5 6 7 8 9 10 11 12 13 def build_graph () : features = tf.placeholder(shape=[None , None ], dtype=tf.int32) labels = tf.placeholder(tf.float32, [None , 10 ]) logits = tf.contrib.layers.fully_connected(features, output_size) loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=logits)) train_op = tf.train.GradientDescentOptimizer(0.5 ).minimize(loss) return features, labels, train_op f, l, op = build_graph() with tf.Session() as sess: for _step in range(100 ): sess.run(op, feed_dict={f:input_data['features' ], l:input_data['labels' ]})
函数build_graph()
执行的内容,不是这里的计算内容,只是做了符号描述,要到sess.run()
才真正执行计算。这里的session是tensorflow会把graph拷贝到gpu上,通过核心C++代码来执行的。这是我感觉很别扭的地方。因为之前编程都是,我写的代码就是在执行字面意思,而现在不是了,有部分代码只是在描述一件事情,他的实际逻辑执行要等到下一个阶段才执行。
如果像tf-seq2seq那样,分层、模块化、可配置都做得非常好,但是计算逻辑就分散在各个文件中,又由于tf现在很多功能还是在contrib目录下,这样就会对理解代码增加很多难度。写代码也会变得不那么直观。