深度學習-多層感知器

多層感知器

多層感知器(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   : [email protected]
# @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
發佈了47 篇原創文章 · 獲贊 80 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章