黑科技:利用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);

输出数据修改

用户喜欢...

使用 Micro Python 快速开发基于实时微控制器的应用程序

实时嵌入式系统变得非常复杂,不仅要深入了解复杂的 32 位微控制器,还要了解传感器、算法、因特网协议以及各种不同的终端用户应用。随着开发周期缩短和功能增多,开发团队需要设法加...


Python基础语法-常量与变量

Python是一门强类型的动态语言。 字面常量,变量没有类型,变量只是在特定的时间指向特定的对象而已,变量所指向的对象是有类型的。 变量:变量在赋值时被创建,它可以是任何对象的引...


Python Web 开发框架 Django 2.0 发布

流行 Python Web 开发框架 Django 释出了 2.0 版本。主要变化包括:停止支持 Python 2 系列,Django 1.11.x 是支持 Python 2.7 的最后版本,Django 2.0 支持 Python 3.4、3.5 和 3.6,其中 Python 3.4 将于 2019 年 3...


python的位置参数、默认参数、关键字参数、可变参数区别

一、位置参数 调用函数时根据函数定义的参数位置来传递参数。 #!/usr/bin/env python # coding=utf-8 def print_hello(name, sex): sex_dict = {1: u'先生', 2: u'女士'} print 'hello %s %s, welcome to python world!' %(name, sex...


Python并行处理

原文:Parallel Processing in Python  作者:Frank Hofmann  翻译:Diwei 简介 当你在机器上启动某个程序时,它只是在自己的“bubble”里面运行,这个气泡的作用就是用来将同一时刻运行的所有程序进...


Python开发者必备6个基本库

原文:6 essential libraries for every Python developer  作者:Serdar Yegulalp  翻译:Peter 译者注:无论你是想快速入手Python还是想为Python应用程序构建本地UI,亦或者对Python代码进行优化,本文列举的...


Python正则表达式的七个使用范例

作为一个概念而言,正则表达式对于Python来说并不是独有的。但是,Python中的正则表达式在实际使用过程中还是有一些细小的差别。 本文是一系列关于Python正则表达式文章的其中一部分。在...


Python的可视化工具概述

介绍 在Python世界中,有大量数据可视化的选项.因为各种各样,要知道什么时候使用哪个是非常困难的.本文包含一些较为流行的样例,并说明如果使用其创建简单的条形图.我会使用以下包/工具创...


Python中NumPy简介及使用举例

NumPy是Python语言的一个扩展包。支持多维数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy提供了与Matlab相似的功能与操作方式,因为两者皆为直译语言。 NumPy通常与SciPy(S...


Python是增长最快的主流编程语言

编程问答网站 Stackoverflow 的数据科学家 David Robinson 称,Python 是访问量增长最快的主流编程语言。在 Stackoverflow 上,主流编程语言如 Java、Javascript、C#、php 和 C++ 的问题访问量过去几年基本没...


python一些内置函数——filter、map、reduce

1.filter的用法 函数filter(function,list)提供一种优雅的方式过滤出列表中函数值返回为True的函数,函数filter(f,l)需要一个函数f作为第一个参数,f返回一个布尔值。举例如下: 2.map()函数的用法...


Python机器学习库scikit-learn实践

一、概述 机器学习算法在近几年大数据点燃的热火熏陶下已经变得被人所“熟知”,就算不懂得其中各算法理论,叫你喊上一两个著名算法的名字,你也能昂首挺胸脱口而出。当然了,算法...


Python语言下的机器学习库

Python是最好的编程语言之一,在科学计算中用途广泛:计算机视觉、人工智能、数学、天文等。它同样适用于机器学习也是意料之中的事。 当然,它也有些缺点;其中一个是工具和库过于分...


Python 的数学仙境之旅

作者:Aceyclee 数学中有很多有趣的东西都可以用代码来显示,这是一个 Python 集合,用代码把数学算法渲染成一幅幅美...


用Python做数据分析:Pandas常用数据查询语法

作者:大毛 在使用Pandas之前,大多数数据分析师已经掌握了Excel和SQL,并且在刚上手Pandas时会经常习惯性想到“老办...


数据分析你放在人人贷的钱都去了哪里?

作者:猫尾KUN 摘要:本文使用python抓取分析数据—人人贷,并从中获取贷款用户。 一、抓取准备      导入必要的...