您的位置:首页 > 理论基础 > 计算机网络

Python神经网络代码识别手写字的实现流程(一):加载mnist数据

2017-11-03 11:28 911 查看
任何的神经网络代码,加载数据都是第一步.加载数据的流程其实就是给神将网络的输入层输入数据的流程.

(1)首先介绍python中的gzip模块:gzip模块就是将压缩的数据解压,然后返回一个文件对象.

介绍python3中的pickle模块(该模块在python2中为cPickle).pickle模块的主要功能是将对象以文件的形式存在磁盘上,这句话看似拗口,但是理解了例子以后可以慢慢的理解.

函数:pickle.dump(obj, file, [,protocol])

将对象obj存到文件file中.

函数:pickle.load(file)

从file中读取一个字符串,并将它重构为原来的python对象。

(2)神经网络中我们使用的数据集为mnist.pkl.gz,是一个压缩文件.因此使用数据集时我们需要将该数据集解压,取出数据集中的数据.

if os.path.exists('/ysk/code/python/neural-networks-and-deep-learning/data/mnist.pkl.gz')
f = gzip.open('/ysk/code/python/neural-networks-and-deep-learning/data/mnist.pkl.gz', 'rb')
else:
print("file not exits!")


上面为判断数据集是否存在,如果存在就打开该数据集,返回文件对象.

training_data, validation_data, test_data = pickle.load(f, encoding = "iso-8859-1")


上面代码是加载文件对象,返回三个数据集.这三个数据集的形式如下:



也就是说返回的三个数据集为三个元组,其中的训练集training_data为50000*784和50000*1的数据构成.我们知道,识别手写字的神经网络代码的输入单元为784个,如果想要向量话处理数据集的话,我们输入的矩阵应该是784*50000形式.那么需要将输入的数据进行改造:

training_inputs = [np.reshape(x, (784, 1)) for x in trainging_data[0]]


上述代码中,遍历训练集中的每一行,将其重新改造为784*1的列矩阵,这样的training_data就是一个数组,数组的每个元素为一个784*1的列矩阵.



训练集元组的第二个元素为50000*1的列矩阵.因为输层的单元为10,10个输出单元代表的为:判断出的为第几个就把第几个单元置为1,其余的单元则为0.因此对于这个50000*1的列矩阵也需要将其改造,改造为10*50000的矩阵.

def vectorized_result(j):
e = np.zeros((10, 1))
e[j] = 1.0
return e
training_results = [vectorized_result(y) for y in training_data[1]]


最后,还需要将训练集再次组合到一起:

training_data = zip(training_inputs, training_results)


以上方法形成的数据集就可以用来训练数据.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 神经网络
相关文章推荐