【其他】《神经网络与深度学习》(Michael Nielsen)1.6节完整程序解析

[这是我若干年前的博文,准确性和专业程度都无法保证,请谨慎参考]

本程序完成手写数字(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  # 返回输出值

部分代码,剩下的之后有时间更新,有错误欢迎指出。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengWoods

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值