小浣熊百米八秒五

  • Archives

  • Categories

  • Tags

Python命令行参数

Posted on 2019-06-04 | In Python | Comments: | Views:

前言

如何让自己的代码在修改最少的情况下跑更多实验,这对于一个码农来说至关重要,尤其是需要多组实验对比的情况。一个很简单的办法是把参数独立出来在命令行输入,唯一的缺点是每次都要输入长达好几行的命令,尤其是牵扯到绝对路径的时候,这种情况下有更简单的解决方法,就是用配置文件。

Python命令行参数简单用法

python内置了比较方便的命令行处理方法:argparse类

贴一个简单的snnipet,一看就会

1
2
3
4
5
6
7
8
9
10
11
import argparse

# 读取
parser = argparse.ArgumentParser(description='What R U doing')
parser.add_argument('--ainterger', default=0, type=int)
parser.add_argument('--astring', default='23456', type=str)
parser.add_argument('--config', default='', type=str)
args = parser.parse_args()

# 调用
print(args.ainterger) #输出0或你给的参数

配合yaml文件

进阶一点的做法是在使用argparse的时候配合yaml文件进行配置,yaml文件是一种通用的配置描述文件,使用缩进表示层级,在 python中读入形式为字典形式,操作方便且被广泛支持。

给一个简单的yaml文件示例

1
2
3
4
5
6
7
config1:
attribute1: 1
attribute2: '/path/to/some/dir'
config2:
attribute1: 3
attribute2:
attribute1: 'aha!'

读取使用流程就是这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import argparse
import yaml

# 读取
parser = argparse.ArgumentParser(description='What R U doing')
parser.add_argument('--paraint', default=0, type=int)
parser.add_argument('--parastr', default='23456', type=str)
parser.add_argument('--config', default='', type=str)
args = parser.parse_args()

with open(args.config) as f:
config = yaml.load(f)
for k,v in config.items():
setattr(args, k, v)

# 使用
print(args.paraint) # 0
print(args.config1['attribute1']) # 1
print(args.config2['attribute2']['attribute1']) # aha!

Adversarial Examples are not bugs, They are features 笔记

Posted on 2019-05-28 | Edited on 2019-05-29 | In 调研笔记 | Comments: | Views:

Motivation

  • 对抗样本的本质是什么

Contrubution

  • 解耦鲁棒特征和非鲁棒特征,以构建构建鲁棒数据集和非鲁棒数据集

    • 鲁棒特征:模型从数据集中学到的人眼能理解的特征
    • 非鲁棒特征:模型从数据集中学到的人眼不能理解的特征
    • 鲁棒数据集:对人眼而言与传统数据集无异,训练出的模型免疫对抗攻击
    • 非鲁棒数据集:人眼无法理解,训练出的模型能正常分类,无法免疫对抗攻击
  • 在非解耦的状态下仅使用非鲁棒特征label数据,仍能得到在标准测试集上表现不错的模型

  • 以上Contribution能得到的结论:
    • 数据集中存在鲁棒特征和非鲁棒特征
    • 常规训练得到的模型使用非鲁棒特征做预测

方法

数据特征解耦方法

简单概括,就是mimic adversarial training得到的模型。

作者说了,无法直接从数据集完成解耦,只能利用一个鲁棒模型去得到数据集中只与该模型相关的部分。

使用鲁棒特征训练流程:

  1. 通过对抗训练得到一个鲁棒模型
  2. 给定优化起始位置(噪声或任意一张同类的图),L2约束该输入对于鲁棒模型的输出和原始数据集输入对于鲁棒模型的输出,反向传播优化该输入
  3. 由2得到的数据集被作者称为鲁棒数据集

使用非鲁棒特征训练流程:

  1. 直接构建对于某target的对抗样本
  2. 将(对抗样本, target)作为新的数据组以训练新模型

一些看法

流程我应该没有写错,毕竟文章附录里有psedo-code,但是不得不说这篇paper写的很不清晰,关于robust feature这里也很模糊,最大的贡献是提出了新概念:robust feature,useful feature,希望作者后续的工作能够更有力地佐证他们的观点,祝深度学习越走越强。

另

今天是5月29号,风传IEEE要停用华为的编辑。

我觉得吧,这是一个帝国在展现他们的力量,寰宇之内无人争锋。但这也是没落的前兆吧,我们曾经热爱Google、Github、Linux,是因为他们开放、强大、充满着智慧的光芒和信仰的力量。但是我这几年的见闻是,Google 的Tensorflow让人难受的不行,应用商店强制更新且禁不掉,mac、ios和ubuntu一样到处都能找到让人浑身不舒服的小bug,尽管前者少很多。没有什么能一直呆在神坛上,靠近了总是满满的瑕疵。

计算机科学技术经历了野蛮生长的三十年,这三十年群雄并起,无数人带着梦想或是带着欲望进入了这个行当。随着我们接触到的接口越来越高层,使用的系统越拉越庞大繁杂,总有学科要介入实现管理控制,5年之内,必定是天翻地覆。起码在计算机科学技术上,我们有劣根性,是死是活,一半看政策,一半看运气。若是能拉欧洲一起下水,那将来必将是三足鼎立,欧洲一扫如今的疲软,能够与美国分庭抗礼,美国失去吸纳天下精英的优势,中国继续发展。若是欧洲中立或是站在美国阵营,那就勒紧裤腰带准备过苦日子吧。

几十年的黄金时代过去了,冷战回来了。

Adversarial Image Translation Unrestricted Adversarial Examples in Face Recognition Systems 笔记

Posted on 2019-05-22 | Edited on 2019-06-04 | In 调研笔记 | Comments: | Views:

Motivation

  • 现有的具有理论保障的防御思路均针对有限制的扰动,而人脸识别可以在扰动很大的情况下保持ID不变,在上述setting下构造对抗样本将给人脸识别领域的防御带来新的挑战

Method

  • 利用starGAN保证ID不变

  • 1个Generator对应1个target

虽然属性变了,但攻击成功依靠的可能还是如上的对抗纹理。

GAN 里面的奇怪东西

Posted on 2019-05-14 | Edited on 2019-06-04 | In 调研笔记 | Comments: | Views:

缘起

我本以为像我这样自命清高的人,大概这辈子都不会亲手去碰GAN这种骚东西,没想到天命难测,终究需要徒手复现别人GAN的代码,

GAN的loss

从最古老的GAN的loss说起,$Loss = \log{D_1(x)} + \log{(1-D_1(G_1(x,z)))}$,对D的要求一般是对正常样本输出1,对生成样本输出0。

随后是WGAN的提出。他相对于普通的GAN只做了以下调整:

  • D最后一层不要sigmoid
  • loss不取log
  • 更新Discriminator的参数后将参数clip
  • 优化算法不使用带动量的??

pix2pix

大名鼎鼎的pixel2pixel,很有特色的是他的Discriminator。正常的D输出都是一个标量,而他的D输出是一个向量,向量中的每一维都是生成图片每个窗口部分是否为真的判定。

这么做直接导致的一个技术问题就是,怎么定义loss来进行后续的bp和训练。毕竟GAN的Discriminator输出都是标量{0, 1}。在一个GitHub项目中我发现,只用把这个D输出定义成全0或者全1的向量输出就ok。

Efficient Decision-based Black-box Adversarial Attacks on Face Recognition笔记

Posted on 2019-05-09 | Edited on 2019-05-14 | In 调研笔记 | Comments: | Views:

Motivation

  • 目前大多数人脸攻击方法不够符合现实使用的场景:黑盒、模型只返回label且没有概率。

论文方法优点

  • query次数比起NES之类的黑盒攻击方法少很多

论文方法

网络中的Attention Block

Posted on 2019-05-07 | In 调研笔记 | Comments: | Views:

调研目的

神经网络的卷积+激活+池化经典3连现在已经进化成BN+卷积+激活+池化4连了,再多多数情况比如分类分割前期处理中,这样的操作已经足够。但如果我们希望提取一张图像的全局特征而不愿意使用全连接,那么有种新的网络结构可以考虑,这种结构叫self-attention block。

对我来说,我的目的是提取两张图片的特征然后做处理,我需要保持图1结构基本不变,在其中嵌入图2的整体语义,那么在这种情况下,我可以用经典4连来做图1的特征提取,而对于图2,self-attention将是不错的选择。

Geometric Attentional Block

来自Attacks on State-of-the-Art Face Recognition using Attentional Adversarial Attack Generative Network,做的是生成对抗样本的网络。在提取目标的特征过程中考虑到了要提取全局特征,所以有了下面的设计:

这个图已经相当清晰了,唯一的问题在于NxCxHxW是如何到NxCxH/2xW/2的,在下认为这就是个简单的降采样。

Denoise Block

这是谢慈航在FAIR的一篇paper,用滤波的方式消除对抗样本的影响。滤波block中需要attention block,结构如下:

可以看到这个没有上面的复杂,但本质上差的不多,在论文里仔细看了下,所有这些想法的出处其实是17年一篇引用比较多的文章Non-Local Neural Networks。

Non-local Neural Networks

先上图:

目的一样是为了让每个像素点都能够影响到特征空间中的所有点,而且有short-cut保证很深的网络也可以训练。目前我的个人理解是,self-attention其实就是non-local映射出来的特征层上每个值的大小作为attention的程度。

NATTACK Learning the Distributions of Adversarial Examples for an Improved Black-Box Attack on Deep Neural Networks 笔记

Posted on 2019-05-06 | In 调研笔记 | Comments: | Views:

NATTACK 笔记

论文Motivation

  • 最根本的motivation:研究对抗样本是为了更好的理解DNN
  • 区别于传统黑盒攻击利用白盒攻击所得对抗样本的迁移性,该方法试图揭示对抗样本的空间分布,并利用该分布直接得到对抗样本
  • 使用一种攻击方法破解多种防御手段

论文方法优点

  • 生成对抗样本的攻击成功率高
  • 生成速度快,可以使adv training受益
  • 针对一个样本,可以生成无限多个对抗样本,过去方法普遍只能生成一个最优的

方法

定义总优化目标

总优化目标:$\min\limits_{\theta} J(\theta) := \int {f(x^\prime)\pi_S(x^\prime|\theta)}\, {\rm d}x^\prime$

这里$\pi()$是一个概率分布函数,上式本质上就是$f(x)$在$\pi()$分布下的期望值。

生成模型

为了能够在$\theta$已知的情况下得到$x^\prime$的分布$\pi$,我们需要能够通过$\theta$生成大量$x^\prime$。

操作方法为,将$\theta$定义为正态分布的均值和方差参数,从而通过$\theta$可以从正态分布中采样得到大量的值,将这些值称为种子(seed),然后通过映射函数将种子映射为与图片尺寸相同的向量即可。注意这里的映射函数不应该有任何可训练的参数,否则$\pi(x^\prime|\theta)$就不只有$\theta$这一个参数。

作者实际使用的$\theta$是CIFAR10图像大小的向量分布参数,对于CIFAR10级别图像的攻击,映射函数就是全等映射,对于更大尺寸的图像攻击,映射函数用了双线性插值。如果需要缩小图像尺寸,映射函数也很容易找到合适的。采用常见的resize手法就可以。

训练生成模型

有了优化的总目标,有了生成模型,我们需要做的只剩下优化模型的参数$\theta$。

问题在于,优化总目标对于参数$\theta$的导数很难求,从$\theta$到$J(\theta)$的运算过程并非神经网络中常见的一些函数。

所以我们要换个思路去优化$\theta$。作者给出的方法是不直接去求$J(\theta)$关于$\theta$的导数,想办法求近似值来代替,然后利用梯度下降法优化$\theta$。求近似值的方法来源于NES(Natural Evolution Strategies,2008)。

首先认为$\nabla_xf(x)\approx\nabla_xE_{N(z|x,\sigma^2)}f(z)$,即对某输入$x$的导数等于在$x$周围随机取样得到输出的平均值对$x$的导数。

那么对于$J(\theta)$,我们有$\nabla_\theta J(\theta)\approx\nabla_\theta E_{N(z|\theta,\sigma^2)}J(z)=\nabla_\theta\int J(z)\pi(z|\theta) dz$。

随后采用一个很邪乎技的技巧,江湖人称log-likelihood trick,之前看强化学习也见过它,很好用:

$$\nabla_\theta\int J(z)\pi(z|\theta) dz=\int J(z)\nabla_\theta\pi(z|\theta) dz=\int J(z)\nabla_\theta\pi(z|\theta) \frac{\pi(z|\theta)}{\pi(z|\theta)}dz=\int J(z)\nabla_\theta\log\pi(z|\theta) \pi(z|\theta)dz= E_{N(z|\theta,\sigma^2)}[J(z)\nabla_\theta\log\pi(z|\theta)]$$

上式中$J(z)$在给定z的情况下可以直接计算出来,$\log\pi(z|\theta)$对于$\theta$的导数也可以通过求导公式直接得到值(这里$\pi$是正态分布概率密度函数),我们要做的只是多次采样$z$后区平均来逼近期望值。这个期望值就是梯度的近似值。然后利用梯度下降,就可以优化目标函数了。

实验设置

  • 攻击防御过或未防御过的网络均采用攻击成功率来衡量,对于每种防御方法均采用了该方法原paper中的setting。
  • 同时由于该攻击方法为迭代式,所以还加入了迭代轮数对攻击效果的影响分析
  • 随后测试了对不同模型攻击所得结果的泛化性(列表百分比)

  • 与其他几种攻击做了比较:

    • 先与几个SOTA黑盒攻击比成功率。

    • Query Limited也是黑盒情况下利用演化算法进行攻击,将本方法中的一些tirck放到Query Limited中时,该攻击算法成功率会上升到接近本方法的地步。

    • BPDA方法也可以很好的攻破各种防御算法,但是对于每种算法都要采用不同的处理手段,而本方法对于各类防御采取的操作是一致的。

图片相似度评价指标

Posted on 2019-05-05 | In 数学 | Comments: | Views:

图片相似度评价指标

调研缘由

也就是这个东西有什么用。调研这个评价指标的原因是我想从两张图片生成一张,这一张要长得和其中一张很像,但会被神经网络误认为是另一张。长得像这里就需要一个合理的图片相似度评价指标来做loss函数。

范数指标

n阶范数定义

n阶范数可简写为$L_n$,是常用的评价指标,其定义式为:$L_n(x,y)=(\sum (x_i-y_i)^n)^\frac{1}{n}$。

$L_\infty$范数

简单来讲就是两张图片所有像素点中差别最大的值,由定义式极限易推出 $$\lim_{n\rightarrow +\infty} L_n(x,y)=max(x_i-y_i)$$

$L_2$范数

最常用的相似度评价指标,直观理解就是两张图片的欧几里得距离。相对于一阶和无穷阶范数而言值比较大。

其他

曾有paper提到使用$L_2$范数的不合理之处,认为对于人眼而言,对比度较强的地方像素点差别会更明显,因此在$L_2$范数基础上使用协方差值作为权重得到了新的图片相似度评价指标。

SSIM(Structural Similarity Index)

效果

先上两张图说明一下这个算法有多牛逼:

这里的MSE就是$L_2$范数

这里可以明显看出同样的范数约束条件,不同的SSIM值能给人天差地别的感受。我正在搞的方向对于两张图片的不可区分是对于人眼而言的,所以这个算法对我很有价值。

计算公式

吹完了牛逼,就来到了最痛苦的环节:看公式,推导,理解。

整体公式:$$SSIM(x,y)=l(x,y)^\alpha c(x,y)^\beta s(x,y)^\gamma$$

  • 其中:$l(x,y)=\frac{2\mu_x\mu_y+C_1}{\mu_x^2+\mu_y^2+C_1}$,$c(x,y)=\frac{2\sigma_x\sigma_y+C_2}{\sigma_x^2+\sigma_y^2+C_2}$,$s(x,y)=\frac{2\sigma_{xy}+C_3}{2\sigma_x\sigma_y+C_3}$

  • 其中的其中:$\mu$为均值,$\sigma$为标准差,$\sigma_{xy}$为协方差,$C$均为常数

    • $l(x,y)$:luminance,亮度,主要依靠算术平均值的差别计算;

    • $c(x,y)$:contrast,对比度,主要依靠标准差的差别计算;

    • $s(x,y)$:structure,结构,这个最神奇,就是上下加了常数的相关系数;

    • $l$和$c$的由来是基本不等式:$2ab\leq a^2+b^2$

综上我们有SSIM值小于等于1。

顺便一提的是SSIM整体的计算是有滑动窗口的,具体是两张图同时滑还是在固定一个的时候滑遍另一个,我没仔细找,写代码的时候再说。同时滑的可能性大一些。

更新一下,准备写的时候发现有人实现过了,戳这里,按这个人写的来看,两张图上的窗口是同时滑的。

PSNR 峰值信噪比

很古老的算法了,跟人眼所见是有一定出入的。本质就是$L_2$范数的对数形式,式子见下:

$$PSNR=10\log_{10}{\frac{(2^{bits}-1)^2}{MSE}}$$

其中$MSE$就是$L_2$范数。

这个博客是怎么搭起来的

Posted on 2019-04-25 | In 奇技淫巧 | Comments: | Views:

这个博客是怎么搭起来的

简介

说起来不是很麻烦,大概是这么几个部分:GItHub个人页面, Hexo博客系统, Next主题,以及Valine评论系统。

GitHub的页面相当于给了你服务器,免费、跟GitHub项目一个管理流程还不被墙,美滋滋

hexo博客系统是台湾一小哥嫌弃GitHub推荐的Jelly博客系统,于是乎自己徒手撸了一个来造福万千码农。这个系统的作用就是把一些写好了的配置文件编译成静态网页文件,然后你就能把静态网页文件传到GitHub上装逼啦~

再然后,Next主题,就是hexo系统里一个用的人很多很多的主题,很好看(看看我的就知道有多好看了)。

最后,Valine评论系统,采用这个是有原因的,说说都试过哪些省的你们再试了:

  • disqus,注册不了
  • 多说,自己服务器停运
  • 畅言,要网站备案什么什么号
  • Gitment、作者自己证书过期还一堆bug。。。

最后找到的Valine,唯一一个评论者(不是作者)不需要注册任何东西就能评论的系统,可能就是因为什么都不用注册,这个才这么好装233333

GitHub Pages

GitHub个人页面配置,分这么几步:

  1. 搞个GitHub的号
  2. 在你的号上新建一个reporsitory,起名为你的username.github.io,这样GitHub就知道你这个项目是个人博客项目,然后就会用项目内容建一个跟项目名一样的网站
  3. 把这个项目clone到本地,平时在本地改改,改完git add commit push三连完事(hexo也有自带的部署功能,不会这三连也没事),(还有就是clone的时候记得clone ssh的链接,这样本地如果配过ssh公私钥对的话以后就很方便。我玩的时候https的链接clone下来每次更新都要输用户名密码很烦),(至于怎么配公私钥,移步git ssh 密钥配置)

HEXO 博客系统

再次感谢台湾小哥的贡献。。

想装这个系统,你得先有node.js。你问我什么是node.js?移步知乎 啥是node.js。我个人的一点理解是,一个javascript的运行和管理系统,优化服务器端的访问响应。。。很底层的一个东西,有点平台的感觉。

安装node.js:

mac/win: 去nodejs.org,有长期支持的安装包,打包好的,一路next下去就完事。

linux: 一样去nodejs.org,只不过下好的是个压缩包,里面是编译好的二进制文件,把这些文件该拷哪拷哪去。喜欢折腾的,可以下源码自己编译,教程一大堆。

Node.js 搞定了,接下来就是hexo安装配置了。hexo是基于node.js的系统,node.js安装好之后会有叫npm的包管理器,跟apt、brew之类给人的感觉很像。

安装的时候不要给npm sudo权限,毕竟不知道他会搞什么幺蛾子,改个共享lib的权限给当前用户就够了:sudo chown -R `whoami` /usr/local/lib/node_modules。然后 npm install hexo-cli -g,完事。

装好之后,cd到你clone到本地的博客文件夹,hexo init 初始化就完成啦。

Next主题

这个主题科技感还是很浓的,安装很容易,直接找它的GitHub源码下载解压到该解压的地方就完事。唯一一个坑就是,作者旧版本和新版本开了两个repo去存,不知情的一不小心就下了旧版回来折腾出一堆幺蛾子(没错就是在下),在这指明:

新版: https://github.com/theme-next/hexo-theme-next

旧版: https://github.com/iissnan/hexo-theme-next

进去之后至于clone最新的还是在release里找稳定的就看个人喜好了。。。我搞的最新的

解压路径应该是 博客路径/themes/next

没有博客路径/themes的折回上一步,应该是hexo没有在这个文件夹里init。

搞好之后,hexo生成静态网页hexo g,然后再hexo s就能在本地跑server看效果了,在浏览器输localhost:4000就能看。

传到服务器之前配下博客目录下_config.yml(不是next主题下的 _config.yml)

然后hexo d,你的博客就上到GitHub的服务器啦。

Valine 评论系统

装这个讲真不麻烦,麻烦的是找到这个系统,底下评论区玩玩就知道多好用了。

过程:

  1. 搞定Valine背后的LeanCloud,LeanCloud官网上注册个用户,新建个应用,名字随便填,建好之后在这里找需要的id和key:

  2. 把app ID,app key之类的填到next主题目录下的_config.yml文件

    主要就是改这两个,当然还有其他的小设置,比如回复之前看到回复框里的文字,就可以像我一样小皮一下。。。

  3. 修改完保存之后,老一套先hexo g,想本地看效果就hexo s看看,没啥毛病hexo d上传服务器,不想本地看直接上传也没毛病。

再扯两句

搞这个纯粹是心血来潮,挺好玩的,建议用linux或者mac搞吧,windows我好久没摸了,不知道搞这个麻烦不。。。

不说了看看服务器上的程序跑的咋样了

Hello World

Posted on 2019-04-25 | In 奇技淫巧 | Comments: | Views:

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

12

HaojieYuan

也就随便写写别当真
14 posts
4 categories
17 tags
GitHub E-Mail
© 2019 HaojieYuan
Powered by Hexo v3.8.0
|
Theme – NexT.Mist v7.1.0