书本里的代码是python2.7的,所以我建议大家学习的时候都是安装Python2.7来进行实验。如果非要用python3.4的话,我这里把我做的修改,做个参考:
首先是python3.4里面没有cPickle了,所以首先在mnist_loader.py里面要把:
import cPickle
改为:
import pickle as cPickle
并且,用法也稍微有点不同:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)报这个错的时候,要改成:
training_data, validation_data, test_data = pickle.load(f, encoding='bytes'),参考这篇博客。
其次,因为在python2里面,map、zip等都返回的是list,所以可以用len()函数,但是现在map和zip都是返回一个对象。
#python2
>>> a = zip((1, 2), (3, 4))
>>> a
[(1, 2), (3, 4)]
# 可以看到这里返回的是一个list
#python3
>>> a = zip((1, 2), (3, 4))
>>> a
<zip object at 0x1007096c8>
所以在所有报object of type 'zip' has no len()地方的时候,都可能需要改成len(list(xxx))。
再次,所有的xrange在python3里都是无效的,要改成range。
最后,即使你改了前面所有的东西………………也不一定能成功跑起来。
我折腾了半天,最后还是决定在自己的阿里云平台上跑,因为上面是python2.7
在上面弄的话,步骤就简单多了,我们以第一个手写输入为例:
首先安装numpy 与scipy
yum -y install gcc gcc-c++ numpy python-devel scipy
然后gitclone代码:
git clone https://github.com/mnielsen/neural-networks-and-deep-learning.git
import mnist_loader #包含加载数据的python代码
import network #包含network类
training_data, validation_data, test_data = mnist_loader.load_data_wrapper() #加载数据:训练集、交叉验证集、测试集
net = network.Network([784, 30, 10]) #创建三层神经网络,神经元个数分别为784,30,10</span>
net.SGD(training_data, 30, 10, 3.0, test_data=test_data) #训练迭代次数=30, 用于随机梯度下降法的最小样本数=10(mini-batch-size),学习速率=3.0
因为每个人可能的初始权重和偏置是可能不同的,所以开始的过程每个人的结果可能不同。
但是最后一般都能够达到94%以上。
Epoch 29: 9453 / 10000
经过这一节的学习,我觉得我们可以先不看代码,把概念先过一遍,像我这样在环境配置上和代码上纠缠很浪费时间。建议大家不要学我。