模式识别-神经网络-知识总结与作业(python版)

机器学习 专栏收录该内容
9 篇文章 0 订阅

神经网络(多层感知器)原理

神经网络(neural network)也即多层感知器 multi-layer-perceptron(MLP)指的是通过构造不同结构神经元结构进行前向传播并根据任务设计一定的损失函数进行反向传播,最终获得的模型

预备知识

神经元:
在这里插入图片描述
O j = f ( ∑ i n ω j x j + b ) O_j = f(\sum_i^n\omega_jx_j+b) Oj=f(inωjxj+b)
其中f为激活函数, w j w_j wj为第j个输入对应的权重,b为偏置

激活函数 activate function:
激活函数的作用简单概括为:非线性化。从神经元的结构特点可以看到,神经元的输出是将输入和偏置进行线性组合,如果不进行非线性化处理,则不论多么复杂的神经网络的效果都是 y = w T x y = w^Tx y=wTx,因此需要对每一个神经元节点进行非线性化处理,而这种处理用到的即为激活函数。常见的激活函数包括以下:
sigmoid函数
y = 1 1 + e − x y = \frac{1}{1+e^{-x}} y=1+ex1
relu函数
y = m a x ( 0 , x ) y = max(0,x) y=max(0,x)
tanh函数
y = e x − e − x e x + e − x y = \frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} y=ex+exexex

损失函数 loss function:
损失函数运用在反向传播的过程中,模型通过计算损失函数结合最优化方法寻找最优的模型参数,即神经元中的权重与偏置。损失函数可以简单理解为预测值与真实值的差距,模型性能越好,则损失函数应当越低。
常见的损失函数:
均方误差函数
l o s s = 1 N 1 2 ∑ n ( y − y ^ ) 2 loss =\frac{1}{N} \frac{1}{2}\sum^n(y-\hat{y})^2 loss=N121n(yy^)2
交叉熵损失函数
l o s s = 1 N ∑ − y i c l o g ( p i c ) loss = \frac{1}{N}\sum-y_{ic}log(p_{ic}) loss=N1yiclog(pic)
c代表类别,当该 y i c y_{ic} yic与真实类别相等时值为1,否则为0, p i c p_{ic} pic代表为预测为第c类的概率,可由交叉熵函数求得。

反向传播:
反向传播即利用损失函数通过链式求导法则,求得各参数的梯度,并通过梯度下降法对该参数进行更新。 w n e w = w − l r ∗ ∂ l o s s ∂ w w_{new} = w -lr*\frac{\partial{loss}}{\partial{w}} wnew=wlrwloss
具体实现方法见下方python实现

python实现

尝试实现三层的BP神经网络类

class My_bp_network():
    def __init__(self, input_num, hidden_layer, output_num):
        '''
        input

        input_num :输入维度
        hidden_layer :隐藏层节点数
        output_num :输出维度
        
        '''
        self.hidden_layer = hidden_layer
        self.input_num = input_num
        self.output_num = output_num
        self.weight1 = np.random.uniform(-1,1,(self.hidden_layer,self.input_num))
        self.bias1 = np.zeros((1, self.hidden_layer))
        self.weight2 = np.random.uniform(-1,1,(self.output_num,self.hidden_layer))
        self.bias2 = np.zeros((1,1))
    def sigmoid(self,x):
        y = 1/(1+np.exp(-x))
        return y
    def forward(self,x):
        '''
        x : (m*1) m 为特征数
        '''
        self.input = x
        self.hidden_layer_out = np.dot(self.weight1,x) + self.bias1 # 隐藏层
        self.hidden_layer_out = self.sigmoid(self.hidden_layer_out) # 激活函数
        # print(hidden_layer_out)
        self.final_layer_out = np.dot(self.weight2,self.hidden_layer_out.T) + self.bias2 # 输出层
        # print(final_layer_out)
        output = self.sigmoid(self.final_layer_out)
        return output
    def backward(self, lr, yhat, y):
        '''
        lr :学习率
        yhat : 前向传播输出
        y :实际标签
        '''
        dLdy = -(y-yhat) # loss对yhat求导
        dydxfinal = yhat*(1-yhat) # yhat对 sum(w(2)x) 求导 yhat = sigmoid(xfinal) 
        dLdxfinal = dLdy * dydxfinal # loss 对 sum(w(2)x) 求导 
        # print('loss对输出层wx的和的梯度',dLdxfinal)
        self.bias2 -= lr*dLdxfinal # sum(w(2)x)对b求导 
        for i in range(self.hidden_layer): # 隐藏层从上到下梯度下降
            dxfinaldwi = self.hidden_layer_out[0][i] # sum(w(2)x)对w(2)i求导
            dxfinaldxi = self.weight2[0][i] # sum(w(2)x)对xi求导
            self.weight2[0][i] -= lr * dLdxfinal * dxfinaldwi # loss对w(2)i求导
            dxidhiddenout = self.hidden_layer_out[0][i]*(1-self.hidden_layer_out[0][i])
            self.bias1[0][i] -= lr * dLdxfinal * dxfinaldxi * dxidhiddenout
            for j in range(self.input_num): # 输入层从上到下梯度下降
                dhiddenoutdwij = self.input[j]
                # print(dxfinaldhiddenout*dhiddenoutdwij)
                self.weight1[i][j] -= lr*dLdxfinal * dxfinaldxi * dxidhiddenout * dhiddenoutdwij
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值