TF Operation的创建

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF Operation的创建

Tensorflow创建OP的过程

以AddNOp为例说明Operation怎样从ops的定义创建具体的kernel实例。
在Tensorflow Excecutor初始化的时候,会迭代计算图中的所有节点,对每个节点的Operation进行创建。如下方法params_.create_kernel(n->def(), &item->kernel):
Tensorflow源码解读

// Code in executor.cc 
Status ExecutorImpl::Initialize() {
......
  for (const Node* n : graph_->nodes()) {
    const int id = n->id();
    const string& frame_name = cf_info.frame_names[id];
    FrameInfo* frame_info = EnsureFrameInfo(frame_name);
 
    // See if this node is a root node, and if so, add to root_nodes_.
    if (n->in_edges().empty()) {
      root_nodes_.push_back(n);
    }
 
    NodeItem* item = gview_.node(id);
    item->node = n;
 
    item->input_start = frame_info->total_inputs;
    frame_info->total_inputs += n->num_inputs();
 
    Status s = params_.create_kernel(n->def(), &item->kernel);

继续阅读“TF Operation的创建”本作品采用知识共享署名 4.0 国际许可协议进行许可。

TF Operation的注册

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: TF Operation的注册

Tensorflow OP的注册

以AddNOp为例说明Operation的注册:
当Tensorflow框架(dll)启动的时候,aggregate_ops.cc的静态方法被调用:

//Code in aggregate_ops.cc
#define REGISTER_ADDN(type, dev)                                   \
  REGISTER_KERNEL_BUILDER(                                         \
      Name("AddN").Device(DEVICE_##dev).TypeConstraint<type>("T"), \
      AddNOp<dev##Device, type>)
 
#define REGISTER_ADDN_CPU(type) REGISTER_ADDN(type, CPU)
 
TF_CALL_NUMBER_TYPES(REGISTER_ADDN_CPU);

继续阅读“TF Operation的注册”本作品采用知识共享署名 4.0 国际许可协议进行许可。

Tensorflow Build on Windows的一些坑

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: Tensorflow Build on Windows的一些坑

Windows Build Tensorflow注意事项
一、Build代码Link的过程中,会出现类似如下的错误:
无法解析的外部符号 icu_62::isSuccess
无法解析的外部符号 icu_62::UnicodeStringAppendable

具体错误原因不清楚,这两个方法的特征是直接在header文件(.h)里面实现了,但没有在cpp文件里面引用,然后生成的Object文件(.o)里面就没有对于的symbol。所以链接的时候tensorflow就找不symbol了。
解决方案是:
针对第一个无法解析,在对于的tensorflow代码中修改isSuccess成isFailure。
继续阅读“Tensorflow Build on Windows的一些坑”

本作品采用知识共享署名 4.0 国际许可协议进行许可。