Deep Learning从0到0.1

以下大部分是根据我自己的学习过程来的,可以算是一种人生经验,也有可能是只适合我的。有好多人问我怎么入门,我自己都没入,所以是不想公开,能不看就不要看了。(陈老师微博转了一下,班门弄斧羞愧难当。小小服务器微卡,请见谅。)

前期准备 个人认为Linux远远优于Windows(mac 不清楚,貌似也比Windows方便一点),大二之后我没有在Windows上写过跑过代码,不清楚常用的deep learning框架能否顺利在Windows上安装。但我知道在Linux上安装theano就一个命令,GPU cuda 设置也很方便。当然,这是一个安利,可以不吃。 可以上Google,会用英文搜索。最好少看中文资料,或者粗略看中文资料有个大概印象之后仔细看英文资料。 基本的优化知识,像梯度下降法,以及随机的梯度下降法(SGD)。另外还有一些加速方法,可以看这篇博文,形象科学。 基本的机器学习知识,最起码的logistic regression。这个非常重要,可以看作是最最基本的单层神经网络,相当于平房跟金茂的关系。理解里面的sigmoid也很重要,对以后理解为什么要用tanh,relu有帮助。这个最好能自己实现,matlab也行,了解原理就好了。可以使用libsvm的数据集测试分类效果。可以参考coursera上的机器学习不过他的作业貌似封装了优化算法,最好优化算法也自己写。这可能是最艰难无趣的一步,实在不行先跳过。 一点矩阵知识,感觉知道就行,离真正用到还很远。 概率知识,只要不搞生成模型啥的如VAE这种就可以先不管。像CNN基本用不到,只要知道softmax是个什么就行了。softmax(敲黑板!)就是多类logistic regression,简单讲就是模型判定输入是属于哪个类的概率。理解了logistic regression就不难了。 最好能看一本书,能够系统的学习,Ian Goodfellow and Yoshua Bengio and Aaron Courville写的deep learning就不错。

准备这些我觉得需要2周左右,推荐几个框架,边准备边试,看看喜欢哪一个框架。

blocks deeplearning mxnet keras 初步了解

神经网络最初的是多层感知机(MLP),就是多层的Logistic regression,coursera上的机器学习那课里也有讲到。可以跑一下thenao的代码。为什么纯MLP很少用呢?主要因为参数冗余且不符合原理。还有很多其他原因,可以在接触CNN等其他结构的网络之后慢慢理解。当然这个MLP也是很重要的,虽然这里不多谈。

最重要的是尝试,否则就是夸夸其谈不明细节。当然得选择有趣简单的东西玩。deep learning中RBM这类可能有点晦涩而且现在并不流行。我就分别举CNN,RNN,GAN中简单可行的例子。可能现在不知道这些分别是什么,后面慢慢理解。

CNN

CNN的开山鼻祖LeNet和AlexNet算是最初级的CNN可以一看,毕竟里面有很多东西都过时了。但它引入的relu,pooling这些精华还一直在,所以务必看一下AlexNet的论文。这篇博文还有一些比较。简单来说,CNN就是下面的架构,很好理解,相比MLP就多了卷积和pooling操作。看MLP就出现了,在这里cnn就是在提取特征,而MLP就是在提取的特征上做判别。

From deeplearning.net

知道这些并不有趣,要玩点直观的。我觉得最有趣的肯定是neural style,最近流行的Prisma也基于差不多的原理,如果你都懂原理你就是high level。我们在有限的计算资源下训练一个大型CNN显得非常不划算,但是用别人训练好的CNN做一些有趣的事也算是另辟蹊径来理解什么是CNN。他的paper中介绍的还算清楚。工业界是要让代码跑起来,入门的第一件事就是能跑别人的代码,管他原理不原理。如果不清楚,先跑起来再说,生成一张自己照片的风格图也很值啊,然后再慢慢了解原理。

如果了解了原理,看了源码,可以尝试修改,比如合成两张图片啥的。能做到就算完全了解了neural style的原理了。这算是入门的第二步,修改别人的代码,同时可以学习一个。牛b之后还可以想想能否通过Autoencoder来加快速度。

好像有点跳,不虚慢慢来。当了解CNN工作模式还得靠其他的东西。

还可以看看deep dream,不过看着好像有点恶心。或者看看其他流行的项目。最重要的是阅读源代码,代码是绝对正确的。书本上paper里的都是大概,很少有细节。我没怎么训练过CNN,所以没法给出更多训练时的细节。

RNN

RNN就难多了,理解LSTM花了我很久。下面两个系列帮我了很大的忙。看完绝对能理解RNN,至少知道是RNN个什么,至少知道为什么要用LSTM,GRU这些变种。看不懂可以先看个大概,跑跑代码再说,然后再看,然后再研究代码。我就这么recurrent的入门的。

Recurrent Neural Networks tutorials […]

Deep Learning从0到0.5

以下大部分是根据我自己的学习过程来的,可以算是一种人生经验,也有可能是只适合我的。有好多人问我怎么入门,我自己都没入,所以是不想公开,能不看就不要看了。(陈老师微博转了一下,班门弄斧羞愧难当。小小服务器微卡,请见谅。)

前期准备 个人认为Linux远远优于Windows(mac 不清楚,貌似也比Windows方便一点),大二之后我没有在Windows上写过跑过代码,不清楚常用的deep learning框架能否顺利在Windows上安装。但我知道在Linux上安装theano就一个命令,GPU cuda 设置也很方便。当然,这是一个安利,可以不吃。 可以上Google,会用英文搜索。最好少看中文资料,或者粗略看中文资料有个大概印象之后仔细看英文资料。 基本的优化知识,像梯度下降法,以及随机的梯度下降法(SGD)。另外还有一些加速方法,可以看这篇博文,形象科学。 基本的机器学习知识,最起码的logistic regression。这个非常重要,可以看作是最最基本的单层神经网络,相当于平房跟金茂的关系。理解里面的sigmoid也很重要,对以后理解为什么要用tanh,relu有帮助。这个最好能自己实现,matlab也行,了解原理就好了。可以使用libsvm的数据集测试分类效果。可以参考coursera上的机器学习不过他的作业貌似封装了优化算法,最好优化算法也自己写。这可能是最艰难无趣的一步,实在不行先跳过。 一点矩阵知识,感觉知道就行,离真正用到还很远。 概率知识,只要不搞生成模型啥的如VAE这种就可以先不管。像CNN基本用不到,只要知道softmax是个什么就行了。softmax(敲黑板!)就是多类logistic regression,简单讲就是模型判定输入是属于哪个类的概率。理解了logistic regression就不难了。 最好能看一本书,能够系统的学习,Ian Goodfellow and Yoshua Bengio and Aaron Courville写的deep learning就不错。

准备这些我觉得需要2周左右,推荐几个框架,边准备边试,看看喜欢哪一个框架。

blocks deeplearning mxnet keras 初步了解

神经网络最初的是多层感知机(MLP),就是多层的Logistic regression,coursera上的机器学习那课里也有讲到。可以跑一下thenao的代码。为什么纯MLP很少用呢?主要因为参数冗余且不符合原理。还有很多其他原因,可以在接触CNN等其他结构的网络之后慢慢理解。当然这个MLP也是很重要的,虽然这里不多谈。

最重要的是尝试,否则就是夸夸其谈不明细节。当然得选择有趣简单的东西玩。deep learning中RBM这类可能有点晦涩而且现在并不流行。我就分别举CNN,RNN,GAN中简单可行的例子。可能现在不知道这些分别是什么,后面慢慢理解。

CNN

CNN的开山鼻祖LeNet和AlexNet算是最初级的CNN可以一看,毕竟里面有很多东西都过时了。但它引入的relu,pooling这些精华还一直在,所以务必看一下AlexNet的论文。这篇博文还有一些比较。简单来说,CNN就是下面的架构,很好理解,相比MLP就多了卷积和pooling操作。看MLP就出现了,在这里cnn就是在提取特征,而MLP就是在提取的特征上做判别。

From deeplearning.net

知道这些并不有趣,要玩点直观的。我觉得最有趣的肯定是neural style,最近流行的Prisma也基于差不多的原理,如果你都懂原理你就是high level。我们在有限的计算资源下训练一个大型CNN显得非常不划算,但是用别人训练好的CNN做一些有趣的事也算是另辟蹊径来理解什么是CNN。他的paper中介绍的还算清楚。工业界是要让代码跑起来,入门的第一件事就是能跑别人的代码,管他原理不原理。如果不清楚,先跑起来再说,生成一张自己照片的风格图也很值啊,然后再慢慢了解原理。

如果了解了原理,看了源码,可以尝试修改,比如合成两张图片啥的。能做到就算完全了解了neural style的原理了。这算是入门的第二步,修改别人的代码,同时可以学习一个。牛b之后还可以想想能否通过Autoencoder来加快速度。

好像有点跳,不虚慢慢来。当了解CNN工作模式还得靠其他的东西。

还可以看看deep dream,不过看着好像有点恶心。或者看看其他流行的项目。最重要的是阅读源代码,代码是绝对正确的。书本上paper里的都是大概,很少有细节。我没怎么训练过CNN,所以没法给出更多训练时的细节。

RNN

RNN就难多了,理解LSTM花了我很久。下面两个系列帮我了很大的忙。看完绝对能理解RNN,至少知道是RNN个什么,至少知道为什么要用LSTM,GRU这些变种。看不懂可以先看个大概,跑跑代码再说,然后再看,然后再研究代码。我就这么recurrent的入门的。

Recurrent […]

使用Python连接PostgreSQL

Python中可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2。psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用。

连接数据库:

import psycopg2 conn = psycopg2.connect(host=”10.100.157.168″,user=”postgres”,password=”postgres”,database=”testdb”)

连接时可用参数:

dbname – 数据库名称 (dsn连接模式) database – 数据库名称 user – 用户名 password – 密码 host – 服务器地址 (如果不提供默认连接Unix Socket) port – 连接端口 (默认5432)

执行SQL

import psycopg2 conn = psycopg2.connect(host=”10.100.157.168″,port=5432,user=”postgres”,password=”postgres”,database=”testdb”) cur = conn.cursor() sql = “” cur.execute(sql) conn.commit()  # 查询时无需,此方法提交当前事务。如果不调用这个方法,无论做了什么修改,自从上次调用#commit()是不可见的 conn.close()

另外执行SQL时支持参数化

语法: cursor.execute(sql [, optional parameters]) […]

使用Python连接PostgreSQL

Python中可以用来连接PostgreSQL的模块很多,这里比较推荐psycopg2。psycopg2安装起来非常的简单(pip install psycopg2),这里主要重点介绍下如何使用。

连接数据库:

import psycopg2 conn = psycopg2.connect(host=”10.100.157.168″,user=”postgres”,password=”postgres”,database=”testdb”)

连接时可用参数:

dbname – 数据库名称 (dsn连接模式) database – 数据库名称 user – 用户名 password – 密码 host – 服务器地址 (如果不提供默认连接Unix Socket) port – 连接端口 (默认5432)

执行SQL

import psycopg2 conn = psycopg2.connect(host=”10.100.157.168″,port=5432,user=”postgres”,password=”postgres”,database=”testdb”) cur = conn.cursor() sql = “” cur.execute(sql) conn.commit()  # 查询时无需,此方法提交当前事务。如果不调用这个方法,无论做了什么修改,自从上次调用#commit()是不可见的 conn.close()

另外执行SQL时支持参数化

语法: cursor.execute(sql [, optional parameters]) […]

问答网站StarOverflow的盈利之道

昨天在小道消息上看到的这篇《Stack Overflow: 我们如何赚钱》,感触还是蛮深的。重点的内容我都进行了加粗处理。具体内容:

我是 Nick Craver,你可能还记得我。我之前写了三篇文章 How Stack Overflow does deployment、How we do hardware 以及 How we built our architecture。

关于我们如何赚钱,我还一直没有谈及,对于大部分开发者来说这一直是一个迷。我现在决定来谈一谈我们是如何赚钱的,一是用来回答这个经常被问的问题,二是我和公司都相信对于社区坦诚布公是百利而无一害的。这涉及到现实中一些比较模糊不清的事情,比如财务,这也是为什么我们会创建一些项目,比如 Stack Overflow Salary Calculator, 来使我们的工资流程透明化。

我们为什么要赚钱

在正式开始之前,我来交代一些背景:我负责 Stack Overflow 的架构组,就在我写这篇文章的时候我们刚结束了公司年度聚会( meetup )。聚会对于远程工作者来说非常地棒,比如我,因为终于可以面对面地认识之前和我一起远程工作而从没有见过的同事了。

年度聚会也提醒着我们为什么要做 Stack Overflow,我们都做了什么以及我们怎么样才能做的更好。在过去 6 年里,我觉得我做的事情(注:指的就是 Stack Overflow )给予开发者们不曾有过的资源,而且每一天我都在努力去让它变得更好。但是我不是一个人在孤军奋战,我非常幸运地能够和一些最棒的开发者、系统管理员、设计师、经理、营销人员、销售一起工作。Stack Overflow 不是我一个人的成果,而是我们大家一起努力的结果。

我上周一直在和我的同事们讨论我们是怎么发展成一个公司的,这些人中有的从来没有说过话。更最要的是,当我们的工作逐渐变得可敬,我们已经知道如何去做。我对我们的同事的日常行为有很高的要求,因为在用户眼里,我们代表了 Stack Overflow。我对我们的用户信息讳莫如深,你可以问问任何在 Stack Overflow工作的人是不是这样。我一直坚信我们正在和社区建立一种坚不可摧的信任。我希望能在看重这种信任的公司工作,而现在我就是。

尽管这是一个公开的理念,但是过去我们还是听到很多人对我们如何既能尊重用户同时又能赚钱表示担忧,因为我们毕竟要为我们的投资人挣钱同时还要保证公司运作下去。我们想纠正这种看法。诚然,钱对于公司持续发展是必须的,但是我们的存在的意义本来就是为了帮助我们的用户,我们存在是因为你们让我们存在。用户才是我们的初心。所以我们不断地把资金用在改进社区的工作上,而不是把我们的产品看成是一种从社区获利的工具。我们挣多少钱就表示我们对用户的帮助有多大。为了做成了不起的工作,我们专注在怎么样才能最大化地帮助用户。很少有公司能够成功做到这些,很荣幸也很骄傲,我们是少数中的一员。

我们怎么赚钱

招聘业务

我们通过商业产品「Display Ads and Talent」去帮助一些公司做品牌宣传和招聘。这种服务反过来帮助开发者找到更好的工作,同时以一种用户体验良好的方式(没有垃圾邮件和动画广告,等等 […]

问答网站StarOverflow的盈利之道

昨天在小道消息上看到的这篇《Stack Overflow: 我们如何赚钱》,感触还是蛮深的。重点的内容我都进行了加粗处理。具体内容:

我是 Nick Craver,你可能还记得我。我之前写了三篇文章 How Stack Overflow does deployment、How we do hardware 以及 How we built our architecture。

关于我们如何赚钱,我还一直没有谈及,对于大部分开发者来说这一直是一个迷。我现在决定来谈一谈我们是如何赚钱的,一是用来回答这个经常被问的问题,二是我和公司都相信对于社区坦诚布公是百利而无一害的。这涉及到现实中一些比较模糊不清的事情,比如财务,这也是为什么我们会创建一些项目,比如 Stack Overflow Salary Calculator, 来使我们的工资流程透明化。

我们为什么要赚钱

在正式开始之前,我来交代一些背景:我负责 Stack Overflow 的架构组,就在我写这篇文章的时候我们刚结束了公司年度聚会( meetup )。聚会对于远程工作者来说非常地棒,比如我,因为终于可以面对面地认识之前和我一起远程工作而从没有见过的同事了。

年度聚会也提醒着我们为什么要做 Stack Overflow,我们都做了什么以及我们怎么样才能做的更好。在过去 6 年里,我觉得我做的事情(注:指的就是 Stack Overflow )给予开发者们不曾有过的资源,而且每一天我都在努力去让它变得更好。但是我不是一个人在孤军奋战,我非常幸运地能够和一些最棒的开发者、系统管理员、设计师、经理、营销人员、销售一起工作。Stack Overflow 不是我一个人的成果,而是我们大家一起努力的结果。

我上周一直在和我的同事们讨论我们是怎么发展成一个公司的,这些人中有的从来没有说过话。更最要的是,当我们的工作逐渐变得可敬,我们已经知道如何去做。我对我们的同事的日常行为有很高的要求,因为在用户眼里,我们代表了 Stack Overflow。我对我们的用户信息讳莫如深,你可以问问任何在 Stack Overflow工作的人是不是这样。我一直坚信我们正在和社区建立一种坚不可摧的信任。我希望能在看重这种信任的公司工作,而现在我就是。

尽管这是一个公开的理念,但是过去我们还是听到很多人对我们如何既能尊重用户同时又能赚钱表示担忧,因为我们毕竟要为我们的投资人挣钱同时还要保证公司运作下去。我们想纠正这种看法。诚然,钱对于公司持续发展是必须的,但是我们的存在的意义本来就是为了帮助我们的用户,我们存在是因为你们让我们存在。用户才是我们的初心。所以我们不断地把资金用在改进社区的工作上,而不是把我们的产品看成是一种从社区获利的工具。我们挣多少钱就表示我们对用户的帮助有多大。为了做成了不起的工作,我们专注在怎么样才能最大化地帮助用户。很少有公司能够成功做到这些,很荣幸也很骄傲,我们是少数中的一员。

我们怎么赚钱

招聘业务

我们通过商业产品「Display Ads and Talent」去帮助一些公司做品牌宣传和招聘。这种服务反过来帮助开发者找到更好的工作,同时以一种用户体验良好的方式(没有垃圾邮件和动画广告,等等 […]

CentOS 7.2 安装 Nginx 1.10.2 记录

最近由于要切换VPS,所以打算使用最新的系统进行搭建LNMP,以下为CentOS 7.2安装Nginx 1.10.2的安装记录,记录下以便下次再使用。先前的文章中已经介绍过阿里的Tengine的安装流程,也可以参考下。

使用Yum安装(推荐)

使用Yum安装是推荐的方式,整体的流程非常的简单,也不容易出错,如果不需要什么特殊配置,建议使用Yum尽进行安装。

1、安装epel-release源并进行安装

yum install epel-release yum update yum install nginx

2、执行相关的应用操作

systemctl start nginx #启动 systemctl stop nginx #停止 systemctl restart nginx #重启 systemctl status nginx #查看运行状态 systemctl enable nginx #开机启动

3、设置防火墙

在启动完以后可能无法通过IP访问,需要进一步设置防火墙(关于firewall-cmd的使用方法下一篇文章再详细讲解)

firewall-cmd –permanent –zone=public –add-service=http firewall-cmd –permanent –zone=public –add-service=https firewall-cmd –reload

至此,安装完毕。

参考文章:https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7

通过源码编译安装

1、安装编译所需工具

yum groupinstall “Development Tools” […]

理解字节序

1.

计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。

大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。

同理,0x1234567的大端字节序和小端字节序的写法如下图。

2.

我一直不理解,为什么要有字节序,每次读写都要区分,多麻烦!统一使用大端字节序,不是更方便吗?

上周,我读到了一篇文章,解答了所有的疑问。而且,我发现原来的理解是错的,字节序其实很简单。

3.

首先,为什么会有小端字节序?

答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。

但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。

4.

计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一个字节,再读第二个字节。

如果是大端字节序,先读到的就是高位字节,后读到的就是低位字节。小端字节序正好相反。

理解这一点,才能理解计算机如何处理字节序。

5.

字节序的处理,就是一句话:

“只有读取的时候,才必须区分字节序,其他情况都不用考虑。”

处理器读取外部数据的时候,必须知道数据的字节序,将其转成正确的值。然后,就正常使用这个值,完全不用再考虑字节序。

即使是向外部设备写入数据,也不用考虑字节序,正常写入一个值即可。外部设备会自己处理字节序的问题。

6.

举例来说,处理器读入一个16位整数。如果是大端字节序,就按下面的方式转成值。

x = buf[offset] * 256 + buf[offset+1];

上面代码中,buf是整个数据块在内存中的起始地址,offset是当前正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。

x = buf[offset]<<8 | buf[offset+1];

上面代码中,第一个字节左移8位(即后面添8个0),然后再与第二个字节进行或运算。

如果是小端字节序,用下面的公式转成值。

x = buf[offset+1] * 256 + buf[offset];

32位整数的求值公式也是一样的。

/* 大端字节序 */ i […]

Linux下文件的压缩与解压缩

Linux下文件的压缩与解压缩与Windows环境下有较大的区别,在Windows下只需要安装类似Winrar工具就能解压缩大部分文件,而在Linux命令行下每一种文件都有不同的压缩和解压缩方法。

使用tar打包文件

Linux下最常用的打包程序就是tar(注意tar是打包,不是压缩!),使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的。生成tar包后,就可以用其它的程序来进行压缩了。tar命令的选项有很多(用man tar可以查看到) 。

格式:tar [主选项+辅选项] 文件或目录

主选项:它们不可能同时出现,告诉tar要做什么事,是必须要有的

-c:创建新的压缩文件,相当与打包 -x:从压缩文件中释放文件,相当于拆包 -t:列出压缩文件中的内容

辅选项:可选

-C:切换到指定目录 -z:是否同时具有gzip的属性?亦即是否需要用gzip压缩或解压?一般格式为tar.gz或xx.tgz -j:是否同时具有bzip2的属性?亦即是否需要用bzip2压缩或解压?一般格式为tar.bz2 -v:压缩过程中显示文件 -f:指定压缩文件,注意,在f之后要立即接档名(自己取的),不要再加其他参数 -p:使用原文件的原来属性 -exclude FILE:在压缩过程中,不要将FILE打包

常用命令:

压缩:

tar -cvf 文件或目录名 打包的对象    ——仅打包,不压缩 tar -zcvf 文件或目录名——打包后,以gzip压缩 tar -jcvf 文件或目录名——打包后,以bzip2压缩

查阅:(注意:根据是否为gzip压缩,来选择是否要加上z)

tar -ztvf 文件或目录名 ——查阅压缩文件中有那些文件

解压:

tar -xvf 文件或目录名 tar -zxvf 文件或目录名

示例:

tar -cvf file2.tar /home/user2/file2 #将/home/user2/file2文件打包到当前目录下的tar中,需要注意的是:使用绝对路径标识的源文件,在用tar命令压缩后,文件名连同绝对路径(home/user2/,根目录”/”被自动去掉了)一并被压缩进来,使用tar解压缩后会看到home文件,二并不是file2。 tar -cvf […]

Centos 7.2安装Percona记录

针对MySQL衍生版本选择MariaDB还是Percona目前还有很多不一致的观点,上一篇文章讲了如何在Centos 7.2系统上安装最新的MariaDB 10.1.19,这篇文章再来讲解下如何在CentOS 7.2上安装最新的 Percona 5.7。

方案一:通过yum安装

安装Percona源:

yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

测试安装的源:

yum list | grep percona

完成后就可以直接进行安装:

yum install Percona-Server-server-57

启动、停止MySQL操作:

service mysql start service mysql status service mysql stop service mysql resta chkconfig mysqld on

如果需要安装TokuDB,执行:

yum install Percona-Server-tokudb-57.x86_64

然后设置初始密码:

mysql_secure_installation

发现这里的初始密码与并不为空,报错信息如下:

[root@localhost my.cnf.d]# mysql_secure_installation Securing the MySQL server deployment. Enter password for […]

Category

Archives