能够兑现类似水彩画的作用(见下图),).构造如下目的代价函数

明天要分享的那篇诗歌是本人个人最爱怜的舆论之一,它的商讨轻松、玄妙,并且意义还一对一不错。那篇杂谈借助数学上的
\(L_0\)
范数工具对图像实行平整,同期保留首要的边缘特征,能够兑现类似水彩画的效果(见下图)。

UFLDL深度学习笔记 (七)拓扑萧条编码与矩阵化

  [He et al.
2013]文章提议了一种基于L0范数最小化的三角形网格去噪算法。该思虑最先是由[Xu
et al.
2011]提议并行使于图像平滑,借使c为图像像素的颜色向量,▽c为颜色向量的梯度,设置目的函数为:minc
|c – c*|2 +
|▽c|0,其中|▽c|0为▽c的L0范数,c*为原始图像的水彩向量。通过引进援救变量δ,优化函数变为:minc,δ
|c – c*|2 + β|▽c – δ|2 +
λ|δ|0,在那之中λ用于决定最终图像的平整程度。优化进程分两步:第一步固定c优化δ,即minδ
β|▽c – δ|2 +
λ|δ|0;第二步固定δ优化c,即minc |c –
c*|2 + β|▽c –
δ|2。然后循环迭代这两步,每一回迭代中β乘以2,使得最终▽c ≈
δ。

另外这篇故事集的作者徐立也是一个相当高产的探究员。

关键思路

  前边几篇所讲的都是环绕神经网络张开的,贰个评释正是激活函数非线性;在前任的探讨中,也设无线性激活函数的抛荒编码,该方法总计直接攻读数据的特征集,利用与此特征集相应的基向量,将学习收获的风味集从特征空间改动成样本数量空间,那样能够用特色集重构样本数量。

​ 数据集、特征集、基向量分别表示为\(x、A、s\).构造如下目的代价函数,对估算相对误差的代价选用二阶范数,对荒凉性因子的查办代价选取一阶范数。原文中尚无对引用误差项在数额集上做平均,实际处境下都会除以数据集个数\(m\).

\[J(A,s)= \frac
1m||As-x||_2^2+\lambda||s||\]

接下来,原文中释疑说为了拉长荒凉性约束,防止取\(A\)的缩放值也能博得同样的代价,荒凉性惩罚须要思索特征集的数值,进一步改正代价函数为

\[J(A,s)= \frac
1m||As-x||_2^2+\lambda||s||+\gamma ||A||_2^2\]

代价函数依然存在L1范数的0点不可微难点,通过类似平滑化解,定义常量值平滑参数\(\epsilon\), 将代价函数产生

\[J(A,s)= \frac 1m||As-x||_2^2+\lambda
\sum_k \sqrt{s_k^2+\epsilon} +\gamma ||A||_2^2\]

鉴于本代价函数非凸,而稳固大肆二个变量之后,代价函数是凸函数,所以能够由此轮换固定\(A,s\)来求最优化代价的\(A,s\).
理论上对上式最优化获得的风味集与经过荒凉自编码学习收获的表征集大约,人类视觉神经具备一种本性,大脑皮层
V1
区神经元能够按一定的动向对边缘举办检验,同有的时候候,那几个神经元(在生理上)被公司成超柱(hypercolumns),在超柱中,相邻神经元以相似的大势对边缘进行检查测验,多个神经元检查评定水平边缘,其相邻神经元检查评定到的边缘就稍微偏离水平方向。为了使算法达到这种
拓扑性
,也正是说相邻的风味激活具备一定三回九转性、平滑性,大家将处以项也改动成考虑相邻特征值,在2X2分组意况下,把原本
\(\sqrt{s_{1,1}^2+\epsilon}\)这一项换来
\(\sqrt{s_{1,1}^2+s_{1,2}^2+s_{2,1}^2
+s_{2,2}^2+ \epsilon}\) 。获得拓扑疏弃编码的代价函数为

\[J(A,s)= \frac 1m||As-x||_2^2+\lambda
\sum_{all G} \sqrt{ \sum_{s \in G}s^2+\epsilon} +\gamma
||A||_2^2\]

尤其用分组矩阵G来表示邻域分组法则,\(G_{r,c}=1\)表示第r组包涵第c个天性,指标函数重写为

\[J(A,s)= \frac 1m||As-x||_2^2+\lambda
\sum \sqrt{ Vss^T+\epsilon} +\gamma ||A||_2^2\]

  当将L0范数最小化的思量应用于三角网格去噪时,网格顶点坐标p能够代替c,可是还供给设置二个离散微分算子来代替▽c,其知足网格平坦区域值为0,个中三个抉择便是离散Laplacian算子。小说建议了一种选取于网格边的微分算子D(e),其表明式为:

710官方网站 1

矩阵化推导

如上符号都是拾贰分抽象意义上的变量,矩阵化完成时就须求思索清楚每行每列的操作是或不是遵从预设的每一类运算法则实现的,原作中从不这一部分剧情,笔者也开支了一番武术推导。

按照前文所说的交替求\(A,s\)最优化计策,我们须要先推导代价函数对\710官方网站,(A,s\)的偏导。设定矩阵表示实行为\(A=[_{Wj,f}]_{visibleSize \times
featureSize}\). \(s=[S_{Wj,f}]_{featureSize\times
m}\). 令\(V=visibleSize,
F=featureSize\).

710官方网站 2            

杂文的目标

所谓图像平滑,正是杰出图像中的低频成分,抑制高频成分,减小突变的梯度。大多数场所下,这么做的目标是为着去除图像中的噪声,因为噪音一般正是有个别孤立的像素点,是像素变化相当的大的区域。在守旧的图像管理中,一大半操作都以用部分负有平滑性质的卷积核查图像实行模糊处理,最常用的如:高斯模糊、均值滤波等等。那几个艺术都有贰个短处,便是在模糊噪声的还要,也搅乱了边缘。当然之后也可以有部分革新的措施,如:双面滤波等,那几个方法都在边缘保持上海展览中心开了好多革新,但有一点点仍旧会损失边缘的新闻。本文的秘技完全分化于未来的那几个算法,它从图像梯度的角度出发,在平坦掉大多数细小的噪声的同期,又能最大限度的维系首要的边缘音信。

固定\(s\)求解\(A\)的梯度与最优取值

代价的一阶范数项对\(A\)求偏导为0.

\[\frac {\nabla J(A,s)} {W_{j,f}}
=\frac 1 m \sum _i^m
2[W_{j,1}S_{1,i}+W_{j,2}S_{2,i}+…W_{j,F}S_{F,i}
-x_{j,i}]S_{f,i}+ 2\gamma W_{j,f}\]

单向联合成矩阵表示为

\[\frac {\nabla J(A,s)} {A} = \frac 2 m
(As-x)s^T +2\gamma A \]

并且大家发掘此表明式为一阶方程,能够获得代价函数取十分的小值时的\(A\)。可得s固定时使代价函数最小的\(A\)为

即\[min J(A,s) \Leftrightarrow A = \frac
{xs^T} {ssT+m \gamma I}; \] .

  但是当有角度邻近0时,微分算子的权重会形成inf,由此小说又建议了一种优化后的微分算子表明式:

舆论重要思虑

固定\(A\)求解\(s\)的梯度

开展代价函数并对\(s\)求解,

\[\begin{align} \frac {\nabla J(A,s)} {
S_{f,i}} &= \frac 1 m \sum _j^V
2[W_{j,1}S_{1,i}+W_{j,2}S_{2,i}+…W_{j,F}S_{F,i}
-x_{j,i}]W_{j,f}+ \frac {\nabla \lambda \sum_f^F \sum_i^m
\sqrt {Gss^T+\epsilon }} {\nabla S_{f,i}} \\ &= \frac 1 m \sum
_j^V 2[W_{j,1}S_{1,i}+W_{j,2}S_{2,i}+…W_{j,F}S_{F,i}
-x_{j,i}]W_{j,f} + \lambda S_{f,i}\sum_l^F{\frac {g_{l,f}}
{S\_smooth_{x,f}}} \end{align}\]

其中\(G=[g_{l,f}]_{F \times F}\)
,\(g_{l,f}=1\)表示第\(l\)组包罗第f天性状。
S_smooth代表依据拓扑编码供给,对特征值的邻域举办平整后的特点矩阵。

进行矩阵化改写,能够收获,八个求和式能够分别写成矩阵乘法:

\[ \frac {\nabla J(A,s)} S = \frac 2 m
A^T(As-x) + \lambda S \cdot (G^T {(1./ S\_smooth)})\]

其一矩阵表达式不可能获得使代价函数最小的\(S\)深入分析式,那一个最优化进程需求利用迭代的法门赢得,可以动用梯度下跌那类最优化措施。

现今大家收获了编写制定代码要求的富有矩阵化表明。

710官方网站 3

一维图像能量信号

在行业内部讲观念以前,大家先想起一下图像平滑的靶子是怎么样。

710官方网站 4

为了轻巧起见,大家先从一维出发,把图像当作一维的复信号。那么,图像平滑正是要把这一个比非常小的邻近「褶皱」的地点抹平,而把那一个大的「褶皱」,也许更标准地说,变化极大的梯度(边缘)保留下去。上边那幅图显示的是例外算法的坦荡效果。能够开采,在此以前的算法在平坦掉那多少个坑坑洼洼的「褶皱」的还要,也把大概把属于真正边缘的大的梯度给模糊了(细节放大图如下)

710官方网站 5

为了幸免这种难题,随想提出一种基于 \(L_0\) 范数的能量最小化方法。

所谓 \(L_0\) 范数,指的正是向量中非0 元素的个数。散文中借用这么些定义,提议贰个图像梯度数量的计算公式:
\[ c(f)=\#\{p\ \big |\
|f_p-f_{p+1}|\neq 0 \} \]
公式中,\(f\)
表示大家平滑后的图像,\(\#\)
表示集结中元素 \(p\) 的个数,而 \(p\) 则意味着像素地点,由此 \(f_p\) 其实就象征图像 \(f\) 在 \(p\) 那个职分的像素值。

因而那个公式其实正是在总计:满意 \(|f_p-f_{p+1}| \neq 0\)
的像素数量,这几个不等式正好正是 \(L_0\)
范数。它的现实意义正是计算图片时限信号中梯度的数码

有了那个公式后,杂文抛出它最基本的靶子函数:
\[ \underset{f} {\operatorname {min}}
\sum_{p}(f_p-g_p)^2 \ \ \ \ \operatorname{s.t.} \ c(f)=k
\]
公式中的 \(g\) 表示原图像,\(f\) 表示平滑后的图像,\(c(f)\)
就是地点提到的测算梯度数量的公式,它代表 \(f\) 中的梯度数量应为 \(k\) 个。

以此公式表示的是图像 \(f\) 中各类像素
\(f_p\) 和原图 \(g\) 中种种像素 \(g_p\) 之间的平方差之和。

最小化那几个指标函数,其实就是要细小化 \(f\) 和 \(g\) 之间的像素差。若无 \(c(f)\) 那么些界定,那么最后的优化结果正是
\(f=g\)。但加上 \(c(f)\)
限制后,这几个指标函数在尽只怕减弱四个非数字信号之间的能量差的相同的时候,又要让 \(f\) 中的梯度数量满足 \(k\) 个。换句话说,它要硬着头皮让 \(f\) 和 \(g\) 相似,同有时候又抹平 \(f\)
中的梯度。由此,最后的优化结果不得不是保留住 \(f\)
中那么些梯度比非常大的边缘,而平整掉那三个梯度一点都十分的小的「褶皱」。

\(c(f)\) 那些限制最大的成效就是严防
\(f\)
出现对边缘的歪曲。假如条分缕析考查地点那张边缘模糊的细节图,你就能够发觉,产生模糊的原由是大家把原本很「抖」的梯度变「缓」了,而缓的梯度其实是由众多小梯度组成的。\(c(f)\)
的范围就是为了削减这种梯度的多少。由此,为了知足 \(c(f)\),指标函数会让 \(f\) 中的梯度偏向于更「抖」。

最小化能量差减掉梯度数量这七个约束的联手博弈下,最后获得了下边包车型地铁这种很平整、同有的时候候边缘很深切的结果:

710官方网站 6

这种互动制约的主张其实是简单而又美貌!

可是,实际选用中存在贰个主题材料,便是 \(k\)
的扭转范围一点都不小,是很难选取的。为了垄断 \(k\) 的挑选范围,散文把 \(c(f)=k\) 那几个约束也投入到对象函数中:
\[ \underset{f}{\operatorname{min}} \{
\sum_p{(f_p-g_p)^2+\lambda c(f)} \} \]
现在 \(\lambda\) 代替 \(k\) 作为能够调护医疗的参数。\(\lambda\) 越大,目的函数对 \(c(f)\)
的防止就越大,梯度数量就越少(即边缘越少),反之,梯度数量越大。

代码达成

本节实施实例中,主文件是
sparseCodingExercise.m ,对\(A,s\)的代价梯度计算模块分别是
sparseCodingWeightCost.m、sparseCodingFeatureCost.m.
依据上述矩阵推导分别填充在这之中的公式部分,全体代码见https://github.com/codgeek/deeplearning

分级固定\(A,s\)实行最优化的手续在sparseCodingExercise.m中,有几条要求小心的地点,不然将会很难磨练出结果。

  • 老是交替起头前,不能够轻巧设定特征值,而是设定为
    featureMatrix = weightMatrix'*batchPatches;
  • 加载原始图像的函数sampleIMAGES.m中不能够调用归一化normalizeData。和疏散自编码区别。
  • 前方推导的固化\(s\)时最优化\(A\)表示中相对无法漏掉单位矩阵,是\(\gamma\)乘以单位矩阵,无法直接加\(\gamma\)。公式为weightMatrix = (batchPatches*(featureMatrix'))/(featureMatrix*(featureMatrix')+gamma*batchNumPatches*eye(numFeatures));.

七个梯度公式代码如下。

function [cost, grad] = sparseCodingWeightCost(weightMatrix, featureMatrix, visibleSize, numFeatures,  patches, gamma, lambda, epsilon, groupMatrix)
%sparseCodingWeightCost - given the features in featureMatrix, 
%                         computes the cost and gradient with respect to
%                         the weights, given in weightMatrix
% parameters
%   weightMatrix  - the weight matrix. weightMatrix(:, c) is the cth basis
%                   vector.
%   featureMatrix - the feature matrix. featureMatrix(:, c) is the features
%                   for the cth example
%   visibleSize   - number of pixels in the patches
%   numFeatures   - number of features
%   patches       - patches
%   gamma         - weight decay parameter (on weightMatrix)
%   lambda        - L1 sparsity weight (on featureMatrix)
%   epsilon       - L1 sparsity epsilon
%   groupMatrix   - the grouping matrix. groupMatrix(r, :) indicates the
%                   features included in the rth group. groupMatrix(r, c)
%                   is 1 if the cth feature is in the rth group and 0
%                   otherwise.
    if exist('groupMatrix', 'var')
        assert(size(groupMatrix, 2) == numFeatures, 'groupMatrix has bad dimension');
    else
        groupMatrix = eye(numFeatures);
    end

    numExamples = size(patches, 2);

    weightMatrix = reshape(weightMatrix, visibleSize, numFeatures);
    featureMatrix = reshape(featureMatrix, numFeatures, numExamples);

    % -------------------- YOUR CODE HERE --------------------
    % Instructions:
    %   Write code to compute the cost and gradient with respect to the
    %   weights given in weightMatrix.     
    % -------------------- YOUR CODE HERE --------------------    
    linearError = weightMatrix * featureMatrix - patches;
    normError = sum(sum(linearError .* linearError))./numExamples;% 公式中代价项是二阶范数的平方,所以不用在开方
    normWeight = sum(sum(weightMatrix .* weightMatrix));

    topoFeature = groupMatrix*(featureMatrix.*featureMatrix);
    smoothFeature = sqrt(topoFeature + epsilon);
    costFeature = sum(sum(smoothFeature));% L1 范数为sum(|x|),对x加上平滑参数后,sum(sqrt(x2+epsilon)).容易错写为sqrt(sum(x2+epsilon))实际是L2范数

%     cost = normError + gamma.*normWeight;
    cost = normError + lambda.*costFeature + gamma.*normWeight;
    grad = 2./numExamples.*(linearError*featureMatrix') + (2*gamma) .* weightMatrix;
%     grad = 2.*(weightMatrix*featureMatrix - patches)*featureMatrix' + 2.*gamma*weightMatrix;
    grad = grad(:);

end

function [cost, grad] = sparseCodingFeatureCost(weightMatrix, featureMatrix, visibleSize, numFeatures, patches, gamma, lambda, epsilon, groupMatrix)
%sparseCodingFeatureCost - given the weights in weightMatrix,
%                          computes the cost and gradient with respect to
%                          the features, given in featureMatrix
% parameters
%   weightMatrix  - the weight matrix. weightMatrix(:, c) is the cth basis
%                   vector.
%   featureMatrix - the feature matrix. featureMatrix(:, c) is the features
%                   for the cth example
%   visibleSize   - number of pixels in the patches
%   numFeatures   - number of features
%   patches       - patches
%   gamma         - weight decay parameter (on weightMatrix)
%   lambda        - L1 sparsity weight (on featureMatrix)
%   epsilon       - L1 sparsity epsilon
%   groupMatrix   - the grouping matrix. groupMatrix(r, :) indicates the
%                   features included in the rth group. groupMatrix(r, c)
%                   is 1 if the cth feature is in the rth group and 0
%                   otherwise.

    if exist('groupMatrix', 'var')
        assert(size(groupMatrix, 2) == numFeatures, 'groupMatrix has bad dimension');
    else
        groupMatrix = eye(numFeatures);
    end

    numExamples = size(patches, 2);

    weightMatrix = reshape(weightMatrix, visibleSize, numFeatures);
    featureMatrix = reshape(featureMatrix, numFeatures, numExamples);

    linearError = weightMatrix * featureMatrix - patches;
    normError = sum(sum(linearError .* linearError))./numExamples;
    normWeight = sum(sum(weightMatrix .* weightMatrix));
    topoFeature = groupMatrix*(featureMatrix.*featureMatrix);
    smoothFeature = sqrt(topoFeature + epsilon);
    costFeature = sum(sum(smoothFeature));% L1 范数为sum(|x|),对x加上平滑参数后,sum(sqrt(x2+epsilon)).容易错写为sqrt(sum(x2+epsilon))实际是L2范数

    cost = normError + lambda.*costFeature + gamma.*normWeight;
    grad = 2./numExamples.*(weightMatrix' * linearError) + lambda.*featureMatrix.*( (groupMatrix')*(1 ./ smoothFeature) );% 不止(f,i)本项偏导非零,(f-1,i)……,groupMatrix第f列不为0的所有行对应项都有s(f,i)的偏导
    grad = grad(:);
end

710官方网站 7 

二维图像功率信号

一维数字信号的羁绊可以很轻易引申到二维时域信号:
\[ C(S)=\#\{p\ \big | \ |\partial_x
S_p|+|\partial_y S_p| \neq 0 \} \]
\(S\) 类似上边提到的 \(f\),在此间它意味着管理后的二维图像,\(\partial_x S_p\) 和 \(\partial_y S_p\) 分别表示在 \(x\) 方向和 \(y\) 方向总计 \(L_0\) 范数。

接下来,大家得以用同一的办法获得目的函数:
\[ \underset{S}{\operatorname{min}} \{
\sum_p{(S_p-I_p)^2+\lambda C(S)} \} \]
公式中 \(I\)
表示原图,别的的类比一维时限信号的公式。

教练结果

数量来源于仍然疏散自编码一节所用的图纸,
设定特征层包蕴1贰十三个节点,输入层为8X8patch即六16个节点,拓扑邻域为3X3的方阵,运营200次磨炼,

当输入值为对应特征值时,每种激活值会有最大响应,所以把A矩阵每一行的陆拾陆个向量还原成8*8的图样patch,也正是特征值了,每一个遮盖层对应贰个,总共119个。结果如下图.
可阅览在现阶段参数下,同样迭代次数,cg算法的图形特征尤其清晰。

lbfgs cg

为了见到更加精致的教练结果,增添特征层以及输入层节点数,特征层采纳257个节点,输入层分别考察了14X14以及15X15,相应需求增添拓扑邻域的高低,选择5X5的方阵。迭代算法选择cg。特征的不可磨灭程度以及拓扑结构的完整性已经和演示中的结果无异。边缘特征平稳排列。而当把输入节点个数扩大到16X16,
练习效益出现恶变,边缘特征开首变得模糊,原因也能够精通,特征层已经不复大于输入层,超完备基的法则不创立了,获得的教练效果与利益也针锋相对变差。

14X14输入节点,拓扑5X5 15X15输入节点,拓扑5X5

日增输入节点的结果:

16X16输入节点,拓扑3X3 16X16输入节点,拓扑5X5

微分算子D(e)中的符号表明

优化措施

企望有生之年看懂补上。。。

  对于非均匀噪声网格,小说在优化进程中加入了正则化项奥德赛(e)
= (p1 – p2 + p3
p4)2,于是优化指标形成:minp,δ |p –
p*|2 + α|R(p)|2 + β|D(p) – δ|2 +
λ|δ|0,其中p*为初始网格顶点坐标,D(p)代表与p相关的表明式,其第i项对应第i条边的微分算子,奥迪Q7(p)的第i项对应第i条边的正则项。一样优化进度分两步:第一步固定p优化δ,即minδ
β|D(p) – δ|2 +
λ|δ|0,当710官方网站 8,δi
= 0,否则δi =
Di;第二步固定δ优化p,即minp |p – p*|2

推行结果

710官方网站 9

上航海用体育地方(e)是舆论的法子和另外图像平滑方法的对照,能够看来,这种基于 \(L_0\)
平滑的议程不但平滑的效能好,并且大约是维持原状地保留了色块之间的边缘新闻。而其他方式在色块(尤其是戊午革命)上的平整力度不比
\(L_0\) 平滑,且边缘也搅乱了比很多。

其它,故事集的平整方法在边缘提取上效果也相当的好,下图中,左边(e)是一向对原图用
Canny 提取边缘的结果,左侧是先用 \(L_0\) smoothing
进行平整,再领取边缘的结果,能够见见,平滑后领取的边缘中抹去了看不尽不根本的底细,而主要的边缘音讯都被提收取来。

710官方网站 10

除此而外,另多个很要紧的用处是图像失量化。图像失量化要求图像中的色块数量尽恐怕少,而那或多或少正中
\(L_0\) smoothing
下怀。下图中的输入图像具有众多噪声细节,而那一个细节用一般的平整方向是很难杜绝的,但
\(L_0\) smoothing
由于限制了梯度数量,由此得以生出很「光滑」的色块区域,极度方便失量化操作。

710官方网站 11

  • α|R(p)|2 + β|D(p) –
    δ|2,相当于求解荒凉矩阵方程组。然后循环迭代上述多个步骤直到到达预约条件。

参考

710官方网站 12

效果:

710官方网站 13

710官方网站 14

正文为原创,转发请申明出处:http://www.cnblogs.com/shushen

 

 

参照他事他说加以考察文献:

[1] Lei He and Scott Schaefer, “Mesh
denoising via L0 minimization,” ACM Trans. Graph. 32, 4, Article 64
(July 2013), 8 pages, 2013.
[2] Li Xu, Cewu Lu, Yi Xu, and Jiaya Jia, “Image smoothing via L0
gradient minimization,” In Proceedings of the 2011 SIGGRAPH Asia
Conference (SA ’11). ACM, New York, NY, USA, , Article 174 , 12 pages,
2011.

相关文章