[这是我若干年前的博文,准确性和专业程度都无法保证,请谨慎参考]
本程序完成手写数字(MNIST)识别
# coding=utf-8
"""
network.py
实现随机梯度下降学习的前馈神经网络算法,使用反向传播计算梯度。
"""
#### Libraries
# Standard library
import random
# Third-party libraries
import numpy as np
class Network(object): # 代码核心片段,Network类,用来表示一个神经网络
def __init__(self, sizes):
# __init__(self,sizes)函数为对Network类自身初始化程序
# 初始化一个Network对象的代码;sizes为一列表,包含各层神经元数量,
# 例如net = Network([2,3,1])为创建第一层2个神经元,第二层3个神经元,第三层一个神经元
self.num_layers = len(sizes) # len()返回列表元素个数,即网络的层数
self.sizes = sizes
# np为numpy库,np.random.randn()函数可以产生产生标准正态分布(均值0,标准差1)的随机数矩阵
# 下面的代码用来随机初始化偏置(biases)和权重(weights)
# sizes[1:]从第二层到最后一层,因为其从0开始索引,1表示网络第二层,网络第一层为输入层,无偏置
# 若第二层神经元个数为3,则y=3,biases[0]为网络第二层的所有偏置,以此类推
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
# 若
# x=[1,2,3]
# y=[4,5,6]
# zip(x,y)={(1,4),(2.5),(3.6)}
# >>> name=('jack','beginman','sony','pcky')
# >>> age=(2001,2003,2005,2000)
# >>> for a,n in zip(name,age):
# print a,n
#
# 输出:
# jack 2001
# beginman 2003
# sony 2005
# pcky 2000
# weights[1]存储着连接第二层和第三层神经元权重的矩阵,以此类推
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
def feedforward(self, a): # 给定网络输入a,返回网络输出a
"""Return the output of the network if ``a`` is input."""
for b, w in zip(self.biases, self.weights): # b,w为偏置与权重
a = sigmoid(np.dot(w, a)+b) # sigmoid函数代码后面定义,为激活函数
return a # 返回输出值
部分代码,剩下的之后有时间更新,有错误欢迎指出。