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 版就可以了。
-
Windows 下编译 Tensorflow C++ API v1.8 Release 版动态库
我的目标是将编译好的动态库用于推导,因此,编译过程中所涉及的编译选项,能关闭的都将其关闭,尽量减少依赖。
从 Tensorflow 官方 Github 下载或 checkout 出 v1.8 版代码。
另外,我用到的工具 CMake v3.11.4、CUDA v9.0、cuDNN 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 文件及头文件的存放目录。不着急执行上述命令,因为有坑需要先进行修改。
-
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}`
-
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; } };
-
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 runjekyll 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 conventionYYYY-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.