• 来用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==230         }
    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 }
  • 相关阅读:
    K8S+Docker容器化云高可用集群实战1.1云计算平台解读
    K8S+Docker容器化云高可用集群实战
    K8S+Docker容器化云高可用集群实战1.2云原生解读
    K8S+Docker容器化云高可用集群实战1.1云计算平台解读去
    C#中枚举与字符串、整数之间转换
    如何控制某个字段不参与导出
    底层存储协议介绍
    ErrorContext JDBC Driver,client=10.0.31.109ERROR: out of memory DETAIL: Failed on request of size 262144 优化数据库配置
    MySQL索引覆盖 回表查询
    work_mem setting is too low set work_mem="500MB"
  • 原文地址:https://www.cnblogs.com/bjguanmu/p/15061492.html
Copyright © 2020-2023  润新知