0%

保存Tmux的屏幕输出分为两步: 首先用capture-pane将屏幕输出保存在buffer里, 然后用save-buffer将buffer内容保存到文件里。

capture-pane中可以用-S-E指定要保存的屏幕输出的范围, 当前屏幕的最上一行为坐标原点,标记为0,下面一行坐标是1,依次类推; 原点的上一行坐标是-1,再上一行坐标是-2,依次类推。

Alt-c进入copy-mode后,屏幕右上角显示当前屏幕在整个pane中的坐标[X/Y], 其中X代表当前屏幕最高行的坐标,Y代表最早一行屏幕输出的坐标, 根据坐标确定要保存文本的起止坐标就可以保存了。

例如要保存第3个pane中的一段近5000行的输出, 进入copy-mode后按g键,到最早的屏幕输出,右上角显示[5676/5676], 用Ctrl-f或者J键向下滚动屏幕, 当想要保存的第一行处于屏幕最上一行时,坐标显示为[5557/5676], 将想要保存的最后一行滚动到屏幕最上一行,坐标显示为[642/5676], 切换到另一个pane里执行:

1
2
tmux capture-pane -S -5557 -E -642 -t 3
tmux save-buffer output.log

这样这段输出就保存到文件output.log里了,其中-t 3指定了要保存的pane的序号。

如果要保存所有历史输出,可以简写为tmux capture-pane -S -.

除了新开一个pane执行tmux命令,也可以在当前pane用快捷键Alt-a进入tmux命令行状态 即command-prompt,然后执行capture-pane -S -5557 -E -642.

1 降采样

CNN降采样的方法主要有三种

    1. stride 大于1的pooling
    1. stride 大于1的conv
    1. stride 大于1的reorg(passthrough layer)

1和2的效果在Striving for Simplicity: The All Convolutional Net[https://arxiv.org/abs/1412.6806] 中有所解释。 卷积神经网络小的时候,使用pooling降采样效果可能更好,卷积神经网络大的时候,使用stride=2的conv降采样效果可能更好。pooling所提供的非线性是不可学习的。
3 可以保留较低层次的信息,细节信息较为丰富, 1,2降采样后的特征具有更强的语义性。

2. 升采样

    1. 插值, nearest interpolation、bilinear interpolation、bicubic interpolation
    2. 反卷积/转置卷积

    deconv和插值,都是通过周围像素点来预测空白像素点的值,区别在于一个权重由人为预先定义的公式计算,一个通过数据驱动来学习

3. Reference

https://zhuanlan.zhihu.com/p/46633171

https://zhuanlan.zhihu.com/p/41427866

最近在处理业务问题及面试一些小伙伴的时候经常会思考算法工程师的核心竞争力到底在什么地方?

​ 公司的诸多业务问题不是单单一种算法就可以搞定,更多的是要制定一种解决方案, 涉及到业务目标的拆解、 快速对拆解的任务进行算法调研、选型, 然后根据业务逻辑形成算法模型的组合,最后将整个算法的解决方案。算法工程师几乎要参与解决方案的全流程,其所需要具备的能力也是多方面的。
​ 一, 对算法模型的掌控能力。
​ 具体到CV里的各个基础任务, 分类、检测、分割、跟踪、视频分类、视频目标检测、3D检测、OCR以及不同的研究范围,有监督、 自监督、 半监督、小样本、异常检测、主动学习、对比学习等各个方面都要有所涉猎。

​ 日常大部分的工作都是在抽象业务问题为算法问题, 然后根据业务要求从检测指标要求,效率要求及可部署性进行算法选型, 确定算法之后快速搭建backbone然后构造训练数据(往往构造训练数据是最耗时的一部分工作, 例如检测算法需要分析数据、制定标注标准), 模型迭代训练与部署模型发布, 还要不断针对badcase、歧义数据进行算法细节上的调整。

​ 二, 工程能力

​ coding能力是及其重要的, python、C++是必会的编程语言。

​ 模型训练框架一般是python的, darknet除外哈, 想要快速实现一个算法idea、需要对整体的算法结构要较为细致的掌握, 比如改进loss, 自定义数据处理器等等,推荐大家多看看优秀框架的源码、 paddlepaddle、mm系列等等。

​ 模型部署, 除非你的业务需求是纯验证性,或者是web端部署,一般情况下都需要将算法模型转换为推理模型,然后用C++去部署、 比如服务端TensorRT、Onnxruntime等等。

​ 三, 架构及软能力

​ 具体到解决方案的建设能力、 和不同业务线不同部门甚至是和客户的沟通能力、 这个阶段需要在某一行业内不断积累、不断摸索。

  1. FLOPs

    Floating point operations : 浮点运算量, 衡量算法算法或者模型的计算量。

    GFLOPs : 1GFOPS = 10 ^ 9 Flops, 10亿次浮点运算

    区别于FLOPS : Floating point operations per second, 指每秒浮点运算次数, 可以理解为计算速度,是一个衡量硬件性能的指标。

2. 普通卷积OP

Image大小为5 x 5, 卷积核大小为3 x 3, 忽略通道的话,那么一次3 x 3卷积所需的计算量为:

(3 x 3)次乘法+ (3 x 3 - 1)次加法 = 17次, 若添加bias的话即为18次;

v2-aada06aa34b5a5c30d21d5fb4269ef2f_720w

​ 那么一个多通道的2D卷积的计算公式如下:

image-20220804162914689

​ 其中,image-20220804163316580

​ 第一项为乘法运算数,第二项为加法运算数, 因为n个数相加,要加n - 1次,所以在不考虑bias时,会 -1。

= 每个卷积核的参数 x 核的数量

image-20220804170744538

  • 深度可分离卷积

    image-20220804165828699

    计算量:

    计算方法=第一部分(输出通道不变,使用C_in个单通道卷积)计算量+第二部分(使用1*1通道卷积)计算量:

    第一部分=每个特征点所需乘法加法次数*特征点个数:

    image-20220804171004000

    第二部分=每个特征点所需乘法加法次数*特征点个数:

    image-20220804171026176

    参数量:

    image-20220804171208992

  • 转置卷积OP

    TODO

  • 全连接OP

image-20220804163155617

I = Input neuron numbers, O = outputneuron numbers

3. Reference

1. KNN

KNN最近邻分类器可以被称为一种消极学习模型(lazy learner),其并未将模型训练及测试分为两个显著的阶段,而是在需要对样本进行分类测试时在对训练样本建模,而像决策树、Logistic Regression、SVM等基于规则的分类器则可以被认为是积极学习模型(eager learner)。

image-20220523150834715

算法的通俗解释

对于给定训练集,以及测试样本,在训练集中找到与该样本最近邻的K个样本点,这K个样本点的多数属于某一类, 则该测试样本就可以被划分为此类别中。

举个例子, 上图包含两类样本,蓝色方形为一类, 红色三角形为一类, 中间绿色圆形样本为待分类的数据。

  • 若 k = 3, 绿色圆点的最近的3个邻居是2个红色三角形和1个蓝色正方形,2 > 1,所以绿色测试样本属于红色三角形这一类。
  • 若 k = 5, 绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色正方形,3 > 2,所以绿色测试样本属于蓝色正方形这一类。

时间空间复杂度

KNN 分类器不需要使用训练集进行额外的训练,训练时间复杂度为0,但在测试时KNN 分类的计算复杂度和训练集中的数目成正比,也就是说,如果训练集中样本总数为 n,那么 KNN 的分类时间复杂度为至少为O(n)。

KNN算法需要大量的空间存储训练样本,适用于小样本集。

K值选择影响

  • K太小,最近邻分类器容易受到训练数据的噪声而产生的过拟合的影响;

  • K太大,最近分类器可能会误会分类测试样例,因为最近邻列表中可能包含远离其近邻的数据点。

python code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from numpy import *
import operator

class KNN:
def createDataset(self):
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = ['A','A','B','B']
return group,labels

def KnnClassify(self,testX,trainX,labels,K):
[N,M]=trainX.shape

#calculate the distance between testX and other training samples
difference = tile(testX,(N,1)) - trainX # tile for array and repeat for matrix in Python, == repmat in Matlab
difference = difference ** 2 # take pow(difference,2)
distance = difference.sum(1) # take the sum of difference from all dimensions
distance = distance ** 0.5
sortdiffidx = distance.argsort()

# find the k nearest neighbours
vote = {} #create the dictionary
for i in range(K):
ith_label = labels[sortdiffidx[i]];
vote[ith_label] = vote.get(ith_label,0)+1 #get(ith_label,0) : if dictionary 'vote' exist key 'ith_label', return vote[ith_label]; else return 0
sortedvote = sorted(vote.iteritems(),key = lambda x:x[1], reverse = True)
# 'key = lambda x: x[1]' can be substituted by operator.itemgetter(1)
return sortedvote[0][0]

k = KNN() #create KNN object
group,labels = k.createDataset()
cls = k.KnnClassify([0,0],group,labels,3)
print cls

2. KNN应用于异常检测

KNN怎么进行无监督检测呢,其实也是很简单的,异常点是指远离大部分正常点的样本点,再直白点说,异常点一定是跟大部分的样本点都隔得很远。基于这个思想,我们只需要依次计算每个样本点与它最近的K个样本的平均距离,再利用计算的距离与阈值进行比较,如果大于阈值,则认为是异常点

通俗的算法描述:

KNN异常检测过程:对未知类别的数据集中的每个点依次执行以下操作

  • 计算当前点 与 数据集中每个点的距离
  • 按照距离递增次序排序
  • 选取与当前点距离最小的k个点
  • 计算当前点与K个邻居的距离,并取均值、或者中值、最大值三个中的一个作为异常值
  • 根据预设阈值确定哪些为异常样本。

3. Reference