AutoKeras:开源AutoML初体验,自动搜索和构建最优深度模型,贝叶斯搜索器,以及mnist示例代码

20 美元/时的AutoML太贵?试试AutoKeras吧

自动搜索构建深度学习模型和调参一直是数据科学家们向往的工具,而我们知道Google AI发布的AutoML是要收费的,如果想要开源的而且想要对AutoML背后技术一探究竟的,可以看看这款AutoKeras

AutoKeras开发处于初期阶段,它基于Keras(也有pytorch),而keras我们知道是基于TensorFlow,所以GPU利用可以不用担心(只要你安装了gpu版TensorFlow即可)。由于Keras代码极其简洁,autokeras上手也较容易 。

所以直接上autokeras版mnist训练代码:

from keras.datasets import mnist
from autokeras.image_classifier import ImageClassifier

if __name__ == '__main__':
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    x_train = x_train.reshape(x_train.shape + (1,))
    x_test = x_test.reshape(x_test.shape + (1,))

    clf = ImageClassifier(verbose=True, augment=False)
    clf.fit(x_train, y_train, time_limit=12 * 60 * 60)
    clf.final_fit(x_train, y_train, x_test, y_test, retrain=True)
    y = clf.evaluate(x_test, y_test)
    print(y * 100)

这里有几个要点,第一,代码需要在python3.6上跑否则会有兼容性问题(目前autokeras只支持python3.6), 继续阅读AutoKeras:开源AutoML初体验,自动搜索和构建最优深度模型,贝叶斯搜索器,以及mnist示例代码

GAN和VAE都out了?理解基于流的生成模型(flow-based): Glow,RealNVP和NICE,David 9的挖坑贴

生成模型一直以来让人沉醉,不仅因为支持许多有意思的应用落地,而且模型超预期的创造力总是让许多学者和厂商得以“秀肌肉”:

OpenAI Glow模型生成样本样例,在隐空间控制图像渐变

了解基于流的生成模型(flow-based)前,先回顾目前主流的两类生成模型GAN和VAE,David 9文章早已介绍过

VAE与GAN结构比较

GAN简单粗暴,用两个深度网络(判别器D和生成器G)交替学习使得生成器G可以模拟现实生成样本,但是缺陷也是明显的:GAN不能直接了当地给出一个样本的隐分布的表征(你可以生成一个明星,但是你无法马上生成一个“微笑的”或“年轻的”明星),即,你很难用隐变量随意操纵生成的样本,你只知道生成的是任意样本(除非你重新设计GAN,像我们以前谈到的cGAN或者FaderNetworks等等。。)

VAE思路就完全不同,它继承了古老的贝叶斯理论,相信一切的创造可以用抽样后验概率来缔造。

你想创造新样本?好的,但是真实分布空间X 太复杂了,我们先意淫一个后验空间Z吧: 继续阅读GAN和VAE都out了?理解基于流的生成模型(flow-based): Glow,RealNVP和NICE,David 9的挖坑贴

从SRU小小的学术争议,可以学到什么?关于SRU简单循环单元,David 9 有几点想说

人类只是不择手段存活的预设算法,他们以为设计精密就能发号施令,但他们只是“乘客” — 《西部世界》

前不久SRU(简单循环单元)遭到了Quasi-RNN 的质疑,认为SRU只是Quasi-RNN的卷积窗口为1时的特殊情况,原帖在这里(需要梯子):

www.facebook.com/cho.k.hyun/posts/10208564563785149

SRU作者自己的解释在这里(不要梯子):

https://www.zhihu.com/question/65244705/answer/229364472

就争议本身David 9 不做任何评判,毕竟,一旦开始辩驳,人类就会不自觉地向着自己的利益方向靠近, 正如《西部世界》里所说:“人类只是不择手段存活的预设算法 ”

David 9 不喜欢八卦

所以,从这起小小的学术争议,David 9关注的是,我们可以学到什么 ?这里记录一下我的总结:

1. 论文起名要简洁,意图要清晰。

为什么之前Quasi-RNN没有火一把,而SRU却在社交网络上传了那么远?许多人忽略的一点是,SRU起名很好很简洁。如果作者起名叫“Yet another simple RNN acceleration method” ,恐怕就没人凑热闹了。SRU还能让人联想到GRU,会不会是下一代GRU呢?一些不明真相的网友就蠢蠢欲动了。

所以,写文章前,有必要想个好名字,让大家快速了解你的工作,为你传播。(不要刻意营销就好)

2. 论文要和相似idea的文章做充分对比,提前指出自己工作中非常不同的那一部分。 继续阅读从SRU小小的学术争议,可以学到什么?关于SRU简单循环单元,David 9 有几点想说

高阶Numpy扩展库与API盘点:在ndarray上直接进行多核分布式、GPU利用、稀疏处理和自动求导,那些你不知道的ndarray扩展操作

软件演进和生物进化一样,没人可以预测下一步走向哪里,我们只知道,它需要人类的脑力和贪婪去喂养 — David 9

谁也没有想到30年前Guido写的Python因为通俗易用、丰富的联网支持,变为现在数据科学家最喜爱的工具语言之一。甚至小小的代数计算库Numpy会涌现如此多的扩展库和矛盾。

有人认为,长颈鹿之所以进化时如此过度关注脖子长度(其实适当高度就足够了),只是因为母长颈鹿认为雄长颈鹿脖子越长越有性魅力(种内竞争)

软件进化也类似,人类社区中那些勤劳的开发者努力让Numpy支持各种场景(多核分布式、GPU利用、稀疏处理和Autograd ),解决各种矛盾(ndarray不兼容,numpy插件系统不到位)。但是,他们的汗水都是基于Python这个“种族”进化的,种内竞争激烈不一定能保证软件的发展方向好 。。。

扯远了。。今天还是想盘点高阶Numpy扩展库与API ,毕竟许多人不满足于基础的numpy代数计算。比如下面这些场景(重写库)

  • CuPy: 实现Numpy有的API ,保证所有计算可以在CUDA GPU上加速
  • Sparse: 对于稀疏的ndarray(许多元素是0的情况), 重写实现Numpy的API(更高效)
  • Dask array: 对于多核或者多机器的工作站,为了可以分布式或者多核,又重写Numpy API ,所以有了这个库

最简单的例子大概是这样的:

import numpy as np
x = np.random.random((2,3))  # 在一个cpu上跑 
y = x.T.dot(np.log(x) + 1)
z = y - y.mean(axis=0)
print(z[:5])

import cupy as cp
x = cp.random.random((2,3))  # 在GPU上跑
y = x.T.dot(cp.log(x) + 1)
z = y - y.mean()
print(z[:5].get())

import dask.array as da
x = da.random.random((2,3))  # 在许多cpu上跑
y = x.T.dot(da.log(x) + 1)
z = y - y.mean(axis=0)
print(z[:5].compute())

默默妈卖批,这帮人就不知道合作一下合成一个库吗? 继续阅读高阶Numpy扩展库与API盘点:在ndarray上直接进行多核分布式、GPU利用、稀疏处理和自动求导,那些你不知道的ndarray扩展操作

时间卷积网络(TCN) 总结:时序模型不再是递归网络(RNN) 的天下,但作为信息粗暴提取的一种方法,请不要神话CNN !

深度学习似乎进入了“泛模型”阶段,同一个问题可以用不同深度学习结构解决,但是没有人可以证明哪个模型一定最好 — David 9

最近读到文章说“TCN(时间卷积网络)将取代RNN成为NLP预测领域王者”。一方面David 9 想为RNN抱不平,请大家别过于迷信CNN,毕竟只是一种特征提取方法,不必神话它(想想当年有人认为SVM可以解决所有建模问题)。

另一方面,可以感受到深度学习进入了“泛模型”的阶段。模型的结构创新没有衰退的趋势,而这些创新不出意料很快会被其他模型超越。这些“超越”都是实验与经验上的“超越“,没有SVM这样扎实的理论。

回顾历史可以发现,广义的计算机”模型“一直在”向上”做更灵活的事情

ML时代那些机器学习”模型“(SVM,随机森林)一般只做最后的分类、聚类或回归;现在深度学习时代“模型”(以CNN、RNN为主)把特征提取的工作也一并做掉了。可以预见,未来物联网IOT发展到一定阶段,我们需要更复杂“模型”去自动收集数据,具体是什么形式的“模型”我们可以拭目以待。

言归正传,今天David 9 要把TCN(时间卷积网络,CMU的研究总结)这个“坑”给填了。其实TCN只是一维卷积变形之后在时序问题上变得适用(以前David 9也讲过一维卷积):

来自论文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks
for Sequence Modeling

仔细观察就可以发现,TCN的卷积和普通1D卷积最大的不同就是用了扩张卷积(dilated convolutions),越到上层,卷积窗口越大,而卷积窗口中的“空孔”越多

上式是扩展卷积操作的式子,其中d是扩展系数(即评价“空孔”的多少)。 继续阅读时间卷积网络(TCN) 总结:时序模型不再是递归网络(RNN) 的天下,但作为信息粗暴提取的一种方法,请不要神话CNN !

#PyCon2018两款最新ML数据可视化库:Altair和Yellowbrick,函数式编程的可视化库和scikit-learn增强可视化库

数据科学的可视化库和深度学习框架库一样,虽然层出不穷,但是大致分为两种:

一种是通用可视化库任何类似json schema的静态数据都可以用它作图如:  PandasSeaborn , ggplotBokehpygalPlotly 。

另一种是和框架耦合较高的可视化库,如TensorFlow的TensorBoard,scikit-learn增强可视化库Yellowbrick

对于第一种通用库,方便简洁、易用的趋势一直没有改变。这届PyCon2018上的talk:Exploratory Data Visualization with Vega, Vega-Lite, and Altair 就介绍了Altair这种新的函数式编程可视化库,其简洁程度,只要拿到panda的dataframe数据,多加一句声明代码,就可以进行可视化了:

import altair as alt

# to use with Jupyter notebook (not JupyterLab) run the following
# alt.renderers.enable('notebook')

# load a simple dataset as a pandas DataFrame
from vega_datasets import data
cars = data.cars()

# 这里是声明代码,是不是有函数式编程的味道 ?
alt.Chart(cars).mark_point().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
)
Altair例程

如果要把点的样式改成线的样式,只需把函数mark_point()改成mark_line()即可:

alt.Chart(cars).mark_line().encode(
    x='Horsepower',
    y='Miles_per_Gallon',
    color='Origin',
)

继续阅读#PyCon2018两款最新ML数据可视化库:Altair和Yellowbrick,函数式编程的可视化库和scikit-learn增强可视化库

CVPR2018精选#3: 端到端FCN学会在黑暗中看世界,全卷积网络处理低曝光、低亮度图片并进行还原,及其TensorFlow源码

与其说AI智能时代,不如说是“泛智能的自动化”时代,或者,以人类为智能核心的 “机器智能辅助”时代 — David 9

最近流传的一些AI“寒冬论”, David 9 觉得很可笑。二十年前深蓝击败卡斯帕罗夫时,自动化智能已经开始发展,只是现今更“智能”而已,而这个更智能、更普及的趋势不是任何人可以控制的。

人类无尽的贪婪和惰性需要外部智能辅助和填补,也许以后的核心不是“深度学习”或者增强学习,但终究会有更“好”的智能去做这些“脏”活“累”活,那些人类不想干或人类做不到的活。。。

CVPR2018上,伊利诺伊大学和Intel实验室的这篇“学会在黑暗中看世界” 就做了人类做不到的活, 自动把低曝光、低亮度图片进行亮度还原

来自论文:Learning to See in the Dark

人肉眼完全开不到的曝光环境下,机器实际是可以还原出肉眼可识别的亮度。

该论文的第一个贡献是See-in-the-Dark (SID)数据集的整理:

来自论文:Learning to See in the Dark

因为目前的数据集没有针对低曝光同时低亮度的图片集,如上图,作者用索尼和富士相机收集低曝光的室内室外图片,同时配对正常曝光的图片用来训练: 继续阅读CVPR2018精选#3: 端到端FCN学会在黑暗中看世界,全卷积网络处理低曝光、低亮度图片并进行还原,及其TensorFlow源码