Google实验室的Corinna Cortes和纽约大学柯朗研究所的Yann LeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。
模型
对数回归模型是线性概率分类器,它有两个参数,权重矩阵W和偏移向量b.分类的过程是把数据投影到一组高维超平面上,数据和平面的距离反应了它属于这个类别的概率。这个模型的数学公式可以表示为:
#
模型的输出即为预测的结果,它的值为:
代码如下:
原例子中的mnist.pkl.gz是压缩后的数据族,为了能够便于C++直接处理,我们首先把mnist.pkl.gz改成易于处理的数据-结果对,即:将mnist.pkl解压为6个文件:
train_set_x, train_set_y
valid_set_x, valid_set_y
test_set_x, test_set_y
对应train,valid,test三个集合(每个集合两对,即数据-结果对)。
train_set_x中的784列对应train_set_y中的一行,即代表一个测试数据集合。其中train_set_x每一行是一个浮点数,784行(784为28x28的灰度浮点数 )代表一个数字的灰度图,对应train_set_y的一行,即对应的数字。
这个python程序如下,很简单,写成文本文件好了,然后再写一个C++程序读这个文本文件,转成相关的 二进制文件。
我的python版本是2.7,所以与3.X版本的语法上有区别,要注意:
# -*- coding: utf-8 -*-
"""
Spyder Editor
This temporary script file is located here:
C:\Users\asus\.spyder2\.temp.py
"""
import pickle
f = open(r'e:\mnist.pkl', 'rb')
#write_file=open(r'e:\ab.txt','wb')
train_set,valid_set, test_set = pickle.load(f)
f.close()
test_set_x, test_set_y = test_set
train_set_x, train_set_y = train_set
valid_set_x, valid_set_y = valid_set
cnt = 0
fileHandle=open(r'e:\test_set_x.txt',"w")
for i in test_set_x:
if cnt% 10 ==0:
print cnt
print 'test_x'
cnt= cnt +1
for j in i:
fileHandle.write("%.6f\n"%j)
fileHandle.close()
cnt = 0
fileHandle=open(r'e:\test_set_y.txt',"w")
for i in test_set_y:
if cnt% 10 ==0:
print cnt
print 'test_y'
cnt= cnt +1
fileHandle.write("%d\n"%i)
fileHandle=open(r'e:\train_set_x.txt',"w")
cnt=0
for i in train_set_x:
if cnt% 10 ==0:
print cnt
print 'train_x'
cnt= cnt +1
for j in i:
fileHandle.write("%.6f\n"%j)
fileHandle.close()
fileHandle=open(r'e:\train_set_y.txt',"w")
cnt=0
for i in train_set_y:
if cnt% 10 ==0:
print cnt
print 'train_y'
cnt= cnt +1
fileHandle.write("%d\n"%i)