多层感知器
前言
本博文主要介绍一下多层感知器的结构,并且用代码实现网络结构的初始化。随笔而已,写的比较粗躁。
模型结构
很简单吧,模型图上的每一根线就是一个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的矩阵。
综上所述
初始化我们需要3个W向量,两个b向量。
初始化代码
# -*- coding: utf-8 -*- # @Time : 2017/11/22 下午9:17 # @Author : SkullFang # @Email : # @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.0], [-0.0]]), array([[-0.]])] """ #初始化权重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., -0., 0.], [ 0., 0., 0.]]), array([[ 0., -0.]])] """ #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
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177191.html原文链接:https://javaforall.net
