来用java类模拟tensorflow工作流程

 

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 }