IceDream's Blog
RSS Feed

Articles

  • Windows 下编译 Tensorflow C++ API v1.8 Debug 版动态库

    在前一篇文章《Windows 下编译 Tensorflow C++ API v1.8 Release 版动态库》介绍了 Release 版的编译,但按这个去编译 Debug 版是不行的,有坑啊!

    在编译到最后,生成 tensorflow.dll 的时候会报 LNK1189:library limit of 65535 objects exceeded 错误。

    这个问题是因为 tensorflow.dll 导出的函数太多,超过了 65535 这个限制;置于为什么有这个限制,可以参考1

    知道问题所在,就相对好办了;再看看 TensorFlow C++ Reference,根本不该导出超过 65535 个函数啊!那一定导出了不该导出的函数,想办法不让他们被导出应该就可以了。

    再看 tensorflow\contrib\cmake\tools\create_def_file.py 文件,里面就做了哪些该被导出,哪些不该被导出的事。

    修改 tensorflow\contrib\cmake\tools\create_def_file.py 中的 EXCLUDE_RE 变量。修改为:

    EXCLUDE_RE = re.compile(r"RTTI|deleting destructor|::internal::|::`anonymous namespace'::|<lambda_[0-9a-z]+>|"
                            r"std::_Vector_iterator<|std::_Vector_const_iterator<|std::_Vector_alloc<|"
                            r"std::_Deque_iterator<|std::_Deque_alloc<|"
                            r"std::_Tree_iterator<|std::_Tree_const_iterator<|std::_Tree_unchecked_const_iterator<|std::_Tree_comp_alloc<|std::_Tree_node<|"
                            r"std::_List_iterator<|std::_List_const_iterator<|std::_List_unchecked_const_iterator<|std::_List_alloc<|"
                            r"std::_Iterator012<|std::_Compressed_pair<"
    )
    

    修改后,再类似 Release 的方式编译 Debug 版就可以了。


    Read More »

  • Windows 下编译 Tensorflow C++ API v1.8 Release 版动态库

    我的目标是将编译好的动态库用于推导,因此,编译过程中所涉及的编译选项,能关闭的都将其关闭,尽量减少依赖。

    Tensorflow 官方 Github 下载或 checkout 出 v1.8 版代码。

    另外,我用到的工具 CMake v3.11.4CUDA v9.0cuDNN v7.0.5 及 Visual Studio 2015 Update 3。

    在编译文件存放目录执行以下 CMake 命令来生成 Visual Studio 2015 项目文件:

    cmake "${SOURCE_PATH}/tensorflow/contrib/cmake" ^
          -T "host=x64" ^
          -G "Visual Studio 14 2015 Win64" ^
          -Dtensorflow_ENABLE_SSL_SUPPORT=OFF ^
          -Dtensorflow_ENABLE_GRPC_SUPPORT=OFF ^
          -Dtensorflow_ENABLE_HDFS_SUPPORT=OFF ^
          -Dtensorflow_ENABLE_JEMALLOC_SUPPORT=OFF ^
          -Dtensorflow_BUILD_CC_EXAMPLE=OFF ^
          -Dtensorflow_BUILD_CC_TESTS=OFF ^
          -Dtensorflow_BUILD_PYTHON_TESTS=OFF ^
          -Dtensorflow_OPTIMIZE_FOR_NATIVE_ARCH=ON ^
          -Dtensorflow_WIN_CPU_SIMD_OPTIONS=/arch:AVX ^
          -Dtensorflow_BUILD_SHARED_LIB=ON ^
          -Dtensorflow_ENABLE_GPU=ON ^
          "-DCUDNN_HOME=%CUDA_PATH_V9_0%" ^
          -Dtensorflow_BUILD_PYTHON_BINDINGS=OFF ^
          "-DCMAKE_INSTALL_PREFIX=${INSTALL_DIR}"
    

    ${SOURCE_PATH} 替换为 Tensorflow v1.8 的源代码路径。

    %CUDA_PATH_V9_0% 这个环境变量对应为 CUDA v9.0 的安装目录;该环境变量在 CUDA v9.0 安装时被自动设置。

    ${INSTALL_DIR} 替换为你希望最后生成 lib、dll 文件及头文件的存放目录。

    不着急执行上述命令,因为有坑需要先进行修改。

    Read More »

  • Jekyll 支持 MathJax

    需要在页面中引入 MathJax 的 JavaScript 或 CSS 来渲染 $\LaTeX$1,例如:

    <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML" type="text/javascript"></script>
    

    默认 \\(...\\) 为行内数学公式,$$...$$\\[...\\] 为独立显示公式。

    常用的 $...$ 并不是默认支持的,如果要支持,这需要在页面中加入以下代码2

    MathJax.Hub.Config({
      tex2jax: {
        inlineMath: [ ['$','$'], ["\\(","\\)"] ],
    });
    

    经过以上设置后的示例:

    $a^2 + b^2 = c^2$ 显示为 $a^2 + b^2 = c^2$, \\(a^2 + b^2 = c^2\\) 显示为 \(a^2 + b^2 = c^2\)。

    代码

    \\[ \mathbf{X} = \mathbf{Z} \mathbf{P^\mathsf{T}} \\]
    

    显示为:

    \[ \mathbf{X} = \mathbf{Z} \mathbf{P^\mathsf{T}} \]

    代码

    $$ \mathbf{X}\_{n,p} = \mathbf{A}\_{n,k} \mathbf{B}\_{k,p} $$
    

    显示为:

    代码

    $$ 
    \begin{aligned}
      & \phi(x,y) = \phi \left(\sum_{i=1}^n x_ie_i, \sum_{j=1}^n y_je_j \right)
      = \sum_{i=1}^n \sum_{j=1}^n x_i y_j \phi(e_i, e_j) = \\
      & (x_1, \ldots, x_n) \left( \begin{array}{ccc}
          \phi(e_1, e_1) & \cdots & \phi(e_1, e_n) \\
          \vdots & \ddots & \vdots \\
          \phi(e_n, e_1) & \cdots & \phi(e_n, e_n)
        \end{array} \right)
      \left( \begin{array}{c}
          y_1 \\
          \vdots \\
          y_n
        \end{array} \right)
    \end{aligned}
    $$
    

    显示为:

    不过有个 BUG,如果文档中有 \begin{displaymath}...\end{displaymath} 这样的代码,MathJax 会当公式处理,显示效果如下: \begin{displaymath}…\end{displaymath} 建议以下写法:

    `\begin{displaymath}...\end{displaymath}`
    

    Read More »

  • TFRecord 格式

    TFRecord 是 Tensorflow 官方推荐的可扩展的数据存取格式。

    TFRecord 的格式是由一系列带 CRC32C 校验数据的记录组成的。每一条记录的格式如下1

    uint64 length
    uint32 masked_crc32_of_length
    byte   data[length]
    uint32 masked_crc32_of_data
    

    TFRecord 的格式中的 data 由 example.proto 定义;example.proto 对应为 tf.train.Example 类。

    定义如下:

    message Example {
      Features features = 1;
    };
    
    message Features {
      map<string, Feature> feature = 1;
    };
    
    message Feature {
      oneof kind {
        BytesList bytes_list = 1;
        FloatList float_list = 2;
        Int64List int64_list = 3;
      }
    };
    

    Read More »

  • Welcome to Jekyll and EasyBook

    You’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.

    To add new posts, simply add a file in the _posts directory that follows the convention YYYY-MM-DD-name-of-post.ext and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.

    Read More »