黑科技:利用python的theano库刷kaggle mnist排行榜

kaggle

背景

theano 是一个python语言的库,实现了一些机器学习的方法,最大的特点是可以就像普通的python程序一样透明的使用GPU

theano的主页:

theano 同时也支持符号计算,并且和numpy相容,numpy是一个python的矩阵计算的库,可以让python具备matlab的计算能力,虽然没有matlab方便

numpy的主页:

MNIST是一个手写数字识别的公开数据集,我以为地球人都知道

kaggle mnist

mnist主页:

其他大部分资源位于deeplearning向导的主页:

deeplearning.net向导:

kaggle是一个供大家公开测试各种机器学习算法的平台,包括ICML和KDD cup一类的比赛都在上面进行,其中的入门测试集就是MNIST:

kaggle的MNIST主页:

目前发表的最好结果是卷积神经网络方法的0.23%错误率,kaggle上被认可的最好结果是0.5%。看这个架势,mnist已经基本被大家解决了。不过本着实践出真知和学习threano用法的目的,我觉得用python的theano库对kaggle mnist刷个榜玩玩也不错。

数据转换与代码修改

theano的代码位于:

https://github.com/lisa-lab/DeepLearningTutorials

我修改后的代码位于:

https://github.com/chaosconst/DeepLearningTutorials 输入数据修改

原来是从cPickle导入:

############# # LOAD DATA # #############   # Download the MNIST dataset if it is not present data_dir, data_file = os.path.split(dataset) if (not os.path.isfile(dataset)) and data_file == 'mnist.pkl.gz': import urllib origin = 'http://www.iro.umontreal.ca/~lisa/deep/data/mnist/mnist.pkl.gz' print 'Downloading data from %s' % origin urllib.urlretrieve(origin, dataset)   print '... loading data'   # Load the dataset f = gzip.open(dataset, 'rb') train_set, valid_set, test_set = cPickle.load(f) f.close()

更改为读取train.csv和test.csv,先初始化四个list。

print '... loading data' train_set=list(); valid_set=list(); test_set=list(); predict_set=list();

valid_set是用来在SGD迭代过程中,用来验证效果但不参与训练的数据集。每次只有确定在valid_set上更有效,才继续进行目标函数的优化,这样可以防止过拟合。参见early-stopping。

设定数据集的大小,如果是调试模式则减小数据集。

train_set_size = 36000; valid_set_size = 5000; test_set_size = 1000; predict_set_size = 28000;   debug = "false"; if debug == "true": train_set_size = 3600; valid_set_size = 500; test_set_size = 100; predict_set_size = 2800;

MNIST共有7w条记录,其中6w是训练集,1w是测试集。theano的样例程序就是这么做的,但kaggle把7w的数据分成了两部分,train.csv一共42000行,test.csv一共28000行。实际可用来训练的数据只有42000行(由此估计最后的效果也会有相应的折扣)。theano把6w的训练集分为了5w的test_set和1w的valid_set,我在这里把42000行数据分为36000的train_set、5000行的valid_set和1000行的test_set(训练时用不到)。

另外我建了一个predict_set,用来保存准备提交给kaggle的数据。然后我进行了变量初始化并从文件读取数值,读取的时候把kaggle的int转化成了theano需要的float。

train_set.append(numpy.ndarray(shape=(train_set_size,28*28), dtype=theano.config.floatX)); train_set.append(numpy.ndarray(shape=(train_set_size), dtype=int)); valid_set.append(numpy.ndarray(shape=(valid_set_size,28*28), dtype=theano.config.floatX)); valid_set.append(numpy.ndarray(shape=(valid_set_size), dtype=int)); test_set.append(numpy.ndarray(shape=(test_set_size,28*28), dtype=theano.config.floatX)); test_set.append(numpy.ndarray(shape=(test_set_size), dtype=int)); predict_set.append(numpy.ndarray(shape=(predict_set_size,28*28), dtype=theano.config.floatX)); predict_set.append(numpy.ndarray(shape=(predict_set_size), dtype=int));   #load data from kaggle test set with open('train.csv', 'rb') as csvfile: datareader = csv.reader(csvfile, delimiter=',') index=0; for row in datareader: if index<train_set_size : train_set[1][index] = string.atoi(row[0]); for pixel_index in xrange(1,28*28+1) : train_set[0][index][pixel_index-1] = string.atof(row[pixel_index])/255; elif index < train_set_size + valid_set_size : valid_set[1][index-train_set_size] = string.atoi(row[0]); for pixel_index in xrange(1,28*28+1) : valid_set[0][index-train_set_size][pixel_index-1] = string.atof(row[pixel_index])/255; else : test_set[1][index-train_set_size-valid_set_size] = string.atoi(row[0]); for pixel_index in xrange(1,28*28+1) : test_set[0][index-train_set_size-valid_set_size][pixel_index-1] = string.atof(row[pixel_index])/255; index+=1; if index == train_set_size + valid_set_size + test_set_size : break;   print '... loading predict dataset' #load data from kaggle test set with open('test.csv', 'rb') as csvfile: datareader = csv.reader(csvfile, delimiter=',') index=0; for row in datareader: for pixel_index in xrange(0,28*28) : predict_set[0][index][pixel_index] = string.atof(row[pixel_index])/255; index+=1; if index == predict_set_size: break;   train_set = tuple(train_set); valid_set = tuple(valid_set); test_set = tuple(test_set); predict_set = tuple(predict_set);

输出数据修改

用户喜欢...

我的Kaggle初体验 Grupo Bimbo Inventory Demand

作者:豆豆叶 这个暑假利用在西班牙交流的时间,我开始着手做自己的第一个Kaggle比赛,总得感觉还是收获特别多,...


【干货】Kaggle 数据挖掘比赛经验分享

文|陈成龙 简介 Kaggle 于 2010 年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平...


如何用 TensorFlow 教机器人作曲?秘诀原来是这样

作者:杨熹 今天想来看看 AI 是怎样作曲的。 本文会用 TensorFlow 来写一个音乐生成器。 当你对一个机器人说: 我想要...


Python 2.6 升级至 Python 2.7 的实践心得

CentOS 6.8 安装 Python 2.7.13,因为软件版本上的需求所以考虑将 Python 升级至 2.7.13,加上生产环境还是以 RHEL 6 为...


从拉勾网爬的招聘数据 解析中国数据挖掘人才能挣多少钱

作者|李宁(本文已获得作者本人的转载授权,其他转载请联系本人,36大数据不对任何其他转载侵权行为做背书) 缘...


手把手|用Python端对端数据分析识别机器人“僵尸粉”

原文作者:Erin Shellman 导读:不仅微博,在twitter中也存在大批的“僵尸粉”。Twitter中的“僵尸粉”不仅能够在无人干...


Python vs R : 在机器学习和数据分析领域中的对比

为了鼓励新工具的出现,机器学习和数据分析领域似乎已经成了 “开源” 的天下。Python 和 R 语言都具有健全的生态...


如何拍出和明星一样美爆的自拍照?斯坦福大学用卷积神经网络建模告诉你

斯坦福大学Andrej Karpathy对自拍建模,用卷积神经网络研究自拍要领,发现了自拍的关键:1. 首先你得是女的,女性得...


Python语言在未来的发展前景

做了JAVA开发十年,也做过大大小小的项目,最近一两年做开发的被一门编程语言,也就是Python给刷屏了,在各个论坛...


python中理解字符串和编码为什么这么难

在学习python2的时候,字符串和编码可以说是最让人困惑的知识点,假如知其然而不知其所以然,则在后续的写代码和学习...


Python 分布式抓取和分析京东商城评价

互联网购物现在已经是非常普遍的购物方式,在互联网上购买商品并且使用之后,很多人都会回过头来对自己购买的...


设计爬虫Hawk背后的故事

文 | 沙漠之鹰 本文写于圣诞节北京下午慵懒的午后。本文偏技术向,不过应该大部分人能看懂。 五年之痒 2016年,能...


用Python玩玩OSMnx包获取道路数据并可视化分析

文 | 沈浩 沈浩老师 今天我们来玩玩街道道路数据的获取,简化和可视化分析。 今天每个人都离不开导航,除了开车...


python学习之路——python切片模拟LRU算法

问题描述:一进程刚获得三个主存块的使用权,若该进程访问页面的次序是1,2,3,4,1,2,5,1,2,3,4,5。当采...


Python爬虫,看看我最近博客都写了啥,带你制作高逼格的数据聚合云图

作者:方志朋 今天一时兴起,想用python爬爬自己的博客,通过数据聚合,制作高逼格的云图(对词汇出现频率视觉上的...


分布式计算开源框架Hadoop入门实践(二)

作者:岑文初 其实参看Hadoop官方文档已经能够很容易配置分布式框架运行环境了,不过这里既然写了就再多写一点,...