close
当前位置: 物联网在线 > IT技术 > 大数据 >

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

输出数据修改

you might also like

  • 我的Kaggle初体验 Grupo Bimbo Inventory Demand
  • Python高级编程技巧
  • Python性能优化的20条建议
  • Python: scikit-image 彩色图像滤波
  • Python语言编写BP神经网络
  • Python的一些画图函数
  • python常用框架及第三方库
  • 【干货】Kaggle 数据挖掘比赛经验分享
  • 【Python】爬虫+ K-means 聚类分析电影海报主色
  • 基于亚马逊云计算服务(AWS)的大数据部署操作指南

  • (责任编辑:ioter)