深度学习-多层感知器

多层感知器

多层感知器(Multilayer Perceptron,缩写MLP)是一种前向结构的人工神经网络,映射一组输入向量到一组输出向量。MLP可以被看作是一个有向图,由多个的节点层所组成,每一层都全连接到下一层。除了输入节点,每个节点都是一个带有非线性激活函数的神经元(或称处理单元)。一种被称为反向传播算法的监督学习方法常被用来训练MLP。 MLP是感知器的推广,克服了感知器不能对线性不可分数据进行识别的弱点。
摘自:维基百科
https://zh.wikipedia.org/wiki/%E5%A4%9A%E5%B1%82%E6%84%9F%E7%9F%A5%E5%99%A8

前言

本博文主要介绍一下多层感知器的结构,并且用代码实现网络结构的初始化。随笔而已,写的比较粗躁。

模型结构

在之前的博文中说过一个感知器。其可以看作是一个单个的神经元。这次的多层感知器其实是对其的一个衍生和发展。
首先一个最简单的MPL
这里写图片描述
其中输入向量为x。产生的刺激为z=wx+b
w为权重向量
b就是偏置(网上把偏置说的很悬其实就是这玩意)
激活函数使用最简单的sigmod函数(其实可以为很多)
这是函数图像
enter image description here

很简单吧,模型图上的每一根线就是一个z=wx+b 所以图上需要两个w向量,两个b向量。(数数问题)

稍微复杂一点
这里写图片描述

注意:一般神经网络中的输入层是不算的。再就是一个神经元输出只有一个实数。所以我们可以把输入层看成是一个 X 向量。(不是一个神经元能产生一个X向量,一个神经元只能产生一个x1)
如图:输入层为三个我们可以看作x1,x2,x3 组成X向量。
产生的“刺激”:w1X+b1。经过刺激函数转换成y1 (输入层—>隐藏层).
同样产生“刺激” w2X+b1。经过刺激函数转换为y2
所以我们可以得到下面结论:
w1、w2是一个3*1的矩阵。
b1是一个2*1的矩阵。

同理:
“刺激“ w3Y+b2 得到最后结果Z(隐藏层->输出层)
w3是一个2*1的矩阵
b2是一个1*1的矩阵

综上所述
初始化我们需要3个W向量,两个b向量。

初始化代码

# -*- coding: utf-8 -*-
# @Time    : 2017/11/22 下午9:17
# @Author  : SkullFang
# @Email   : yzhang.private@gmail.com
# @File    : OneDemo.py
# @Software: PyCharm
import numpy as np
class Network(object):
    def __init__(self,sizes):
        """
        sizes表示 网络的结构
        sizes=[3,2,1]
        输入层为3,隐藏层为2,输出层为1
        :param sizes: 
        """
        #网络层数
        self.num_layers=len(sizes) #层数
        #神经元的个数
        self.sizes=sizes
        #初始化每一层的偏置 z=wx+b 就是b的值
        self.baises=[np.random.randn(y,1) for y in sizes[1:]]
        #等同与
        """
        baises=[]
        #意思就是生成一个符合正态分布的 y*1的数组
        for y in sizes[1:]:
            biases.append(np.random.randn(y, 1))
        结果
        [array([[ 1.05154644],
       [-0.02986238]]), array([[-0.88098138]])]

        """

        #初始化权重W
        self.weights=[np.random.randn(y,x) for x,y in zip(sizes[:-1],sizes[1:])]
        #等同与
        """
        产生一个y*x 符合正态的
        weights=[]
        for x,y in zip(sizes[:-1],sizes[1:]):
            weights.appenf(np.random.randn(y,x))
        pass
        >>> weights
        [array([[-0.22826557, -0.54427902,  0.19502928],
       [ 0.21433594,  0.72849057,  0.12851307]]), array([[ 0.27181857, -0.55032853]])]

        """



#sigmoid
def sigmoid(z):
    """
    激活函数
    :param z: 
    :return:
    sigmoid(z)=1/(1+e^-z)
    """
    return 1.0/(1.0+np.exp(-z))

#创建网络
net=Network([3,2,1])
print net.num_layers
print net.sizes
print net.baises
print net.weights
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值