计算机视觉的一个挑战:数据的输入可能会非常大,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,巨大的内存需求让人不太能接受。
解决方案:卷积计算
过滤器(或称为核):类似 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\end{bmatrix} ⎣⎡111000−1−1−1⎦⎤的矩阵,与输入进行卷积(*)运算(与乘法符号相同,意义不同,此处是一个重载符号)
卷积运算后右边的图片我们可以理解为另一张图片
卷积运算的实现:如conv_forward函数。如果在tensorflow下,这个函数叫tf.conv2d。在Keras这个框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。
在上文 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\end{bmatrix} ⎣⎡111000−1−1−1⎦⎤过滤器中:若运算后值为正数,则原图该值对应的部分过渡是由亮到暗(从左往右)
注:如果你不在乎这两者的区别,你可以取出矩阵的绝对值
其他过滤器:
水平边缘检测: [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \begin{bmatrix}1 & 1 & 1\\ 0 & 0 & 0\\ -1 & -1 & -1\end{bmatrix} ⎣⎡10−110−110−1⎦⎤
Sobel的过滤器: [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 2 & 0 & - 2 \\ 1 & 0 & - 1 \\\end{bmatrix} ⎣⎡121000−1−2−1⎦⎤(可提高结果的鲁棒性)
Scharr过滤器: [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix} 3& 0 & - 3 \\ 10 & 0 & - 10 \\ 3 & 0 & - 3 \\\end{bmatrix} ⎣⎡3103000−3−10−3⎦⎤(垂直边缘检测)
把这矩阵中的9个数字当成9个参数,使用反向传播算法以理解这9个参数。让神经网络自动去学习它们,神经网络可以学习一些低级的特征,例如边缘的特征
一个 n × n n×n n×n的图像,用 f × f f×f f×f的过滤器做卷积,那么输出的维度就是 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)×(n-f+1) (n−f+1)×(n−f+1)
Padding意义:
防止图像变小
防止边缘信息丢失
如果 p p p是填充的数量,输出则为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)×(n+2p-f+1) (n+2p−f+1)×(n+2p−f+1)
习惯上,一般用0去填充
Valid卷积:无填充
Same卷积:填充后输出大小和输入大小保持一致(可求解 n + 2 p − f + 1 = n n+2p-f+1=n n+2p−f+1=n得到 p p p值)
计算机视觉中, f f f通常是奇数,甚至可能都是这样,原因:
- 如果 f f f是一个偶数,那么你只能使用一些不对称填充(因为 p = f − 1 2 p = \frac{{f - 1}}{2} p=2f−1)
- 一个奇数维过滤器有一个中心点
输出的维度: ( ⌊ n H + 2 p − f s + 1 ⌋ , ⌊ n W + 2 p − f s + 1 ⌋ ) (⌊\frac{{{n_H} + 2p - f}}{s} + 1⌋,⌊\frac{{{n_W} + 2p - f}}{s} + 1⌋) (⌊snH+2p−f+1⌋,⌊snW+2p−f+1⌋)( s s s为步长)
⌊ x ⌋ ⌊x⌋ ⌊x⌋是向下取整的符号,这也叫做对 x x x进行地板除(floor),这意味着 x x x向下取整到最近的整数
互相关(cross-correlation)与卷积(convolution):
严格来说,深度学习中的”卷积运算“实质上是指互相关,真正的卷积运算需要先将过滤器上下、左右分别翻转一次,如:
[ 1 0 0 0 0 0 0 0 2 ] \begin{bmatrix}1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 2 \\\end{bmatrix} ⎣⎡100000002⎦⎤ -> [ 0 0 1 0 0 0 2 0 0 ] \begin{bmatrix}0 & 0 & 1 \\ 0 & 0 & 0 \\ 2 & 0 & 0 \\\end{bmatrix} ⎣⎡002000100⎦⎤-> [ 2 0 0 0 0 0 0 0 1 ] \begin{bmatrix}2 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 1 \\\end{bmatrix} ⎣⎡200000001⎦⎤
三维卷积后的输出是二维的
图示:
按照惯例,当输入有特定的高宽和通道数时,过滤器可以有不同的高,不同的宽,但是必须有一样的通道数。
同时用多个过滤器:分别处理,最后逐层堆叠。层数即为提取的特征数。
z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = W^{[1]}a^{[0]} + b^{[1]} z[1]=W[1]a[0]+b[1], W W W即为过滤器, a [ 0 ] a^{[0]} a[0]即为输入, a [ 1 ] a^{[1]} a[1](举例)为 Relu ( z [ 1 ] + b ) \operatorname{Relu} \left( {{z^{[1]}} + b} \right) Relu(z[1]+b)= Relu ( [ 0 10 0 0 10 0 0 10 0 ] + b ) \operatorname{Relu} \left( {\begin{bmatrix}0 & 10 & 0\\ 0 & 10 & 0\\ 0 & 10 & 0\end{bmatrix} + b} \right) Relu⎝⎛⎣⎡000101010000⎦⎤+b⎠⎞
实际情况下: a [ 1 ] a^{[1]} a[1]可能为多层
避免过拟合:图片很大,参数却很少,这是卷积神经网络的一个特征
高、宽、通道数: n H {n_H} nH、 n W {n_W} nW、 n c {n_c} nc。
构成:多层卷积层 → \to →平滑处理 → \to →logistic回归单元或softmax回归单元 → \to → y ^ \hat y y^
趋势: n H {n_H} nH、 n W {n_W} nW逐渐变小, n c {n_c} nc逐渐变大
一个典型的卷积神经网络通常有三层,一个是卷积层,我们常常用CONV来标注。还有两种常见类型的层,一个是池化层(POOL)。最后一个是全连接层,用FC表示。
意义:缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性
树池、平均池化、最大池化。同样有 f f f、 s s s参数,执行过程类似卷积,输出大小为 ( ⌊ n H + 2 p − f s + 1 ⌋ , ⌊ n W + 2 p − f s + 1 ⌋ , c ) (⌊\frac{{{n_H} + 2p - f}}{s} + 1⌋,⌊\frac{{{n_W} + 2p - f}}{s} + 1⌋,c) (⌊snH+2p−f+1⌋,⌊snW+2p−f+1⌋,c)
最大池化的直观理解:将对应区域提取到的特征保留,值大则说明提取到了相应特征
常用的参数值为 f = 2 f=2 f=2, s = 2 s=2 s=2,一般用最大池化
层的划分:一类卷积是一个卷积层和一个池化层一起作为一层(以此为准);另一类卷积是把卷积层作为一层,而池化层单独作为一层。
标记:Layer1、CONV1、POOL1、FC3等
全连接层类似单层神经网络,所有神经元与上层神经元相互连接
卷积神经网络示例:
特征:池化层和最大池化层没有参数;第二卷积层的参数相对较少,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。
和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接,从而减少参数,以便用更小的训练集来训练,从而预防过度拟合
参数共享:特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。
稀疏连接:输出中的一个值只与对应的 f × f f\times f f×f单元格相关,与其他值无关
在计算机视觉任务中表现良好的神经网络框架往往也适用于其它任务
经典网络:
作用:识别灰度图像(如手写识别)
原则简单、特征数量巨大
非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,
残差块(Residual block):将 a [ l ] a^{[l]} a[l]直接向后,拷贝到神经网络的深层,在ReLU非线性激活函数前加上 a [ l ] a^{[l]} a[l]。等式 a [ l + 2 ] = g ( z [ l + 2 ] ) a^{\left\lbrack l + 2 \right\rbrack} = g(z^{\left\lbrack l + 2 \right\rbrack}) a[l+2]=g(z[l+2])去掉了,取而代之的是另一个ReLU非线性函数,仍然对 z [ l + 2 ] z^{\left\lbrack l + 2 \right\rbrack} z[l+2]进行 g g g函数处理,但这次要加上 a [ l ] a^{[l]} a[l],即: a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) \ a^{\left\lbrack l + 2 \right\rbrack} = g\left(z^{\left\lbrack l + 2 \right\rbrack} + a^{[l]}\right) a[l+2]=g(z[l+2]+a[l])。跨越的这几层构成一个残差块。
对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。
跳跃连接:指 a [ l ] a^{[l]} a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层
残差块学习恒等函数非常容易,能确定网络性能不会受到影响,很多时候甚至可以提高效率
能实现跳跃连接的前提:same卷积保留了维度。若维度不一致,再增加一个矩阵,这里标记为 W s W_{s} Ws,其维度为跳转后维度$ \times 跳 转 前 维 度 。 这 个 新 增 项 是 256 维 度 的 向 量 。 你 不 需 要 对 跳转前维度。这个新增项是256维度的向量。你不需要对 跳转前维度。这个新增项是256维度的向量。你不需要对W_{s}$做任何操作,它是网络通过学习得到的矩阵或参数,它是一个固定矩阵,padding值为0。
对于单通道图片而言, 1 × 1 1 \times 1 1×1卷积效果不佳。
意义:压缩通道数量并减少计算
例:一个28×28×192的输入层,可以使用池化层压缩它的高度和宽度,但如果通道数量很大,可以用32个大小为1×1×192维的过滤器,输出层为28×28×32,从而压缩通道数( n c n_{c} nc)
Inception网络的作用:代替决定过滤器大小、是否需要创建卷积层或池化层等
实现:得到一些不同的输出结果,把它堆积起来
瓶颈层:通常是网络中最小的部分(如某一层的 n c {n_c} nc比其前后都更小)。只要合理构建瓶颈层,你既可以显著缩小表示层规模,又不会降低网络性能
为了能在最后将这些输出都连接起来,必要时可会使用same类型的padding来池化,使得输出的高和宽保持一致。当有过多通道时可再加上一个1×1的卷积层,将通道的数量缩小。
Inception模块、Inception网络
Inception网络的分支:确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的分类。它在Inception网络中,起到一种调整的效果,并且能防止网络发生过拟合。
“一个常见的工作流程是,先选择一个你喜欢的架构,或许是你在这门课中学习到的,或者是你从朋友那听说的,或者是从文献中看到的,接着寻找一个开源实现,从GitHub下载下来,以此基础开始构建。这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个GPU,通过庞大的数据集预先训练了这些网络,这样一来你就可以使用这些网络进行迁移学习。” ——吴恩达
迁移学习的概念见笔记3.2.7
冻结:把某些层看作是冻结的,冻结网络中这些层的参数,设置方法如trainableParameter=0
、freeze=1
等
一个技巧:将前面冻结的层视作一个函数(softmax层之前的所有层视为一个固定映射),输入图像 X X X,然后计算它的某个特征向量或激活值并保存在硬盘中,这样训练的就是一个很浅的softmax模型,这样就不需要每次遍历训练集再重新计算这个激活值了
数据集较大:取后面几层的权重,用作初始化,然后从这里开始梯度下降;或者直接去掉这几层,换成自己的隐藏单元和自己的softmax输出层
概念、基本操作见之前笔记
彩色转换:给R、G和B三个通道上加上不同的失真值
PCA(主成分分析):具体颜色改变的细节在AlexNet的论文中有时候被称作PCA颜色增强,PCA颜色增强的大概含义是,如果图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后PCA颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点,使总体的颜色保持一致。
数据集极大时:CPU线程持续加载数据,然后实现任意失真变形,从而构成批数据或者最小批数据,这些数据持续的传输给其他线程或者其他的进程,然后开始训练,可以在CPU或者GPU上实现训练一个大型网络的训练
数据不足:更优的架构、手工处理
提高Benchmark 基准测试的小技巧(对实际应用提升不大):
独立训练几个神经网络,并平均它们的输出
Multi-crop at test time:将数据扩充应用到你的测试图像中
两个任务:识别和定位
输出: y = [ p c b x b y b h b w c 1 c 2 c 3 ] y= \ \begin{bmatrix} p_{c} \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ c_{1} \\ c_{2}\\ c_{3} \\\end{bmatrix} y= ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡pcbxbybhbwc1c2c3⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
这是一个向量,第一个组件 p c p_{c} pc表示是否含有对象,有则 p c = 1 p_{c}= 1 pc=1,无则 p c = 0 {p_c}= 0 pc=0。物体位置中心为 ( b x , b y ) (b_{x},b_{y}) (bx,by),高度为 b h {b_h} bh,宽度为 b w {b_w} bw。 c 1 {c_1} c1、 c 2 {c_2} c2、 c 3 {c_3} c3…表示物体的分类, p c = 0 p_{c} =0 pc=0时, y y y的其它参数无意义,即KaTeX parse error: Unknown column alignment: * at position 29: …{\begin{array}{*̲{20}{c}} 0 \\ …
神经网络的损失函数:
L ( y ^ , y ) = ( y 1 ^ − y 1 ) 2 + ( y 2 ^ − y 2 ) 2 + … + ( y n ^ − y n ) 2 L\left(\hat{y},y \right) = \left( \hat{y_1} - y_{1} \right)^{2} + \left(\hat{y_2} - y_{2}\right)^{2} + \ldots+\left( \hat{y_{n}} - y_{n}\right)^{2} L(y^,y)=(y1^−y1)2+(y2^−y2)2+…+(yn^−yn)2
y 1 = 0 y_{1} = 0 y1=0,也就是 p c = 0 p_{c} = 0 pc=0,损失值是 ( y 1 ^ − y 1 ) 2 \left(\hat{y_1} - y_{1}\right)^{2} (y1^−y1)2
y 1 = 1 y_{1} = 1 y1=1,所以 p c = y 1 = 1 p_{c}=y_{1}=1 pc=y1=1,损失值为 0 + ( y 2 ^ − y 2 ) 2 + … + ( y n ^ − y n ) 2 0+\left(\hat{y_2} - y_{2}\right)^{2} + \ldots+\left( \hat{y_{n}} - y_{n}\right)^{2} 0+(y2^−y2)2+…+(yn^−yn)2
检测特征点:设置第一个特征点( l 1 x l_{1x} l1x, l 1 y l_{1y} l1y),第二个特征点( l 2 x l_{2x} l2x, l 2 y l_{2y} l2y)……
作用:如定义脸部轮廓、下颌轮廓、判断表情、判断情绪、判断人体动作等
输出:KaTeX parse error: Unknown column alignment: * at position 27: …{\begin{array}{*̲{20}{c}} {\b…
注:所以标签在所有图片中必须保持一致,比如特征点1始终是右眼的外眼角,特征点2是右眼的内眼角等。
基于滑动窗口的目标检测算法:首先创建一个标签训练集,其中都是裁剪好的,只包含目标物体的图片,用于训练物体识别
然后按一定大小、步长滑动窗口,不论物体在图片的什么位置,总有一个窗口可以检测到它。
缺点:计算成本高
把神经网络的全连接层转化成卷积层:(示例)
当输入测试图片 ( m × m ) (m \times m) (m×m)后,以训练集分辨率 ( n × n ) (n \times n) (n×n)为窗口,步骤中过滤器等照旧,输出结果中一个单元格即对应一个窗口的结果,相当于以大小为池化层宽度(上图为 2 2 2)的步幅在原始图片上应用神经网络
原理:重复区域可共享计算,不需要把输入图像分割成四个子集,分别执行前向传播
缺点:边界框位置可能不够准确
输出更精确边框:YOLO算法
实现:做标签时以单元格为单位,每个单元格标记 1 × 1 × 8 1 \times 1 \times 8 1×1×8(举例)大小的矩阵。实际操作时按物体中点分配单元格并输出 n × n × 8 n \times n \times 8 n×n×8大小的矩阵。
优点:
量化:一般定义一个单元格的长度、宽度为 1 1 1
Intersection_Over_Union(loU) = Square_Of_Intersection Square_Of_Union \text{Intersection\_Over\_Union(loU)}= \frac{{{\text{Square\_Of\_Intersection}}}}{{{\text{Square\_Of\_Union}}}} Intersection_Over_Union(loU)=Square_Of_UnionSquare_Of_Intersection
一般约定,在计算机检测任务中,如果 l o U ≥ 0.5 \rm{loU}≥0.5 loU≥0.5就认为检测正确,可根据实际情况调整阈值
问题:可能会对同一个对象做出多次检测
实现:对于每个输出类别,找到 p c {p_c} pc最大的边框输出成预测结果,抑制交并比高但非最大的边框,可以事先设定阈值,直接将 p c ≤ T h r e s h o l d _ V a l u e {p_c} \le {\rm{Threshold\_Value}} pc≤Threshold_Value的边框全部去掉(不抑制交并比低的边框是因为那可能是另外一个物体了)
anchor box的思路:预先定义多个不同形状的anchor box形状,把预测结果和这两个anchor box关联起来。 y = [ p c b x b y b h b w c 1 c 2 c 3 p c b x b y b h b w c 1 c 2 c 3 ] T y= \begin{bmatrix} p_{c} & b_{x} & b_{y} &b_{h} & b_{w} & c_{1} & c_{2} & c_{3} & p_{c} & b_{x} & b_{y} & b_{h} & b_{w} &c_{1} & c_{2} & c_{3} \\\end{bmatrix}^{T} y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3]T,前面的 p c , b x , b y , b h , b w , c 1 , c 2 , c 3 p_{c},b_{x},b_{y},b_{h},b_{w},c_{1},c_{2},c_{3} pc,bx,by,bh,bw,c1,c2,c3是和anchor box 1关联的8个参数,后面的8个参数(橙色方框标记的元素)和anchor box 2相关联。anchor box将按形状和边框匹配(交并比)。
y y y的深度重复次数为anchor box个数
一般手工指定anchor box形状极其个数,也可以用k-平均算法自动选出有代表性的anchor box
构造训练集:指定背景、类别,遍历添加标签,选用anchor box,
做出预测:don’t care-s一般是一些噪音
非极大值抑制
R-CNN:带区域的卷积网络,不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器
图像分割后,按色块放置边界框,但输出并非按照这个边框
优化:Fast R-CNN、Faster R-CNN
人脸验证(face verification):有一张输入图片,以及某人的ID或者是名字,这个系统要做的是,验证输入图片是否是这个人
人脸识别(face recognition):有一张输入图片,从数据库中匹配信息
Similarity函数: d ( i m g 1 , i m g 2 ) = Degree_Of_Difference_Between_Images d(\text img1,\text img2) = \text {Degree\_Of\_Difference\_Between\_Images} d(img1,img2)=Degree_Of_Difference_Between_Images,它以两张图片作为输入,然后输出这两张图片的差异值。如果你放进同一个人的两张照片,它能输出一个很小的值,如果放进两个长相差别很大的人的照片,它就输出一个很大的值。在识别过程中,如果这两张图片的差异值小于某个阈值 τ \tau τ,则预测这两张图片是同一个人。
步骤:将图片用函数 d d d与数据库中数据一一比对。
Siamese 网络架构:
输出层的向量可看作一张图片的编码
x ( 1 ) x^{(1)} x(1)和 x ( 2 ) x^{(2)} x(2)的距离为图片的编码之差的范数: d ( x ( 1 ) , x ( 2 ) ) = ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 2 d(x^{(1)},x^{(2)}) =|| f(x^{(1)}) - f(x^{(2)})||_{2}^{2} d(x(1),x(2))=∣∣f(x(1))−f(x(2))∣∣22
实现:学习参数得到编码函数 f ( x ( i ) ) f(x^{(i)}) f(x(i))若,两个图片 x ( i ) x^{( i)} x(i)和 x ( j ) x^{( j)} x(j)是同一个人,那么你得到的两个编码的距离就小。
三元组:用于比对的数据、同一个人的照片、不同人的照片,记为 A A A、 P P P、 N N N
需要的特性:
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α ≤ 0 || f(A) - f(P)||^{2} -||f(A) - f(N)||^{2} + \alpha \leq0 ∣∣f(A)−f(P)∣∣2−∣∣f(A)−f(N)∣∣2+α≤0
即:
d ( A , P ) − d ( A , N ) + α ≤ 0 d(A,P) - d(A,N) + \alpha \le 0 d(A,P)−d(A,N)+α≤0
α \alpha α为间隔(margin),避免 d ( A , P ) d(A,P) d(A,P)和 d ( A , N ) d(A,N) d(A,N)都为 0 0 0,也可使算法更严格
三元组损失函数:
L ( A , P , N ) = m a x ( ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + a , 0 ) L( A,P,N) = max(|| f( A) - f( P)||^{2} -|| f( A) - f( N)||^{2} + a,0) L(A,P,N)=max(∣∣f(A)−f(P)∣∣2−∣∣f(A)−f(N)∣∣2+a,0)
作用:只要 ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α ≤ 0 ||f(A) - f(P)||^{2} -|| f(A) - f(N)||^{2} + \alpha \leq0 ∣∣f(A)−f(P)∣∣2−∣∣f(A)−f(N)∣∣2+α≤0,那么损失函数就是 0 0 0,只要这个损失函数小于等于 0 0 0,网络不会关心它负值有多大
整个网络的代价函数是训练集中这些单个三元组损失的总和。
注意:
训练数据中应有成对的 A A A、 P P P
A A A和 N N N不要随机,要尽可能相似
选取一对Siamese网络,同时计算这些嵌入,将其输入到逻辑回归单元进行预测。
最后的逻辑单元的激活函数可以是:
y ^ = σ ( ∑ k = 1 n w k ∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ + b ) \hat y = \sigma(\sum_{k = 1}^{n}{w_{k}| f( x^{( i)})_{k} - f( x^{( j)})_{k}| + b}) y^=σ(k=1∑nwk∣f(x(i))k−f(x(j))k∣+b)
注:下标 k k k代表向量中的第 k k k个元素,n是编码的维数。
∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ |f(x^{(i)})_{k} - f(x^{(j)})_{k}| ∣f(x(i))k−f(x(j))k∣ 的其他替代方式,如 χ 2 \chi ^{2} χ2公式( χ \chi χ平方相似度):
( f ( x ( i ) ) k − f ( x ( j ) ) k ) 2 f ( x ( i ) ) k + f ( x ( j ) ) k \frac{(f( x^{(i)})_{k} - f(x^{(j)})_{k})^{2}}{f(x^{(i)})_{k} + f( x^{(j)})_{k}} f(x(i))k+f(x(j))k(f(x(i))k−f(x(j))k)2
技巧:提前用Siamaese网络计算好数据库中图片的 f ( x ( i ) ) f(x^{(i)}) f(x(i))的值,既可以节省空间,也可减少计算量。
符号: C C C来表示内容图像(content), S S S表示风格图像(Style), G G G表示生成的图像(Generated image)
实现思路:网络的深层、浅层提取的特征。
可视化方法:寻找使单元激活最大化的一些图片块
特点:
具体原理可见此论文
代价函数:
J ( G ) = α J content ( C , G ) + β J style ( S , G ) J( G) = \alpha J_{\text{content}}( C,G) + \beta J_{\text{style}}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)
步骤:
随机初始化生成图像 G G G
使用梯度下降的方法将其最小化,更新 G : = G − ∂ ∂ G J ( G ) G:= G - \frac{\partial}{\partial G}J(G) G:=G−∂G∂J(G)
用于计算内容代价函数的隐藏层不要太浅也不要太深。
J content ( C , G ) = 1 2 ∣ ∣ a [ l ] [ C ] − a [ l ] [ G ] ∣ ∣ 2 J_{\text{content}}( C,G) = \frac{1}{2}|| a^{[l][C]} - a^{[l][G]}||^{2} Jcontent(C,G)=21∣∣a[l][C]−a[l][G]∣∣2
这里用的符号都是展成向量形式的,展开后就变成了两个图片之间 l l l层激活值差值的平方和。
取出第 l l l层激活值,其大小为 n H × n W × n c n_H \times n_W \times n_c nH×nW×nc。
相关性:设 l l l层的第一个通道识别垂直线段,第二个通道识别橙色,若出现橙色的地方大概率也有垂直线段,则说明这两个通道相关性高。
设 a i , j , k [ l ] a_{i,\ j,\ k}^{[l]} ai, j, k[l]为隐藏层 l l l中 ( i , j , k ) (i,j,k) (i,j,k)位置的激活项, i i i, j j j, k k k分别代表该位置的高度、宽度以及对应的通道数。接下来计算一个关于 l l l层和风格图像的矩阵,即 G [ l ] ( S ) G^{[l](S)} G[l](S)( l l l表示层数, S S S表示风格图像),( G [ l ] ( S ) G^{[l]( S)} G[l](S))是一个 n c × n c n_{c} \times n_{c} nc×nc的矩阵,公式为:
G k k ′ [ l ] ( S ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( S ) a i , j , k ′ [ l ] ( S ) G_{kk^{'}}^{[l]( S)} = \sum_{i = 1}^{n_{H}^{[l]}}{\sum_{j = 1}^{n_{W}^{[l]}}{a_{i,\ j,\ k}^{[l](S)}a_{i,\ j,\ k^{'}}^{[l](S)}}} Gkk′[l](S)=i=1∑nH[l]j=1∑nW[l]ai, j, k[l](S)ai, j, k′[l](S)
注意:如果两个通道中的激活项数值都很大,那么 G k k ′ [ l ] G_{{kk}^{'}}^{[l]} Gkk′[l]也会变得很大,对应地,如果他们不相关那么 G k k ′ [ l ] G_{{kk}^{'}}^{[l]} Gkk′[l]就会很小。严格来讲,它其实是一种非标准的互协方差,因为我们并没有减去均值而只是把这些元素直接相乘
然后,我们再对生成图像做同样的操作。
G k k ′ [ l ] ( G ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( G ) a i , j , k ′ [ l ] ( G ) G_{kk^{'}}^{[l]( G)} = \sum_{i = 1}^{n_{H}^{[l]}}{\sum_{j = 1}^{n_{W}^{[l]}}{a_{i,\ j,\ k}^{[l](G)}a_{i,\ j,\ k^{'}}^{[l](G)}}} Gkk′[l](G)=i=1∑nH[l]j=1∑nW[l]ai, j, k[l](G)ai, j, k′[l](G)
得到这两个矩阵后,可计算风格代价函数:
J s t y l e [ l ] ( S , G ) = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∑ k ∑ k ′ ( G k k ′ [ l ] [ s ] − G k k ′ [ l ] [ G ] ) 2 J_{{\rm{style}}}^{[l]}(S,G) = \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}}{\sum\limits_k {\sum\limits_{k'} {(G_{kk'}^{[l][s]} - G_{kk'}^{[l][G]})} } ^2} Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21k∑k′∑(Gkk′[l][s]−Gkk′[l][G])2
即:
J s t y l e [ l ] ( S , G ) = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∥ G [ l ] ( G ) − G [ l ] ( G ) ∥ F 2 J_{{\rm{style}}}^{[l]}(S,G) = \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}}\left\| {{G^{[l](G)}} - {G^{[l](G)}}} \right\|_F^2 Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21∥∥∥G[l](G)−G[l](G)∥∥∥F2
实际应用时,归一化常数 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}} (2nH[l]nW[l]nC[l])21可用 β \beta β代替
∥ A ∥ F {\left\| A \right\|_F} ∥A∥F为Frobenius范数
最后将各层的风格函数加起来形成整体:
J style ( S , G ) = ∑ l λ [ l ] J style [ l ] ( S , G ) {J_{\text{style}}}(S,G) = \sum\limits_l {{\lambda ^{[l]}}J_{\text{style}}^{[l]}(S,G)} Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)
其中, λ [ l ] \lambda ^{[l]} λ[l]为不同层数的权重
全体代价函数:
J ( G ) = α J content ( C , G ) + β J style ( S , G ) J(G) = \alpha J_{\text{content}}{(C,G)} + \beta J_{{\text{style}}}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)
原理基本一致,主要是过滤器大小适当调整
对于许多1维数据应用,实际更多上会使用递归神经网络进行处理
三维的应用:
CT扫描结果等立体对象
将视频的时间轴看作第三维