TensorFlow 学习:
TensorFlow 是运算流执行器。先创建一个一个的操作单元,这些单元最终在session.run方法中启动。
例如:
import tensorflow as tf
# 创建一个常量 op, 产生一个 4常量. 这个 op 被作为一个节点
# 加到默认图中.
#
# 构造器的返回值代表该常量 op 的返回值.
c1 = tf.constant(4);
# 创建另外一个常量 op, 产生一个 2.
c2 = tf.constant(2);
# 创建一个乘法 matmul op , 把 'c1' 和 'c2' 作为输入.
# 返回值 'product' 代表乘法的结果.
product = tf.matmul(c1, c2)
#到此为止,c1,c2,product只是一些op对象,尤其是product根本不知道8在哪里。因为具体的运算代码还未执行。
# 启动默认图.
sess = tf.Session()
# 调用 sess 的 'run()' 方法来执行乘法 op, 传入 'product' 作为该方法的参数.
# 整个执行过程是自动化的, 会话负责传递 op 所需的全部输入. op 通常是并发执行的.
#
# 函数调用 'run(product)' 触发了图中三个 op (两个常量 op 和一个乘法 op) 的执行.
#
# 返回值 'result' 是一个 numpy `ndarray` 对象.
result = sess.run(product)
print result
# ==> 8
# 任务完成, 关闭会话.
sess.close()
=========================================
真正计算代码的执行起始于sess.run(product);
我们设计一个简单的只有double数据类型的模型,来用java类模拟tensorflow工作流程:
1 class op extends Runable{ 2 private finale session curSess; 3 public List<op> params; 4 public Double result=0;//运算结果 5 public int statu=0;//0未完成运算,1运算执行过未完成,2,运算完成结果可用。 6 public void run(){ 7 boolean bReady=false; 8 while(!bReady){ 9 bReady=true; 10 for(var op in params){ 11 bReady=op.getReady(this.curSess); 12 //不在这里进入wait,是为了先启动所有的params中所有op的运算。 13 } 14 if(!bReady){ 15 for(var op in params){ 16 op.waitReady(); 17 } 18 }else{ 19 break; 20 } 21 } 22 } 23 public boolean getReady(final session psess){ 24 synchronized(this){ 25 if(this.statu==0){ 26 curSess=psess; 27 new Thread(this).start(); 28 } 29 return muln1.statu==2; 30 } 31 } 32 public void waitReady(){ 33 synchronized(this){ 34 if(this.statu!=2){ 35 this.wait(); 36 } 37 } 38 } 39 } 40 class constant extends op{ 41 constant(double p){ 42 result=Double(p); 43 statu==2; 44 } 45 public void run(){ 46 this.notifyall(); 47 } 48 } 49 50 class matmul extends op{ 51 matmul(op p1,op p2){ 52 params.add(p1); 53 params.add(p2); 54 } 55 public void run(){ 56 super.run(); 57 //运行到这里,说明所有的参数op已经运算完毕。 58 result=Double(((Double)params.get(0)).value*((Double)params.get(1)).value); 59 } 60 } 61 //session的模型是这样: 62 63 class session extends op{ 64 session(){ 65 curSess=this; 66 } 67 public void run(op){//此处简化为只接受一个op 68 this.params.add(op); 69 this.run();//该方法直到op运算完成才返回。 70 } 71 }