《neuralnetworksanddeeplearning》笔记(更新中)

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_layersbiasesweights是函数内部定义的量。

列表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神经元的输出的等式的结果相同。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值