tensorflow的计算思想
本文主要参考了TensorFlow中文社区的介绍!特此声明。
什么是数据流图(Data Flow Graph)?
数据流图用“结点”(nodes)和“线”(edges)的有向图来描述数学计算。“节点” 一般用来表示施加的数学操作,但也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入持久变量(persistent variable)的终点。“线”表示“节点”之间的输入/输出关系。这些数据“线”可以输运“size可动态调整”的多维数据数组,即“张量”(tensor)。张量从图中流过的直观图像是这个工具取名为“Tensorflow”的原因。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行地执行运算。
高度的灵活性
TensorFlow不是一个严格的“神经网络”库。只要你可以将你的计算表示为一个数据流图,你就可以使用Tensorflow。你来构建图,描写驱动计算的内部循环。我们提供了有用的工具来帮助你组装“子图”(常用于神经网络),当然用户也可以自己在Tensorflow基础上写自己的“上层库”。定义顺手好用的新复合操作和写一个python函数一样容易,而且也不用担心性能损耗。当然万一你发现找不到想要的底层数据操作,你也可以自己写一点c++代码来丰富底层的操作。
一个小示例
我使用随机数来生成数据集,并展示了如何编写一个简单的bp神经网络程序:
import tensorflow as tf
from numpy.random import RandomState
batch_size = 8;
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1));
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1));
x = tf.placeholder(tf.float32,shape=(None,2),name='x-input');
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input');
a = tf.matmul(x,w1);
y = tf.matmul(a,w2);
cross_entropy = - tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)));
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy);
rdm = RandomState(1);
dataset_size = 128;
X = rdm.rand(dataset_size,2);
Y = [[int(x1+x2<1)] for (x1,x2) in X ];
with tf.Session() as sess:
init_op = tf.initialize_all_variables();
sess.run(init_op);
print sess.run(w1);
print sess.run(w2);
STEPS = 5000;
for i in range(STEPS):
start = (i*batch_size)%dataset_size;
end = min(start+batch_size,dataset_size);
sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]});
if i%1000==0:
total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y});
print("After %d training steps,cross entropy on all data is %g" %(i,total_cross_entropy));
print sess.run(w1);
print sess.run(w2);