2017年11月28日星期二

bazel 初入门学习

 笔者根据bazel官网的c++例程进行学习

1. 安装bazel
安装链接:https://docs.bazel.build/versions/master/install.html

2. 下载仓库:
 git clone https://github.com/bazelbuild/examples/
 例子代码在examples/cpp-tutorial目录下,目录结构为:

examples
└── cpp-tutorial
    ├──stage1
    │  └── main
    │      ├── BUILD
    │      ├── hello-world.cc
    │  └── WORKSPACE
    ├──stage2
    │  ├── main
    │  │   ├── BUILD
    │  │   ├── hello-world.cc
    │  │   ├── hello-greet.cc
    │  │   ├── hello-greet.h
    │  └── WORKSPACE
    └──stage3
       ├── main
       │   ├── BUILD
       │   ├── hello-world.cc
       │   ├── hello-greet.cc
       │   └── hello-greet.h
       ├── lib
       │   ├── BUILD
       │   ├── hello-time.cc
       │   └── hello-time.h
       └── WORKSPACE
如您所见,有三组文件,每组代表本教程中的一个阶段。 在第一阶段,你将建立一个单一的目标驻留在一个包中。 在第二阶段,你将把你的项目分成多个目标,但是把它保存在一个包里。 在第三个也是最后一个阶段,你将把你的项目分成多个包,并用多个目标构建它。

3. Build
3.1 set up the workspace
在构建项目之前,您需要设置其工作区(workspace)。 工作区是保存项目源文件和Bazel构建输出的目录。 它还包含了Bazel认为特殊的文件:
  (1)WORKSPACE文件,它将目录及其内容标识为Bazel工作区,并位于项目目录结构的根目录下
   (2) 一个或多个BUILD文件,告诉Bazel如何构建项目的不同部分。 (包含BUILD文件的工作空间中的一个目录就是一个包,在本教程的后面,您将学习有关包的信息。)
要将目录指定为Bazel工作区,请在工程目录中创建一个名为WORKSPACE的空文件。当Bazel构建项目时,所有输入和依赖项必须位于同一个WORKSPACE中。

3.2 ubderstand the BUILD file
 BUILD文件包含几种不同类型的Bazel指令。 最重要的类型是构建规则,它告诉Bazel如何构建所需的输出,如可执行的二进制文件或库。 BUILD文件中每个构建规则的实例称为目标,并指向一组特定的源文件和依赖关系。 目标也可以指向其他目标。
 看下根据上述git命令clone下来的 examples/cpp-tutorial/stage1/main 目录

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)
 在我们的例子中,hello-world目标实例化了Bazel的内置cc_binary规则。 该规则告诉Bazel从hello-world.cc源文件中构建一个自包含的可执行二进制文件hello-world,并且不包含任何依赖.

3.3 Build the project
让我们来构建示例项目,转到cpp-tutorial/stage1目录下并且运行下面的命令:
bazel build //main:hello-world
注意目标标签 - // 表示WORKSPACE所在的根目录,hello-world是我们在BUILD文件中命名的目标。

INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 2.267s, Critical Path: 0.25s
 恭喜你,你刚刚建立了你的第一个Bazel目标! Bazel将构建输出放置在工作空间根部的bazel-bin目录中。 通过浏览其内容来了解Bazel的输出结构。
 现在可以测试你刚刚编译的代码了
   bazel-bin/main/hello-world

3.4 Review the dependency graph
一个成功的构建具有在BUILD文件中明确声明的所有依赖关系。 Bazel使用这些BUILD文件来创建项目的依赖关系图,从而实现准确的增量构建.
 让我们来看看我们的示例项目的依赖关系。 首先,生成依赖关系图的文本表示(在工作空间根目录下运行该命令):
bazel query --nohost_deps --noimplicit_deps 'deps(//main:hello-world)' \
  --output graph
将运行结果输入 webgraphviz
结果如下:























现在你已经建立了你的工作空间,建立了你的项目,并且检查了它的依赖关系,让我们增加做一些更复杂的事情。

Refine your bazel build
虽然单个目标对于小型项目已经足够了,但是对于较大的项目,您可能需要拆分为多个目标和包,以允许快速增量构建(即只重建已更改的内容),并通过构建项目的多个部分来加速构建
在cpp-tutorial/stage2/main文件中
 BUILD文件内容为:

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
    ],
)
deps表示依赖于,hdrs表示头文件?
运行bazel build //main:hello-world,结果如下:
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 2.399s, Critical Path: 0.30s
现在可以运行bazel-bin/main/hello-world进行测试
依赖图如下:

 











Use multiple packages
如下目录cpp-tutorial/stage3
└──stage3
   ├── main
   │   ├── BUILD
   │   ├── hello-world.cc
   │   ├── hello-greet.cc
   │   └── hello-greet.h
   ├── lib
   │   ├── BUILD
   │   ├── hello-time.cc
   │   └── hello-time.h
   └── WORKSPACE

BUILD文件如下:
lib/BUILD:
cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)
main/BUILD :
cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
) 
 
依赖图如下:
 
 
 
 
 
 
 
 
 
 
 
 
看完这个,你可以开始系统的学习

2017年11月22日星期三

pycharm 快捷键

快捷键: https://segmentfault.com/a/1190000005776418

我的逐步积累:
shift + F6 全局修改一个函数名或者变量名等

Ctrl + R     替换
Ctrl + Shift + F  全局查找
Ctrl + Shift + R  全局替换

tensorflow错误集

1. restore from checkpoint
    1.1 tensorflow.python.framework.errors_impl.InternalError: Unable to get element from the feed as bytes    此处表明文件目录不对

    1.2 export model 时出现:NotFoundError (see above for traceback): Key Modeffl/eval_net/l1/b1 not found in checkpoint
     [[Node: save/RestoreV2 = RestoreV2[dtypes=[DT_FLOAT], _device="/job:localhost/replica:0/task:0/cpu:0"](_arg_save/Const_0_0, save/RestoreV2/tensor_names, save/RestoreV2/shape_and_slices)]]
  在新建模型的时候在前面加上了name_scape和variable_scope,导致检查点文件里参数的名称和新建模型的名称不一致,故而不可恢复,因为在检查点文件中找不到对应的参数名称
故而,如果在train模型时前面加上了相应的name_scope或者variable_scope,那么在导出时候也要加上,以此保证参数名称的一致性

2. serving

    2.1  Invalid argument: Shape [?,62] is not fully defined

找到一个解决方案,但是不适合我,我用的是官网的方法
https://stackoverflow.com/questions/41346058/you-must-feed-a-value-for-placeholder-tensor-input-example-tensor-with-dtype-s 

我遇到这个问题是在export,serving和client的过程中.
花了整整一天 ,终于知道是什么错了.
原因是在模型中我们用的是placeholder为了接收输入的组件,在export的时候,我们存储模型的参数和规定模型的输入和输出.但是由于模型中的placeholder实际上并没有与export的输入产生关联,故而出错.所以会一直报shape[?,62] is not fully defined.
要解决这个问题.就需要知道如何讲s与export的inputs产生关联

发现是这个问题后,就很好解决了.
 (1).当模型的输入是作为参数时,在外部定义placeholder,然后指定模型参数为placeholder的值,关联了模型的输入与export定义的输入
 (2).当模型的输入是placeholder时,就需要直接将input指定为model.[输入placeholder名就行了]

2017年11月19日星期日

论文开题需要做的事情

持续更新

11月20-11月30

第一件事: 看各大知名workshop现如今的研究方向,对论文的研究方向有个大致的了解

第二件事: 确定是基于工程方向的文章,找往届的论文看看格式

12月1-12月30

第三件事:论文题目初定,有细节的地方尚待考量

dan,ddqn,duel dqn
https://blog.csdn.net/u013236946/article/details/73161586

2017年11月8日星期三

那些年,我看过的优秀代码

介于看代码很重要,从今天开始看代码:

1. github : tensorflow/nmt     仓库[https://github.com/tensorflow/nmt.git]
 主题:机器翻译
 网络:rnn,bi-rnn,deep n
 时间:
2017年11月20日 : 看完程序脉络和train过程

学到的东西
1.
import argparse
#创建一个命令解析器的句柄

parser = argparse.ArgumentParser()
#注册一个命令解析器参数类型,其中lambda v: v.lower()=="true"
#是代表一个匿名函数的实现,主要判断获取到的参数v转换成小写后是否等于true
parser.register("type", "bool", lambda v: v.lower() == "true")

2.add_argument里面参数的含义
http://blog.csdn.net/u013177568/article/details/62432761


在一月份结束时务必完成!  江山代有人才出,各领风骚数百年啊啊啊啊!
 (差不多看完2018/01/23)


2. Surprise     仓库【https://github.com/NicolasHug/Surprise.git】    主页【http://surpriselib.com/

 (差不多看完2018/01/25 ,做小组汇报)


3. KubeFlow  仓库【https://github.com/google/kubeflow】

2.flask[据说非常适合工程上的学习]

 

2017年11月6日星期一

leetcode 17

17.   Letter Combinations of a Phone Number Medium Given a string containing digits from   2-9   inclusive, return all possible l...