make
对于包含有许多源文件的大型工程,整个工程需要按照一定的编译规则进行编译,才能成功地将整个工程编译为可执行文件。make
是最常用的工程构建工具,它可以用于自动编译和维护项目源码。同时,make
命令可以只更新修改后的文件以及与之相关的所有文件,而对未修改的文件不做任何处理,从而提高效率。
"> ">
对于包含有许多源文件的大型工程,整个工程需要按照一定的编译规则进行编译,才能成功地将整个工程编译为可执行文件。make
是最常用的工程构建工具,它可以用于自动编译和维护项目源码。同时,make
命令可以只更新修改后的文件以及与之相关的所有文件,而对未修改的文件不做任何处理,从而提高效率。
1 | import torch |
在PyTorch中,可以创建类似于NumPy中的多维数组(ndarray),在PyTorch中对应的数据类型是torch.Tensor
。在一个tensor中,所有的数据具有相同的数据类型。
tensor类型的两个重要属性为:
关于tensor的操作可参考文档:https://pytorch.org/docs/stable/tensors.html
本文以部署目标检测模型YOLOv5为例,说明如何使用TensorRT C++ API部署训练好的神经网络模型,并进行推理。YOLOv5模型的输入为(batch_size, channels, image_height, image_width)
,用于推理的模型输出为(batch_size, image_height / 32 * image_width / 32 * 21, num_classes + 5)
。其中输出已经被转化为实际的像素值以及概率值,而不是像训练阶段一样为转换过的数值。
YOLOv5的GitHub repo:https://github.com/ultralytics/yolov5。
在数据集中,可能会存在少量数据与其它数据“格格不入”,不符合大量数据的规律,这些数据点被称为异常点或离群点。异常检测(Anomaly Detection),又叫做离群点检测(Outlier Detection),便是从数据中找出异常点的过程。异常检测在实际中被广泛应用,例如信用卡欺诈,工业损毁检测,异常图像检测等。
按照目前比较公认的说法,异常点可以分为如下三种类型:
常用的异常检测方法可以分为无监督异常检测、有监督异常检测和半监督异常检测这三种类型,每一类里面又有一些不同的算法,下面将对无监督方法和有监督方法中一些常见的方法进行介绍。需要说明的是,大多数实际的异常检测需要对没有标签的数据集检测异常点,因此无监督的异常检测使用的更多一些。
在概率论和统计学中,高斯过程指的是观测值出现在一个连续输入空间(如时间或空间)的随机过程。在高斯过程中,连续输入空间中的每个点都是与一个正态分布的随机变量相关联;此外,这些随机变量组成的有限集合也都对应于一个多元正态分布。
用数学语言可以描述为:假设有一组随机变量\(\{\xi_t\},t\in T\),\(T\)代表一个连续域,如果对于\(\forall n\in N^+\),都有\(t_1,t_2,\dots,t_n \in T\),并且满足\(\xi_{t_1},\xi_{t_2},\dots,\xi_{t_n}\triangleq \xi_{t_1 \sim t_n }\sim \mathcal{N}(\mu_{t_1 \sim t_n },\Sigma_{t_1 \sim t_n })\),那么我们就称\(\{\xi_t\},t\in T\)是一个高斯过程\(\mathcal{GP}(\mu,\sigma^2)\)。通俗地讲,也就是说有一系列在时间或者空间上连续的点\(\{\xi_t\}\),如果按照时间或者空间分开看的话每个\(\{\xi_t\}\)各自符合一个一维的高斯分布,而它们合起来看则是符合一个多维的高斯分布。
K近邻(K-Nearest Neighbors)算法是一种基本的回归与分类算法。它的工作原理是,给定一个测试样本,然后基于与这个测试样本最近的\(k\)个“邻居”的信息来进行预测。对于回归任务来说,通常使用投票法,选择\(k\)个样本中出现最多的类别标记作为预测结果;在回归任务中使用平均法,将\(k\)个样本结果的平均作为预测结果。此外,对于这\(k\)个样本还可以基于距离或者其它权重来进行加权。
朴素贝叶斯算法是基于贝叶斯定理和特征条件独立假设的分类方法。对于给定的训练数据集,算法会基于特征条件独立假设学习输入和输出的联合概率分布;然后对于给定的输入,利用贝叶斯定理求出后验概率最大的输出。这种算法实现简单,学习与预测效率都较高。
使用数学语言,朴素贝叶斯算法可以描述如下:
设输入空间\(\mathcal{X}\subseteq R^n\)为\(n\)维向量的集合,输出空间为类标记集合\(\mathcal{Y}=\{c_1,c_2,\dots,c_K\}\)。输入为特征向量\(\boldsymbol{x}\in \mathcal{X}\),输出为类标记\(y\in \mathcal{Y}\)。\(X\)是定义在输入空间\(\mathcal{X}\)上的随机向量,\(Y\)是定义在输出空间\(\mathcal{Y}\)上的随机变量。\(P(X,Y)\)是\(X\)和\(Y\)的联合概率分布,训练数据集\(D=\{(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),\dots,(\boldsymbol{x}_m,y_m)\}\)由\(P(X,Y)\)独立同分布产生。朴素贝叶斯法通过训练数据集学习联合概率分布\(P(X,Y)\)。具体来说,联合概率分布\(P(X,Y)\)是通过计算先验概率分布\(P(Y=c_k),k=1,2,\dots,K\)与条件概率分布\(P(X=\boldsymbol{x}|Y=c_k)=P(X^{(1)}=x^{(1)},\dots,X^{(n)}=x^{(n)}|Y=c_k),k=1,2,\dots,K\)来计算的。
以决策树作为基函数的提升方法称为提升树,它可以表示为决策树的加法模型: \[ f_M(\boldsymbol{x})=\sum_{m=1}^{M}T(\boldsymbol{x};\Theta_m) \] 其中\(T(\boldsymbol{x};\Theta_m)\)表示决策树,\(\Theta_m\)表示决策树的参数,\(M\)为树的个数。提升树可以使用于分类问题以及回归问题。如果用于分类问题,只需要将AdaBoost算法中的基模型设置为决策树即可。
而对于回归问题,提升树的训练过程如下。设训练数据集\(D=\{(\boldsymbol{x}_1,y_1),(\boldsymbol{x}_2,y_2),\dots,(\boldsymbol{x}_N,y_N)\}\),\(\boldsymbol{x}_i\in R^m\),\(y_i \in R\)。对于回归树来说,它将输入空间划分为\(J\)个互不相交的区域\(R_1,R_2,\dots,R_j\),并且在每个区域上的输出为常量\(c_j\),可以表示为 \[ T(\boldsymbol{x};\Theta)=\sum_{j=1}^{J}c_j I(\boldsymbol{x}\in R_j) \] 其中参数\(\Theta=\{(R_1,c_1),(R_2,c_2),\dots,(R_J,c_J)\}\)表示树的区域划分以及各个区域上的常数,\(J\)表示回归树的结点个数。
注:本文的内容摘录自《Linux/UNIX系统编程手册》(原名The Linux Programming Interface)