Fork me on GitHub

Other articles

  1. 机器学习算法之支持向量机SVM:原始问题与对偶问题

    0. 最大间隔分离超平面(Large-Margin Separating Hyperplane)


    考虑一个线性可分数据上的二分类问题,如果用最基本的线性分类器去拟合训练数据,那么产生的结果将不唯一,如下图所示:

    linear

    上图中三条线都将训练样本完全分类正确了,但是显然最右边那条是我们更想得到的,因为:最近的一个训练样本$x$距离分类超平面更远。这就意味着

    1. 这个分类超平面可以容忍更多噪声

    2. 这个超平面更不容易过拟合

    fat

    所以我们的目标是要找到最粗的分类超平面,即令最近所有训练样本$x_i$到分类超平面的最小距离最大,此外这个超平面还要能正确划分所有训练样本。

    $$max:margin(w);subject:correctness$$

    其中:

    $correctness:y_n = sign(w^Tx_n)$, 即 $every \quad y_nw^Tx_n>0$

    $margin(w) = min_{n=1,...,N} \, distance(x_n, w)$

    1. Standard Large-Margin SVM


    对于给定的训练数据集和超平面,定义超平面$ ... read more

  2. 论文笔记《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

    0. 摘要


    1. 现有的卷积神经网络要求输入图片为固定尺寸,也就是说做用CNN图像识别时要对输入图像进行尺寸归一化,这样做可能会影响识别准确率。

    2. 在图像物体检测任务中,一般来说先需要对图像进行窗口扫描生成候选窗口,然后以窗口图像为输入逐个判断。这个过程中有很多重复计算:提取卷积特征(即全连接层之前的所有层)并不要求输入图像尺寸固定,所以单张图像实际上只需计算一遍卷积特征即可。

    本文要介绍的SPP-net便解决了上述两个问题,并在2014年ImageNet的物体检测比赛中取得第二名,图像分类比赛中取得第三名。

    1. DEEP NETWORKS WITH SPATIAL PYRAMID POOLING


    1.1 Convolutional Layers and Feature Maps

    常规的DeepCNN都要求输入图像尺寸固定,这是因为在全连接层中要求输入固定长度的特征向量,而全连接层之前的卷积pooling层并不严格要求输入图像的尺寸固定。卷积pooling层的输出尺寸比例基本和输入图像的尺寸比例一致,这些输出就是所谓的特征图(feature map)。特征图不仅仅反映输入图像对特征响应的强度信息,还反映出空间位置信息,如图1所示,图(a)中箭头位置对应图(b)filter中响应最强烈位置,图(c)中的绿色矩形区域对图(b)的filter有强响应 ...

    read more
  3. Python版Word2Vec 尝试

    0. 数据准备


    首先从搜狗全网新闻数据下载训练数据集,解压后用以下命令生成文件列表保存于文件“sougouCA_list.csv”中:

    find `pwd` -name "*.txt" > sougouCA_list.csv
    

    然后准备了一个中文停用词文档,文件中包含有“的、其中、例如”等2000多个中文停用词,每行一个,文件名“all_stopword.txt”。

    1. 训练模型


    1.1 读取停用词

    从文档中读取所有停用词,存放于一个集合中,届时用于查询某单词是否属于停用词。

    def get_stopWords(stopWords_fn):
        with open(stopWords_fn, 'rb') as f:
            stopWords_set = {line.strip('\r\t').decode('utf-8') for ...
    read more
  4. 论文笔记《Learning Multi-Domain Convolutional Neural Networks for Visual Tracking》

    0. 摘要


    基于CNN的一个跟踪算法,达到了state-of-art水平,意味着深度学习又占领了一个山头。本文中使用的网络由共享层(shared layers)和许多特定目标分支层组成。每一个分支层对应一个二分类的任务:确定输入样本是不是该分支对应的跟踪目标。当在一个新的图像序列中跟踪一个目标时,用一个新的二分类层连接共享层,作为新的跟踪网络,并实时在线微调。这个网络取名MDNet,具体细节看下文。

    1. Multi-Domain Network (MDNet)


    1.1 网络结构

    相比于AlexNet和VGG-Nets,作者使用了一个相对较小的网络来做跟踪,并解释了理由:

    1. 跟踪问题本质上只是个二分类的任务,对模型复杂度要求相对更低。

    2. 随着网络越来越深,空间信息越来越稀释,所以:对于图像中精准的目标定位,CNN并不是那么有效。

    3. 在跟踪任务中通常目标较小,所以输入大小(input size)也就小,网络结构自然也就更浅。

    4. 跟踪通常是一个实时任务,小网络显然更有效率。

    下图即MDNet网络结构,由共享层和K个特定目标分支层组成,黄色和蓝色的bounding boxes分别对应每个特定分支层的正样本和负样本。

    MDNet

    1.2 Learning Algorithm ...

    read more
  5. 机器学习算法之Adaptive Boosted Decision Tree

    0. 前言


    先回忆一下, 在随机森林中, 用bagging + decision tree训练了一堆小决策树,然后用投票的方式将这些树组合起来形成随机森林:

    rf

    那么AdaBoost是否也可以与决策树结合呢?

    1. Weighted Decision Tree Algorithm


    决策树中,对于输入数据是平等对待的,也就是说所有数据的权重是一样的。那么如果我们想要一个可以接受权重的决策树$DTree(\mathcal{D},u^{(t)})$,该怎么做呢?

    第一个方法就是修改决策树内部的error function,使每一个样本的error值乘上对应的权重:

    error

    但是这个方法要修改算法内部,更多的时候我们希望把决策树当成一个黑盒子。所以第二个方法就是在输入数据上动手脚:按照权重比例对数据进行采样。即权重更大的数据有更高的概率被采到。

    sampling

    2. AdaBoost


    简单的说AdaBoost是将一堆estimators线性组合起来,现在我们的base estimator ...

    read more
  6. 机器学习算法之Gradient Boost Decision Tree

    0. Gradient Boost


    在梯度下降方法中,每一次迭代分两步:第一步先找一个好的梯度方向,第二步决定在这个方向上走多远。而在Gradient Boosting中,同样是经过N次迭代,每次先找一个好的函数方向,然后决定在这个函数方向上走多远,如下图中$h(x_n)$即要找的函数方向,$\eta$决定在这个方向上走多远。

    gb

    1. 推导


    假设我们要用GradientBoost做回归,去L2为error measure:

    regression

    我们先看黄色部分的优化问题,经过泰勒展开一番推导:

    reduction

    我们得到了一个问题,求一个$h$使得上式后面那项越小越好。如果我们不对$h$的大小做限制,那么最终$h$会走向无穷大或无穷小:$h(x_n) = -\propto·(S_n-y_n)$。为了避免这样的情况我们给$h(x_n)$加一个限制:

    reg

    所以最终这个问题就演变成了:通过对余数 ...

    read more
  7. 关于多线程编程的一点思考

    0. 起因


    有一堆图片,比如20000张甚至更多,需要我批量处理,处理单张图片的函数processImg(image_path)已经写好,如何效率完成任务?

    1. 出发


    既然要效率完成任务,不用想当然是多线程,借助boost库线程池:

    // this piece of code is from Internet 
    
    #include <boost/asio/io_service.hpp>
    #include <boost/bind.hpp>
    #include <boost/thread/thread.hpp>
    
    namespace multithread
    {                   
        typedef std::unique_ptr<boost::asio::io_service::work> asio_worker;
    
        struct ThreadPool ...
    read more
  8. Function Programming in Python: 2. Callables

    0. 前言


    “Function Programming in Python” Chapter 2:Callables

    反复调用函数是函数式编程中的一个重点。在Python中有好多种不同的函数(或者说是可调用的something function-like)创建方式:

    1. 用关键字def创建常规命名函数

    2. 用关键字lambda创建的匿名函数

    3. 定义了__call__()函数的类的实例

    4. 闭包(closures)

    5. 实例的静态函数

    6. 生成器函数

    纯函数(pure function)和无副作用代码(side-effect-free code)的好处是更容易调试和测试。很多时候在一个函数中side effects很难被完全消除,但是我们可以用函数式编程的思考方式在一定程度上削弱它。

    1. Named Functions and Lambdas


    Named Functions和Lambdas的主要区别就在于是否有__qualname__属性。

    >>> def hello1(name):
    ..... print ...
    read more
  9. Function Programming in Python: 1. (Avoiding) Flow Control

    0. whatever


    “Function Programming in Python” Chapter 1:避免流控制

    在传统的imperative式编程中,一段代码通常包括一些循环(whilefor)、变量的声明和数据的修改(dict,list,set等)、分支语句(if/elif/else/, try/except/finally)。所有这些看起来都很自然,很好理解。这些状态变量和可修改的数据结构通常从现实世界中抽象而来,但是它们会带来一些副作用,随意给定程序的一个断点,我们很难靠人脑快速精确地推断出这些数据里面的值,所以我们经常需要依靠编译器的帮助来查看这些数据里面的值是不是我们想要的那样。

    一个解决方案是使我们的代码专注于描述数据是什么(what),而不是如何构建数据(how).

    1. Encapsulation (封装)


    最先想到的专注于“what”而不是“how”的方法就是:重构代码,把数据构建的操作放在一个独立的地方。考虑改写如下代码:

    # configure the data ...
    read more

Page 1 / 3 »

blogroll

social