This repository is used to publish source code of my deep learning book
update 2017-7-23:代码添加python3支持,代码在python3.6 + Theano 0.9环境下运行成功
本代码基于python2.7.13和theano 0.8.2编写,如果你在运行本代码时遇到什么问题,或者有什么疑问,也欢迎随时与我联系: huanganbu@gmail.com
要执行本教程的代码,读者首先需要安装下面的软件或依赖库:
pip install mingw
pip install libpython
如果pip install运行错误,可以尝试使用conda install来获取,即:
conda install mingw libpython
pip install theano
当你按照上面的步骤执行完毕后,在命令行窗口中输入"python"进入python的工作环境,然后输入"import theano",如果没有报错,并且得到下面的信息(可能因系统环境不同,显示的信息会不一样),那么,恭喜你,你已经成功安装Theano的开发环境,可以编写代码了。
部件 | 信息 |
---|---|
CPU | intel Core i7-6700K |
RAM | 16GB或以上 |
GPU | Nvidia GeForce GTX 1080 |
CIFAR-10图像分类. CIFAR-10由6万张大小为32323构成的图像集,由多伦多大学的Alex Krizhevsky, Vinod Nair和Geoffrey Hinton收集和维护,数据集的下载地址为:(https://www.cs.toronto.edu/~kriz/cifar.html)
在本应用中,我尝试了下面的4种不同的网络模型来进行分类:
注意:我没有对上述模型进行进一步的优化,读者可以自行修改超参数,或者修改网络的结构来获得更好的性能,例如,可以添加dropout防止过拟合;CNN使用更多的卷积层等
在命令行窗口种输入cd命令进入"cifar10 classification"文件夹, 分别执行"softmax.py", "mlp.py", "cnn.py", "sda.py",则可以运行不同的模型。
下图展示了不同的模型,随着迭代次数的增加,相应的分类错误率的曲线趋势对比:
在这个应用种,我们采用基于RBM的协同过滤算法来进行个性化推荐,基于RBM的协同过滤,最早是由Hinton等人在2006年提出,并且也是当年的Netflix竞赛中表现最好的单模型之一,更详细的实现,读者可以参考书本第11章的讲解,或者查阅文章: http://www.utstat.toronto.edu/~rsalakhu/papers/rbmcf.pdf
要运行本节代码,你需要按照下面的代码来执行:
步骤一: 进入"Recommendation"文件夹, 运行"data_preprocess.py"脚本, 你将得到一个新的文件"data.pkl",该文件为你封装了模型所需要的输入数据结构,该数据结构包括下面的数据:
Step 2: 运行"rbm.py"脚本来训练模型
在本应用中,我使用了下面5个不同的训练策略,包括:调整cd的步数,通常来说cd的步数越大,Gibbs采样的准确度就越高,但运行时间也更长,方案一和方案二可以看出这种差距;使用persistent,也就是每一次的gibbs链的起点不是重新开始,而是以上一次的链尾作为本次Gibbs采样的开始,这种做法也会比普通的对比散度算法效果要好;最后,我还采用了自适应调整学习率和Gibbs采样步数的策略,我们发现,动态调整超参数的效果要更优于静态固定的超参数。
下图是不同的策略对应的错误率曲线图:
本应用是使用LSTM模型来构建语言模型,我们采用的数据集摘取自Google BigQuery的reddit comments
统计语言模型本质上是一个概率分布模型,通过语言模型,我们可以得到任意一个句子的概率大小,我们用数学公式可以形式化地表示为:
基于LSTM的语言模型网络结构如下图所示,把每一个句子的每一个单词作为每一个时间步的输入,并预测下一时间步的结果输出概率,更详细的细节,读者可以参阅书本的第十二章:
在命令行窗口种输入cd命令进入"Language model"文件夹,运行"lstm.py"脚本,将得到下面的每一步迭代输出:
经过100次的迭代训练后,损失函数的曲线趋势如下图所示: 注意:本程序的运算量比较大,因此,强烈建议将本程序放在GPU中运行
在本任务中,我使用了卷积神经网络来实现文本分类,本案例使用的数据集来源于imdb的评论数据集,数据集的下载地址为:http://ai.stanford.edu/~amaas/data/sentiment/. 当给定任意的一条评论数据,模型能够预测出它属于正面评论还是负面评论的概率
步骤一: 解压imdb数据集文件到本地文件夹(aclImdb_v1.tar.gz).
步骤二: 运行"data_preprocess.py"脚本, 脚本将对数据集进行解析,并得到下面的几个结构体,以供训练使用:
步骤三: 运行"cnn_classification.py"脚本来对数据进行分类,详细的实现细节,读者可以参考书本的第十三章。
本应用的CNN模型,主要采用AlexNet的架构,在全连接层采用了Dropout策略,分别用4种不同的优化策略,效果如下图所示: 注意:CNN模型的运算量非常大,因此,强烈建议将本程序放在GPU中运行