0%

在很多机器学习系统中,计算图是一个非常重要的概念,计算图是一个有向无环图,它描述的计算的依赖关系。有了 计算图之后,我们就可以根据 static graph 对计算做各种优化。

在 MXNet 中,参数管理是非常重要的一个功能,MXNet 通过 Parameter 提供了统一的参数定义使用方式。

过去两年用 mxnet 定制了很多 op, 深入学习了 mxnet 源码。本系列以 mxnet v0.7.0 代码为主,深入分析 mxnet 的源码,做一个阶段性的总结,同时也希望能在 mxnet 上进行深度开发的同学提供帮助。

MShadow 是一个轻量级的 Tensor Template Library。mshadow 同时支持 C++ 和 CUDA,一套代码既可以跑在 CPU 上,也可以跑在 GPU 上。并且是 lazy computation 的。如果对于 cuda 上面的运行没有极致要求的话,mshadow 对于 Tensor 的计算是个很好的选择,性能也不会很差。如果对于性能有极致的需求,那就要手动去 tune 了,或者也可以尝试一下 tvm。
本文尝试给 mshadow 添加一个新的 extension, mshadow::expr::resize。完整实现在 Github

在深度学习中,随着模型和数据的不断增长,在大部分情况下需要使用多卡或者多机进行训练。在多卡或者多机训练中。一般有数据并行和模型并行两种并行方案,数据并行的参数更新中有同步更新和异步更新两种方法,本文讨论的是数据并行中的同步参数更新的一种方法。

MXNet 中对 classification 任务提供了把训练图像数据转换成一个大的二进制文件的方法,但是,对于其它任务例如语义分割等,并没有提供类似的功能。这里,介绍一下如何使用 LMDB 的 Python 接口把语义分割训练数据的图像和标签转换成 LMDB 的文件。首先,这里简要介绍一下问什么要把图像文件转换成大的二进制文件。

Gluon IO 使用方法中介绍了如何使用 MXNet 的 IO 接口。Gluon 是 MXNet 提供的一个新的封装接口,非常容易在静态图和动态图之间转换,动态图在调试的时候非常有用,静态图在训练的时候速度更占优势。目前比较推荐使用 Gluon 接口。而且,Gluon 封装了一个使用更加方便的 IO 接口,这里记录下 Gluon 的 IO 使用方法。

NAS 提供了一种自动化搜索网络结构的方法。其大体思想是固定网络的训练过程,然后寻找通过该训练过程可以达到最好效果的网络结构。从一定程度上看这种方法和我们通常选定一种网络结构然后使用不同的优化参数和优化方法找到最好的模型参数的过程恰好相反。

在 ConvNet 中,大部分的计算耗费在计算卷积的过程中,尤其是在端上设备中,对于性能的要求更为苛刻。程序的性能优化是一个复杂而庞大的话题。高性能计算就像系统设计一样,虽然有一些指导原则,但是,对于不同的场景需要有不同的设计方案,因此,对于同一个优化问题,不同的人可能会给出完全不同的优化方案。本文不是探讨硬件和代码级的优化,仅针对计算卷积的一个特定方法 — Winograd 方法做一个简单的记述。

Faster RCNN 的工作具有里程碑的意义,把 Region Proposal 和具体的检测过程全部通过 CNN 完成,实现了整个目标检测过程的 end to end 的训练。后续的大部分工作,例如 SSD, RFCN,FPN,Mask RCNN 等都延续了 RPN 的思路,因此,充分理解 Faster RCNN 对后续的工作有很多帮助。

Gluon 是 MXNet 实现的一套同时可以支持动态图和静态图的计算接口。和原有的 Symbol 接口相比,Gluon 的封装层次更高,在某种程度上使用更灵活。本文记录在学习 Gluon 的过程中实现 DeepLab V3 的过程。同时,数据的处理和输入也是使用的 Gluon 中提供的 Dataset 接口。

在计算优化中有一个重要的方法是把算法和代码实现解耦,这样做的好处是,同一个算法,可以方便得移植到不同的硬件平台。同时,以为算法实现了解耦,因此,在代码优化中,可以非常方便地对硬件有关平台的代码进行灵活的 tune, 从而找到最佳性能方案。

Operators 是构建神经网络的必要元素, operators 定义了输入到输出的映射关系. MXNet 有一系列非常丰富的 operators, 有一些是简单的 operators, 例如 element-wise sum, 也有一些复杂的 operators 例如 convolution. 通常情况下, 使用这些 operators 可以构建大部分常见的 nn. 在 MXNet 实现的很多 operators 通常在 numpy 中是有等价形式的, 例如 repreat, tile 等. 那么, 为什么在MXNet中不直接使用 numpy 呢? 其中最重要的原因就是MXNet需要同时支持cpu和gpu运算, 而numpy目前并不支持gpu计算. 另外, 为了最大化 memory 和 runtime efficiency, MXNet 中的大量的 components 做了深度优化, 例如 tensor data structure (NDArray), execution engine, computational graph 等等. MXNet 中实现的 operators 会综合考虑前面的各种优化从而做到性能的极致优化.

之前已经有两篇分析了 MXNet 的 Bind 和 SimpleBind 的源码, 这篇, 主要是记录一下 CPP package 中是如何调用 Bind 和 SimpleBind 的. 搞清楚这两部分有两个好处, 一是为自己写代码调用 Bind 提供参考, 二是了解 MXNet 中 Symbol/Graph 和具体的 NDArray 是如何协同的.

ResNeXt 和 ResNet, GoogleNet 都是首先构建 building block, 然后把多个 building block 串联起来形成最终的网络结果。这种方法的好处是减少了 hyper-parameters, 而且,这种方法得到的模型适应性更好,也就是说不会再 A 数据集上效果很好,换成 B 数据集效果就很差。ResNeXt 沿用了 ResNet 中 shortcut 的思想,但是,ResNeXt 在 building block 上做了很大的改进。针对每一个 building block 在宽度上进行了拓展,输出的 feature map 的 channel 的数量减少,进而,减少了参数的数量。

ShuffleNet 主要是对 feature map 的 channel 做 shuffle 操作。另外,还借鉴了近期用的比较多的 depthwise separable convolution 的思想。另外在 alexnet 中因为当时显存不足提出的 group convolution, 随后随着显存的不断增大逐步被弃用的 group convolution 在 ShuffleNet 中配合 shuffle layer 操作大量使用。

MobileNet 是 Google 提出的一种 efficient 的模型,总结来讲,mobilenet 中没有全新的 layer, 因此,完全可以在现有的框架例如 caffe, mxnet, TensorFlow 中非常方便地实现。

Xception 的主要特点是 Depthwise Separable Convolutions, Xception 在多个数据集上并没有比 Inception V3 好很多的结果,但是,Xception 中 Depthwise Separable Convolutions 的做法在最近的一些高效模型中被广泛使用。

FCN 是一种有效的对图像语义分割的方法,方法十分简单,分割效果非常好。本文记录使用 FCN 做语义分割的过程。本文记录的方法和 FCN 原始论文并不完全相同,但是,基本思想是一致的。

Bind 是 MXNet 中最重要的一个函数,它连接起来了各个模块。Bind 启动了整个 MXNet 的工作。因此,在分析 MXNet 的各个模块之前最好能先对 Bind 有个初步的了解,理解 MXNet 的各个模块是怎么串起来的。SimpleBind 主要的工作是构建和整理参数,最后还是要把参数传递给 Bind.

上次说到了 MXNet 的基本过程,其中最重要的一步是构建 Executor, 而构建 Executor 中最重要的就是通过 Bind 方法把 MXNet 的各个部件如 Symbol, context, NDArray 参数等数据捏合到一起,因此,要深入理解 MXNet 的计算过程,需要对该 Bind 方法进行深入研究。由于 Bind 方法中的参数,尤其是 NDArray 的参数要求是和 computation graph 的 topo 序相同,因此,直接分析 Bind 仍然不能理解这一点,所以,这里首先分析 SimpleBind, 了解 MXNet 的 Bind 需要怎样的参数输入,而 SimpleBind 又是怎样实现这一点的。

对于用户来说,MXNet 工作的基本流程是,首先通过 symbol 定义一个 computation graph, 然后,把数据绑定到 symbol 上,最后,执行 forward 和 backward 完成模型的优化。下面通过一个最简单的例子来说明这个过程。

MXNet 和 tensorflow 都提供了完善的 Python 借口,Python 相对于 C++ 来多极其方便,因此 Python 比较多。深入分析了解 MXNet 的源码能够带来诸多好处,首先 MXNet 是遵循 C++11 标准的,使用了大量的 C++11 的新特性,分析 MXNet 源码可以帮助学习 C++11 的新特性。其次,MXNet 遵循了模块化的系统设计思想,整个系统设计非常完善,并且和 tensorflow 相比,MXNet 的代码量要少很多,分析 MXNet 的源码可以帮助学习设计简洁高效的系统。

参数是机器学习中很重要的一个部分,参数是用户和机器学习框架进行交互的一种方式。这篇文章将会介绍 DMLC 的参数模块,设计该该轻量级的 C++ 模块的目的就是支持通用的机器学习库,其具备以下几个优点:

翻译自 MXNet 官方文档
深度学习中,我们希望框架运行速度越快越好,支持的数据集/模型越大越好。一种显而易见的方法就是堆机器,堆显卡。这种方案带来的问题是:如何在多台机器,多块显卡上进行并行计算,以及如何在多线程的情况下正确而高效的实现计算的同步。

翻译自 MXNet 官方文档
在深度学习领域有很多深度学习库,每个库都有其独特之处。从系统优化和用户体验角度讲,每个库有什么优点和缺点呢?这篇文章对编程模型做了比较,讨论了他们基本的优缺点以及我们可以从中学习到什么。

翻译自 MXNet 官方文档.
在深度学习中,我们总是希望能够训练更大,更深的网络模型。虽然硬件的发展速度很快,但是,为了构建更复杂的深层网络模型,总是希望有更多的显存/内存可用。对于同样的一个网络,如果能够使用更少的内存占用,也就意味着在训练的时候可以使用更大的 batch size, 通常也意味着更高的 GPU 使用率。

合理地使用网络共享可以极大地提高效率。比如,通过 samba 服务在本地调试代码,然后放到集群上训练。在家的时候,在 PC 上搭建一套 ftp 服务之后,可以在 pad 上直接用 AVPlayer 看 PC 上的视频或者用 PDF Expert 看论文。不占用本地空间,而且,对 PDF 的标注直接保存在 PC 上。本文记录使用 Resilio Sync 进行文件共享的方法。

学情跟踪是一个比较典型的时间序列的数据分析和预测。其目的是根据之前的学习情况,对学生的学习情况进行建模。虽然这里描述的是学情跟踪建模,但是,接下来描述的算法同样适用于其它的类似的场景,例如股票涨跌情况预测。
在这一类应用场景中,与其它应用最重要的一个区别是,该类应用需要预测每一个输出位置的概率。例如,需要预测每一只股票的涨跌。而其它场景需要预测的一般都是 one hot 类型。

RNN 是另外一种在深度学习领域常见的网络模型,在语音识别,NLP 等需要对 sequence 数据建模的场景中应用广泛。由于 sequence 数据的长度是变化的,所以,在实际工程中,常见的一种做法是指定一个 sequence 的长度 \(L\)(一般是最长的一个 sequence 的长度), 然后,把长度不等于 \(L\) 的数据进行 mask, 从而使得所有的 sequence 都具有相同的长度。然而,这种做法存在的问题是,在 sequence 的长度差别比较大的情况下,这样生硬的进行 mask 的做法显然不靠谱。当前,比较常见一种 trade-off 的做法是 Bucket RNN.

本篇记录下我使用使用深度学习做图片检索的过程。
任务背景:有很多图片,而且这些图片没有”类”的概念,也可以说我的每一类都只有一张图片。所以,这种情况下不能用常见的基于”识别”的图像检索。在此之前,使用 Bag of Visual Words 的方法做出了一个版本,可以参考这篇.

这篇文章是 DeepMind 团队使用深度学习。具体来说是卷积神经网络来做语音生成的一个工作。基于基本的语音生成,他们还做了 tts (text to speech), 音乐合成等。实验效果很好。我本人一直很喜欢 DeepMind 团队的工作,因为,他们对问题的提炼很好,所用的方法也比较简单实用,效果常常出人意料地好。顺着这篇文章,学习到了 dilate convolution 这个一个概念。dilate convolution 可以使用较少的计算就能 cover 到较大的 receptive field. 而且由于 dilate 本身的原因,还可以防止 overfitting.

在之前的机器学习和神经网络中,对于非线性变换/激活函数比较常用的是 sigmoid, tanh 等这类比较 smooth 而且 被 bound 住的函数。然而目前,在深度学习尤其是卷积神经网络中,用的最多的是 ReLU 函数。直观上看,ReLU 是一个分段的线性函数,因此,就很容易想到 ReLU 应该不像 sigmoid 和 tanh 等这类 smooth & bounded 的函数那样 powerful, 换句话说,ReLU 的效果应该比较差。然而,在实际应用中,ReLU 的效果要比 sigmoid 这类 smooth & bounded 的函数效果要好很多。经过现实的打脸之后,不禁要问,底为什么 ReLU 的效果会比 sigmoid 好呢?

Backpropagation 算法,全称是 backward propagation of errors. 首先要说明这里面的逻辑,CNN 或者其它的神经网络的优化本质上还是使用的 GD 算法,而 BP 只是求解 GD 的一种方法。所以,要搞明白 BP 算法,首先要搞明白 GD 算法。

Transfer learning 通常在训练数据不足的情况下使用。所谓 transfer learning 最直观的理解是给模型一个很好初始值。由于使用的 base model 通常都是在各大 benchmark 上取得 state of the art 效果的模型,因此,transfer learning 通常能带来事半功倍的效果。另外,transfer learning 还可以防止网络过早出现过拟合。当然,使用 transfer learning 的基础是两个数据集的数据分布是相似的。本文使用 BOT 2016 计算机视觉大赛的数据,详细记录了 transfer learning 的过程。

MXNet 的 DataIter 输入的 Python 接口,不仅适用于图片,而且适用于其它的文件格式。DataIter 比 numpy.array 的巨大的优点是 DataIter 不需要一次性把数据读入到内存。想象一下在 CNN 的训练中动辄几百 G 的训练数据,一次性载入内存比较不现实。另一方面,通过 MXNet 的 IO 接口调用,可以更灵活的控制数据的 IO 过程。

Ubuntu 16.04 发布有一段时间了,其中有一个我比较需要的亮点是对 4K 的显示器支持的更好,一直想升级,但是,因为怕坑太多,一直没有升级。前几天官方发布了一个新的版本 16.04.1, 修复了大量的 bug, 于是,忍不住终于升级了。总体来说,14.04 到 16.04 的升级还是非常平滑的,除了 Emacs 使用 spacemacs 的配置出了一点问题,目前还没有出现影响到工作的问题。搜狗输入法正常使用,OpenCV 3.1.0 也能正常编译安装,CUDA 和 cudnn 都没问题。chrome 和 virtualbox 也都正常。这篇 note 就来记录一下在 Ubuntu 16.04 上安装 OpenCV 3.1.0, CUDA8 cudnn 以及编译 MXNet 的过程。

LSH (Local Sensitive Hash) 是一种在大规模数据中寻找相似数据的方法。LSH 算是一种随机算法 (Random Algorithm). Random Algorithm 的特点是,它不能保证每次都返回准确的结果,但是,它是已较高的概率保证返回正确的结果,或者是与正确结果很接近的 value. 而且,如果计算资源足够,概率可以 as high as desired. LSH 以小概率的搜索失败为代价,大幅度降低了搜索时间复杂度。

BoVW (Bag of Visual Word) 是在传统图像检索领域里比较常用的一种方法。大体可以分为三个步骤:特征提取,聚类 (类似于寻找一组基), 计算图片在基上的坐标。算法的创新点是对图片的特征寻找基。这样,在基固定的情况下,所有的图片都可以使用这组基来唯一的表示。而且,由于基的维数是固定的,也为相似度计算提供了极大的方便。根据检索图片的不同,可以选用不同的特征提取方法。

Softmax 是在神经网络的中应用极其普遍的一种操作,搞清楚 softmax 极其对对应的 cross entropy loss function 的意义及数学推导过程可以有好的帮助理解源码。在这篇文章中,详细地记录了 softmax, cross entropy loss, 和其对应的梯度的推导过程,最后,附加了 MXNet 中的梯度计算代码,可以帮助直观的理解开源代码中梯度的计算过程。

方向梯度直方图(英语:Histogram of oriented gradient, 简称 HOG)是应用在计算机视觉和图像处理领域,用于目标检测的特征描述器。这项技术是用来计算局部图像梯度的方向信息的统计值。

Dropout 是一种非常非常通用的解决深层神经网络中 overfitting 问题的方法,过程极其简单,在调试算法中效果也非常有效,几乎是在设计网络过程中必用的技巧。

卷积神经网络一般力求能够做到 end to end 的训练,end to end 训练也是目前深度学习的主流。训练中主要采用 Back Propagation 算法,而 BP 算法是我们早就学过的梯度下降算法的一种实现。因此,CNN 中的各种优化算法还是在梯度下降算法上面做手脚。在目前各种主流的深度学习工具中也都内置了各种常见的优化算法。然而,把优化算法封装到黑盒中直接使用不利于对于问题的理解和更准确地找到好的优化方向。这篇文章的主要目的是总结和比较深度学习中各种常用的优化算法。希望能对神经网络的优化起到一点点帮助,探究一下黑盒中的内容。

在 ImageNet 数据集上面的准确率首次超越人类。该论文中主要贡献了两点,一是 Parameter ReLU, 二是一种新的参数初始化的方法。这篇论文比 Batch Normalization 稍微早了几天,Batch Normalization 在 ImageNet 上面的准确率也是超越人类。

卷积在 CNN 中是非常基础的一个操作,但是,一旦写出来,要画不少的图,所以,一直拖了下来,刚好最近看到一个比较好的图,能够说明卷积转化为矩阵相乘就行操作的方法。

CAFFE 官方目前已经提供了一个 C++ 做预测的例子,目前大部分工作都转移到了 MXNet, 经常被问到怎么用 CAFFE 做预测,之前基于 CAFFE 的 v0.9999 版本写过一个预测。接口可能有变化,不过,基本思路应该是一样的,希望对各位有所帮助.

googlenet 是 Google 在 ILSVRC-2014 中提出的一种网络模型,并且在获得了当年识别和检测的第一名。googlenet 的特点是参数数量少,提升了计算资源的利用,融合多种尺度的卷积特征,网络层数深 (22 层). 在 googlenet 的基础上,Google 之后又给出了 Inception v1/v2/v3 以及后来在 Inception 中融入 Residual Net 中残差概念的网络结构。googlenet 是深度学习中比较经典的一个网络模型。googlenet 中多种尺度的 kernel 提取的特征进行 concatenate 也是后来构建深层卷积网络时常用的方法。googlenet 中多个 Loss Function 的做法也逐渐成为神经网络训练中常用的方法。另外,googlenet 使用了 nin 中的 \(1 \times 1\) 的卷积进行降维操作。

NIN 是我读过的论文中几篇比较重要的之一,NIN 主要是贡献了 \(1 \times 1\) 的卷积这种玩法以及 global average pooling. 虽然 NIN 给出的模型没有 googlenet vgg16/vgg19 等模型被大家大量的使用和 transfer learning, 但是,NIN 提出的这两个技术影响了后来的一大批卷积神经网络模型。

FaceNet 是 google 在 2015 年提出的基于深度学习的一个用于人脸识别,人脸验证和人脸聚类的系统。在 FaceNet 中,google 直接学习了一个从人脸到欧几里得空间的一个映射关系,在欧几里得空间中点的距离就表示人脸的相似程度。因此,只要该映射学习的好,那么,使用欧几里得空间中的特征向量进行各种有关人脸的任务就可以得到一个很好的效果。FaceNet 学习的是每张图片在欧几里得空间中的表示,从而,在欧几里得空间中的距离就是人脸的相似性。学习到人脸在欧几里得空间的表示之后,其他的关于人脸的任务就变得很简单,例如,人脸验证就是比较两张人脸图片的距离,人脸识别可以看成是一个简单的 K 近邻聚类,人脸聚类直接在欧几里得空间中进行 K 均值聚类等。FaceNet 在 LFW 数据集上面的准确率为 \(99.63%\).

在训练深层神经网络的过程中,由于输入层的参数在不停的变化,因此,导致了当前层的分布在不停的变化,这就导致了在训练的过程中,要求 learning rate 要设置的非常小,另外,对参数的初始化的要求也很高。作者把这种现象称为 internal convariate shift. Batch Normalization 的提出就是为了解决这个问题的。BN 在每一个 training mini-batch 中对每一个 feature 进行 normalize. 通过这种方法,使得网络可以使用较大的 learning rate, 而且,BN 具有一定的 regularization 作用。

搜图的一般过程是首先对于数据库中的所有图片提取并且保存特征,当 Query 输入之后,按照相同的方法提取特征,然后,拿 Query feature 去数据库中按照最近邻的方法去搜索。在最近邻算法中,距离经常采用欧几里得距离。当数据库中的图片量非常大,例如上百万之后,采用欧几里得距离的最近邻算法速度就会比较慢。这时,常用的方法是使用 binary code 来 represent 一张图片。使用 binary code 的好处是,可以使用 Hamming distance 来计算两张图片的相似性.(Hamming distance 的计算方法是对两个向量做异或操作). 这篇文章的工作是:能否直接从图片中生成 binary compact code.

Deep residual net 微软亚洲研究院视觉计算组提出的工作,开创了 152 层的 deep network, 在 ILSVRC2015 的几个主要类别中取得第一名。而且,网络的 tansfer 性能非常好,在 MS COCO(Microsoft COmmon Objects in Context) 中同样获得冠军。

Fast R-CNN 比 R-CNN 主要的优点就是速度快。
那么,具体是通过什么样的操作使得 Fast R-CNN 的速度要比 R-CNN 快很多呢?答案就是:在 R-CNN 中,在 region proposal 的 forward 中,每一个 region proposal 都需要单独计算,而在 Fast R-CNN 中,region proposal 的计算过程是 share 的,这样就减少了很多重复的计算。
另外一个优点是 Fast RCNN 的训练过程是 end-to-end 的,这样有两个好处,一个是解决了在 RCNN 中的 post-hoc training 问题,另外一个就是简化了训练过程。

PCA 是一种比较常用的降维方法,由于算法太常见,而且计算方法几乎是固定的,在使用的时候常常会作为一个黑盒,直接调用某个库中封装好的接口。这里想写的是,PCA 的数学/物理意义, 目的是更好的理解 PCA, 知其然且之气所以然。这样,才能在工作中指导实践,而不是一股脑地之间调用算法。

对 Linux 不太熟悉的同学,CUDA 和 MKL 的安装最好选择默认路径,因为后面给出的例子都是在默认安装路径的下的配置。
教程不是非常详细,如果了解 Linux 的一些基本内容,该教程可以帮助你顺利完成 CAFFE 的安装。
如果对 Linux 比较熟悉,完全可以抛开本教程,按照官方教程安装成功,本教程主要是写给对于 Linux 不是很熟悉的同学。

这里面记录了工作中常用的而且非常有用的代码,主要目的是为了在工作中方便拷贝,避免重新搜索。

为深入了解算法的细节,开始深入代码学习,计划把常见的机器学习算法亲自实现一遍,加深理解。虽然成熟的算法都有非常成熟而且高度优化了的库,但是,手动实现可以对算法有更清晰的认识。而且,大部分算法,工程实现经常无法完全与理论一致。例如在 Batch Normalization 中 test 的参数就是通过训练阶段的 moving average 来计算的,而不是重新跑一遍。

默认的 Ubuntu 的 kernel 附带和非常多的本机并没有的驱动,而且,尤其恶劣的是其内核中的 processor family 编译的是 genetic x86_64, 所以,对于 i5/i7 系列的 CPU 中比较新的特定支不是很好,所以,这就使得我有了自己编译 Ubuntu 内核的冲动。实时也证明,编译内核对于压榨机器性能还是蛮有效果的。由于之前用 Gentoo 的时候已经有了编译内核的经验,所以,编译 Ubuntu 内核并没有遇到很大的困难。

使用命令行进行图像处理的方法,主要是 ffmpeg, 除此之外还有一些其它的工具。

工作中最常用的是 Python, 因此,把 Python 常用的代码单独列出来。

NumPy 是经常要使用到的数据操作工具,各种函数/方法非常多, 功能非常强大。

tmux 是我在工作中每天都要用到的工具,tmux 和 zsh 搭配使用简直是终端神器。

记录在云主机上搭建 shadowsocks 科学上网的方法。
shadowsocks 的基本思路就是,分别在 server 端和 client 端安装相应的软件,使用的时候,例如访问 Google,client 的数据先发送到 server 端然后,server 端把数据转发到 Google,Google 返回的数据也是类似的流程,需要经过我们的 server。

这里记录了 Git 的操作方法和建立 Git 服务的方法。

Python 的配置,使用和部分包的用法

有关 OpenCV 的安装,包括 Ubuntu 系统和 CentOS 系统。

Linux 系统上 samba 服务的安装和使用方法

Linux 平台在使用过程中经常会有一些非日常使用的命令或者小工具,但是,这些命令和工具往往是提升工作效率的利器,这里会不断总结和更新工作中使用的这些命令和工具。另外,一些比较”重”的工具,例如 git, nginx, gcc 等在其内容增长到一定程度的时候为方便浏览会单独开一篇。

MXNet 的官方不是很详尽, 在使用的过程中经常要深入源码, 这里记录一下在使用的过程中总结的一些方法, 方便查阅.