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′=σ(wa+b).
a′=σ(wa+b).
a′=σ(wa+b).
a:第二层神经元的激活向量 w:权重矩阵 b:偏差向量 σ:一个函数
得到的结果与一个sigmoid神经元的输出的等式的结果相同。

本文深入解析神经网络在数字分类中的应用,通过初始化Network类,详细介绍了如何设置神经元数量、生成随机权重和偏置,以及如何利用numpy进行矩阵运算。文章提供了丰富的代码示例和解释,适合初学者入门神经网络和深度学习。
674

被折叠的 条评论
为什么被折叠?



