"> "> Yufei Luo's Blog - But I was so much older then, I am younger than that now.

make

对于包含有许多源文件的大型工程,整个工程需要按照一定的编译规则进行编译,才能成功地将整个工程编译为可执行文件。make是最常用的工程构建工具,它可以用于自动编译和维护项目源码。同时,make命令可以只更新修改后的文件以及与之相关的所有文件,而对未修改的文件不做任何处理,从而提高效率。

阅读全文 »

CUDA硬件知识

CPU和GPU的区别

  • 架构:CPU被设计用来执行少量比较复杂的任务,GPU被设计用来执行大量比较简单的任务;CPU的设计主要针对于大量离散而不相关的任务,GPU的设计主要是针对于可以分解成大量的小块且可以独立运行的问题。
  • 支持线程的方式:CPU的每个核只有少量的寄存器;GPU的每个核有多个寄存器组。
  • 处理器数量:CPU的核数较少,而GPU具有大量的流处理器。
  • 失速状态的处理:CPU的调度策略是基于时间分片,而GPU的调度策略是使用工作池来保证一直有事可做。
  • 任务执行模式:CPU会将一个单独的指令流分配到CPU核心,而GPU是将同一条指令送到N个逻辑执行单元。
img
阅读全文 »

1
2
3
4
5
6
import torch
import numpy as np
import torchvision
import torchaudio
import torchtext
import torch_geometric

torch.Tensor

概述

在PyTorch中,可以创建类似于NumPy中的多维数组(ndarray),在PyTorch中对应的数据类型是torch.Tensor。在一个tensor中,所有的数据具有相同的数据类型。

tensor类型的两个重要属性为:

  • dtype:表示tensor的数据类型
  • device:表示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),便是从数据中找出异常点的过程。异常检测在实际中被广泛应用,例如信用卡欺诈,工业损毁检测,异常图像检测等。

按照目前比较公认的说法,异常点可以分为如下三种类型:

  • 单点异常(全局异常):即某个点与全局大多数点都不一样。就像在一群鱼中混入了一只乌龟,乌龟就可以算作单点异常。
  • 上下文异常:这类异常经常出现于时间序列中,即某个时间点的数据与前后差异较大。例如在气温的时序数据中,在前后都是30度的最高气温中突然出现了一天最高气温为0度。
  • 集体异常:这类异常是由多个对象组合构成的,就是单独看某个个体可能不存在异常,但是这些个体同时出现就构成了异常。例如某一天一栋楼里面有20户人家同时搬家,这些事件单独看不属于异常,但是合起来便成为了异常事件。

常用的异常检测方法可以分为无监督异常检测、有监督异常检测和半监督异常检测这三种类型,每一类里面又有一些不同的算法,下面将对无监督方法和有监督方法中一些常见的方法进行介绍。需要说明的是,大多数实际的异常检测需要对没有标签的数据集检测异常点,因此无监督的异常检测使用的更多一些。

阅读全文 »

高斯过程

在概率论和统计学中,高斯过程指的是观测值出现在一个连续输入空间(如时间或空间)的随机过程。在高斯过程中,连续输入空间中的每个点都是与一个正态分布的随机变量相关联;此外,这些随机变量组成的有限集合也都对应于一个多元正态分布。

用数学语言可以描述为:假设有一组随机变量\(\{\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\)表示回归树的结点个数。

阅读全文 »