Tue 27 Dec 12:36
[tf.app.flags]what does tf.app.flags do? why we need that?
This is google's way for parsing argument from the commandline. It's not implemented with python-gflags, but with a similar API. The most common way is to use argparse.(Which I used in the kaggle project). And arguments defined with it are global arguments.
Note that this module is currently packaged as a convenience for writing demo apps, and is not technically part of the public API, so it may change in future. So I'm gonna use argparse.
Tue 27 Dec 14:44
[python module: os&sys]python常见模块命令(os/sys/platform)
Python的标准库中的os模块主要涉及普遍的操作系统功能。可以在Linux和Windows下运行,与平台无关。
os.sep 可以取代操作系统特定的路径分割符。
os.name字符串指示你正在使用的平台。比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix'。
os.getcwd()函数得到当前工作目录,即当前Python脚本工作的目录路径。
os.getenv()和os.putenv()函数分别用来读取和设置环境变量。
os.listdir()返回指定目录下的所有文件和目录名。
os.remove()函数用来删除一个文件。
os.system()函数用来运行shell命令。
os.linesep字符串给出当前平台使用的行终止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
os.path.split()函数返回一个路径的目录名和文件名。
os.path.isfile()和os.path.isdir()函数分别检验给出的路径是一个文件还是目录。
os.path.existe()函数用来检验给出的路径是否真地存在
os和os.path模块
os.listdir(dirname):列出dirname下的目录和文件
os.getcwd():获得当前工作目录
os.curdir:返回但前目录('.')
os.chdir(dirname):改变工作目录到dirname
os.path.isdir(name):判断name是不是一个目录,name不是目录就返回false
os.path.isfile(name):判断name是不是一个文件,不存在name也返回false
os.path.exists(name):判断是否存在文件或目录name
os.path.getsize(name):获得文件大小,如果name是目录返回0L
os.path.abspath(name):获得绝对路径
os.path.normpath(path):规范path字符串形式
os.path.split(name):分割文件名与目录(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
os.path.splitext():分离文件名与扩展名
os.path.join(path,name):连接目录与文件名或目录
os.path.basename(path):返回文件名
os.path.dirname(path):返回文件路径
Tue 27 Dec 15:01
[epoch & iteration & batchsize] batchsize & iteration & epoch
batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
iteration:1个iteration等于使用batchsize个样本训练一次;
epoch:1个epoch等于使用训练集中的全部样本训练一次;
Tue 27 Dec 15:24
[Adam Optimizer & GradientDescentOptimizer] choose between Adam & Gradient
(AdamOptimizer ->AO, GradientDescentOptimizer -> GDO)
AO uses Kingma and Ba's Adam algorithm to control the learning rate. AO offers several advantages over GDO. Foremost is that AO uses moving average of the parameter (momentum); Bengio discusses the reasons for why this is beneficial in Section 3.1.1. of this paper(Practical Recommendations for Gradient-Based Training of Deep Architecture). Simply put, this enables Adam to use a larger effective step sizem and the algorithm will converge to this step size without fine tuning. Also refer to this paper(ADAM: A METHOD FOR STOCHASTIC OPTIMIZATION) to see that AO is more sophisticated model than GDO.
The main downside of this algorithm is that AO requires more computation to be performed for each parameter in each training step (to maintain the moving averages and variances, and calculate the scaled gradient); and more state to be retained for each parameter (approximately tripling the size of the model to store the average and variance for each parameter). A simple GDO could equally be used, but would require more learning_rate argument adjustment to the GDO until it converges faster.
to be retained for each parameter (approximately tripling the size of the model to store the average and variance for each parameter). A simpletf.train.GradientDescentOptimizercould equally be used in your MLP, but would require more hyperparameter tuning before it would converge as quickly.
In short, the AO can adjust learning-rate automatically during the training process while GDO needs more tuning on learning-rate by hand. But to reach that, AO needs more computation and more space to store the averages and variances.
I'm gonna choose AdamOptimizer over GradientDescentOptimizer.
Tue 27 Dec 16:57
[python module: glob] glob
glob是python自己带的一个文件操作相关模块,内容也不多,用它可以查找符合自己目的的文件,就类似于Windows下的文件搜索,而且也支持通配符,*,?,[]这三个通配符,*代表0个或多个字符,?代表一个字符,[]匹配指定范围内的字符,如[0-9]匹配数字。它的主要方法就是glob,该方法返回所有匹配的文件路径列表,该方法需要一个参数用来指定匹配的路径字符串(本字符串可以为绝对路径也可以为相对路径)。
[dcgan + sub-pixel]
1. Deconvolution and Checkerboard Artifacts
2. dcgan-git
3. subpixel-git
4. GAN history
图像生成GAN模型变迁:GAN->CGAN->LAPGAN->DCGAN->GRAN->VAEGAN
1.《Generative Adversarial Nets》
2.《Conditional Generative Adversarial Nets》
3.《Deep Generative Image Models using a Laplacian Pyramid of Adversarial Networks》
4.《Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks》
5.《Autoencoding beyond pixels using a learned similarity metric》
6.《Generating Images with Recurrent Adversarial Networks》
GAN【1】启发自博弈论中的纳什均衡,其包含一对模型——一个生成模型(G)和一个判别模型(D)。用一个很经典的比喻就是,生成模型(G)就像小偷,要尽可能地提高自己的偷窃手段去欺骗身为警察的判别模型(D),而D也要尽可能地训练自己的火眼金睛去防止被欺骗。所以,真正的学习过程就变成了一种生成模型(G)和判别模型(D)之间的竞争过程——随机从真实样本和由生成模型(G)生成出的“假样本”中取一个,让判别模型(D)去判断是否为真。
GAN 这种竞争的方式不再要求一个假设的数据分布,也就是说我们不用 formulate p(x),而是直接进行 sampling,从而真正达到了理论上可以完全逼近真实数据。这也是 GAN 最大的优势。然而,everything has a price. 这种不需要预先建模的方式的缺点就是在于它太过自由了,对于较大的图片,较多的 pixel 的情形,基于简单 GAN 的方式就不太可控了。在 GAN中,每次学习参数的更新过程,被设为 D 更新 k 回,G 才更新 1 回,也是出于类似的考虑。
为了解决 GAN 太过自由的这个问题,一个很自然的思想便是给 GAN 加上一点点束缚,于是便有了 Conditional Generative Adversarial Nets(CGAN)【2】。这篇工作的改进非常 straightforward,就是在 D 和 G 的建模中分别加入 conditional 变量 y。后来这一方式也被证明非常有效。
另一方面,为了改进 GAN 太自由的问题,还有一个想法就是不要让 GAN 一次完成全部任务,而是一次生成一部分,分多次生成一张完整的图片。Sounds familiar?对啊,就是去年 DeepMind 大火的一个工作 DRAW 的思想咯。DRAW 中指出,我们人类在完成一幅图画时,都不一定是一笔完成的,我们又为何要求机器能做到呢?所以 DRAW 用了一种 sequential VAE 的模型,让机器一点点“写”出了一个个数字。于是 Facebook 等人提出的LAPGAN[3] 则是采用了这样的思想,在 GAN 基础上做出了改进。LAPGAN[3] 这个工作既有 project page,也有开源代码,是非常值得重视的工作。在实现 sequential version 的方式上,LAPGAN[3] 这个工作采用的是一种几十年前的Laplacian Pyramid的方式,也因此起名做 LAPGAN。
这个方式主要的操作便是 downsample 和 upsample,而优势是每次只考虑样本和生成图像之间的残差的学习效果,某种程度上和 Residual Network 的思想是一样的。针对残差的逼近和学习,相对更加容易。
DCGAN[4] 这篇论文的提出看似并没有很大创新,但其实它的开源代码现在被使用和借鉴的频率最高。这一切必须归功于这篇工作中比 LAPGAN 更 robust 的工程经验分享。也就是说,DCGAN,Deep Convolutional Generative Adversarial Networks,这个工作[4],指出了许多对于 GAN 这种不稳定学习方式重要的架构设计和针对 CNN 这种网络的特定经验。重点来看:
比如他们提出既然之前已经被提出的 strided convolutional networks 可以从理论上实现和有 pooling 的 CNN 一样的功能和效果,那么 strided convolutional networks 作为一个可以 fully differentiable 的 generator G,在 GAN 中会表现得更加可控和稳定。又比如,本来 Facebook 的 LAPGAN 中指出 Batch Normalization(BN) 被用在 GAN 中的 D 上会导致整个学习的 collapse,但是 DCGAN 中则成功将 BN 用在了 G 和 D 上。这些工程性的突破无疑是更多人选择 DCGAN 这一工作作为 base 的重要原因。
另一方面,他们在 visualize generative models 也有许多贡献。比如他们学习了 ICLR 2016 论文《Generating Sentences From a Continuous Space》中的 interpolate space 的方式,将生成图片中的 hidden states 都 show 了出来,可以看出图像逐渐演变的过程。
今天要推荐的倒数第二篇论文[5] 也和 DRAW 有着非常多的相似点。之前已经说了,在改进 GAN 时,可以考虑 sequential version。Sequential models 的好处便是可以让下一步的 model 利用上一步得到的结果,在之前的结果上做出修改,类似于一种 conditional 的方式。为了让 GAN 也拥有这种 sequential 的能力,这篇论文[5] 将把 GAN 和 LSTM 结合,称为GRAN,使其分割成了 step by step 的过程。每一个 step 中,就像 LSTM 的 cell 一样,都有一个 C_t,这个决定的是 what to draw,也就是画的 content,也是每一个 step 的 output;同时,就像 LSTM 中的 hidden states 一样,这里也有 h_{c,t}。与简单的 LSTM 不同的是,这里决定每个 cell 内容,也就是 的不仅仅是 hidden states,还有一个 “hidden of prior”,是专属于 GAN 中的生成模型 G 的一个先验 ,h_z。 h_z 和 h_{c,t} 拼接(concatenate)之后共同决定当前 step 的 update——what to draw。
并且,因为完美利用了 gradient of convolution 还是 convolution 的性质,这个改造后的 GRAN 可以将每次的求导看做一次 decoding 过程,而每次的 convolution 等操作变成 encoding 过程,也就可以因此对应到 DRAW 中的 decoder 和 encoder 部分。而 GAN 和 DRAW 最大的不同之处便在于,GAN 中在计算 loss 时是在 hidden space 中,而 DRAW 是在原始 input space 中。
那么在实验中,这篇论文也确实证明了 sequential models(multi-step)生成的图像比 single step 的要好。只不过,generative models 的 evaluation 还比较模糊,所以实验结果上并不能很好地和以前的 GAN 或者相关方法做比较。接下来另一个重点来了,这篇论文的一个创新便是提出了一种 GAN 这种特殊 generative models 的评价方法。过去用于评价 generated image 的 Parzen Windows 或者 manual evaluation 等方法都各有各的缺点。这篇论文提出,既然本来就是竞争模型,可以让两组 GAN 互相“竞争”评价。互为评委,互为选手。下面这个配图也是挺萌的……
最后说说缺点吧,现阶段来看这个模型的可扩展性还不是那么好,尽管说是 step by step 的,在最后的实验中也只用了几个 discrete step 做实验,[1,3,5] 这样。
上面说的都是通过变成 sequential versions 来减弱 GAN 的自由性。但是还有一篇工作[6],是“反其道而行之”,将 GAN 中学出来的 feature 重新运用在 VAE 的 reconstruction objective 中,从而结合了 GAN 和 VAE 的优点。于是,这个工作被称为VAEGAN。
具体的,因为在以前的 reconstruction objective 中,都用到的是 element-wise distance metrics。这种 metrics 其实对于很多 hidden feature/space 的学习并不好。这篇论文的根本 idea 就是利用 GAN 中 Discriminator D,使其当做 learned similarity measure,来替代/弥补 reconstruction objective 中的这种 similarity measure component。D 学习到的 similarity measure 便可以被认为是一种 high-level representation 中的 measurement。可以看出,这个思想还是很有可扩展性的。
网友评论