- 该系列是笔者在机器学习深度学习系列课程学习过程中记录的笔记,简单粗暴,仅供参考。
- 下面的算法代码来自https://github.com/mnielsen/neural-networks-and-deep-learning
- 再次强调,代码不是笔者自己写的,是从上面的链接下载的!
实现一个手写数字识别的算法
1.训练数据
MNIST数据集:
训练集(train):50000——用于训练
验证集(validation):10000——用于训练中的自测
测试集(test):10000——用于测试
2.神经网络初始化
class Network(object):
def __init__(self, sizes):
self.num_layers = len(sizes)
self.sizes = sizes
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
解释:
init:只要实例化一个类,总要运行init,python的构造函数, 类似于Java里面类的构造函数。
self:索引到当前类,类似于java中的this
sizes:神经元有几层及每层个数,eg:net=Network([ 2, 3, 1])#第一层2个神经元,第二层3个,第三层1个
num_layers=len(sizes):神经网络层数
biases:偏移量初始化,0~1之间随机选取,一个神经元需要一个biases
weights:权重初始化,0~1之间随机选取,一个箭头对应一个权重
random:随机
为了便于理解此处单独运行如下代码:
sizes=[2,3,1]
bias=[np.random.randn(y, 1) for y in sizes[1:]]
print(bias)
运行结果:返回两个list,一个3×1和一个1×1的list。//np.random.randn(y, 1)可以理解为返回一个 y 行 1列 的list,list的值采用高斯分布随机赋值
[array([[-0.2310922 ],
[-0.33350782],
[ 0.88558646]]), array([[ 1.51042319]])]
Process finished with exit code 0
sizes[1:]:就是size中除了第一个数外的,后面所有的数
sizes[:-1]:就是size中除了最后一个数外的,前面所有的数
x, y in zip(sizes[:-1], sizes[1:])]:x,y分别取zip中的两个值,
net.weights[1]:存储连接第二层和第三层间的权重
- 以下图为例,初始化一个如下图那样的神经网络,运行一下开头那部分代码:
import numpy as np
class Network(object):
def __init__(self, sizes):
self.num_layers = len(sizes)
self.sizes = sizes
self.biases = [np.random.randn(y, 1) for y in sizes[1:]]
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])]
net = Network([2,3,1])
print(net.num_layers)
print(net.sizes)
print("偏移量:")
print(net.biases)
print("权重:")
print(net.weights)
运行结果:
3
[2, 3, 1]
偏移量:
[array([[ 0.72072723],
[ 1.02129651],
[ 0.0451003 ]]), array([[ 0.89568534]])]
权重:
[array([[ 0.35048635, 1.582825 ],
[-0.6184383 , 1.03039687],
[-1.22620262, -0.48511089]]), array([[ 1.51702976, -0.59924277, 0.07869854]])]
Process finished with exit code 0
3.前向传播