neuralnetworksanddeeplearning笔记(更新中)
——用神经网络来分类数字
一、电子书链接
英文版(原版):http://neuralnetworksanddeeplearning.com/chap1.html#exercises_191892
中文版:https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap1/c1s6.html
声明:文中的一些知识点/例子来源于菜鸟教程/大佬博客,如有冒犯,联系必删。
二、初始化Network
类
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:])]
1. Network(object)
形如 class a(object)为新式类, class a为旧式类;
在python 2.x中,新式类比旧式类多继承了object对象,
在python 3.x中默认加载了object,两者没有区别。
2. 变量
num_layers
、biases
、weights
是函数内部定义的量。
列表sizes
包含各层的神经元的数量
3. sizes[1:]
sizes[1:]
列表切片
举例:
>>>a=[1,2,3,4,5]
>>>print(a[1:])
>>>print(a[:-1])
[2, 3, 4, 5]
[2, 3, 4]
在python中,下标也是从0开始算的。
4. numpy.random.randn(y, 1)
生成均值为0,标准差为1的高斯分布。
举例1:
>>>numpy.random.randn(2,4)
array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],
[-1.16724625, -0.22408299, 0.63006614, -0.41714538]])
其生成了一个两行四列的向量。
举例2:
import numpy as np
sizes = [2, 3, 1]
biases = [np.random.randn(y, 1) for y in sizes[1:]]
print(biases)
[array([[-0.8535032 ],
[-0.74216439],
[ 0.61651906]]), array([[-0.96803519]])]
相当于每个神经元都随机初始化一个偏差。
5. zip()
函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
举例1:
>>> a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
举例2:
import numpy as np
sizes = [2, 3, 1]
weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
print(weights)
[array([[ 0.02337042, -1.47809228],
[ 0.60868482, -0.20790232],
[ 0.19381549, -0.36265778]]), array([[-0.73570062, 0.70202927, -1.05209619]])]
相当于上一层的每一个神经元对下一层的每一个神经元有一个随机初始化的权重。
(还是有点不理解)
6. 理解说明
“
net.weights[1]
是一个存储着连接第二层和第三层神经元权重的Numpy矩阵。(不是第一层和第二层,因为Python列中的索引从0开始。)用net.weights[1]
表示矩阵w。矩阵中的wjk是连接第二层的神经元k和第三层的神经元j的权重。”
举例:
import numpy as np
sizes = [2, 3, 1]
weights = [np.random.randn(y, x) for x, y in zip(sizes[:-1], sizes[1:])]
print(weights[0])
[[ 1.00405116 0.64695472]
[-1.23866707 -0.54548359]
[-1.17115891 -0.44183986]]
选取weights[0]表示连接第一层和第二层神经元权重的矩阵,
w12表示第一层的第2个神经元与第二层的第1个神经元之间的权重。
使用这种顺序的意义:
第三层神经元的激活向量是
a
′
=
σ
(
w
a
+
b
)
.
a′=σ(wa+b).
a′=σ(wa+b).
a:第二层神经元的激活向量 w:权重矩阵 b:偏差向量 σ:一个函数
得到的结果与一个sigmoid神经元的输出的等式的结果相同。