文章目录

  • 1.BP神经网络基本原理
  • 2.一个三层BP网络
  • 3.编码一个神经元
  • 4.把神经元组装成网络
  • 5.编码神经网络前馈
  • 6.定义损失函数-MSE及代码
  • 7.最小化神经网络损失-反向传播
  • 8.随机梯度下降
  • 9.完整神经网络

参考: 使用python从头实现BP神经网络

1.BP神经网络基本原理

利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。

2.一个三层BP网络

3.编码一个神经元

利用python的Numpy库来完成其中数学运算

import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))class Neuron:def __init__(self,weights,bias):'''所有参数初始化:param weights:权重:param bias: 偏置'''self.weights = weightsself.bias = biasdef feedforward(self,input):'''前馈过程:给定输入得到输出的过程:param input::return: output'''total = np.dot(self.weights,input) + self.biasreturn sigmoid(total)if __name__ == '__main__':weihts = np.array([0,1])bias = 4neuron = Neuron(weihts,bias)x = np.array([2,3])             # 输入print(neuron.feedforward(x))    # 0.9990889488055994

4.把神经元组装成网络

5.编码神经网络前馈


import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))class Neuron:def __init__(self,weights,bias):'''所有参数初始化:param weights:权重:param bias: 偏置'''self.weights = weightsself.bias = biasdef feedforward(self,input):'''前馈过程:给定输入得到输出的过程:param input::return: output'''# np.dot(a,b):如果a和b是一维数组,那么返回的就是向量的内积#             如果a和b都是二维数组,那么它返回的就是矩阵乘法total = np.dot(self.weights,input) + self.biasreturn sigmoid(total)class OurNeuralNetwork:'''A neural network with:- 2 inputs- a hidden layer with 2 neurons (h1, h2)- an output layer with 1 neuron (o1)Each neuron has the same weights and bias:- w = [0, 1]- b = 0'''def __init__(self):weights = np.array([0,1])bias = 0self.h1 = Neuron(weights,bias)self.h2 = Neuron(weights,bias)self.o1 = Neuron(weights,bias)def feedforward(self,x):out_h1 = self.h1.feedforward(x)out_h2 = self.h2.feedforward(x)# the inputs for o1 are the outputs from h1 and h2out_o1 = self.o1.feedforward(np.array([out_h1,out_h2]))return out_o1if __name__ == '__main__':outnetwork = OurNeuralNetwork()x = np.array([2,3])print(outnetwork.feedforward(x))            # 0.7216325609518421

6.定义损失函数-MSE及代码


在训练网络之前,我们需要量化当前的网络是『好』还是『坏』,从而可以寻找更好的网络。这就是定义损失的目的。

我们在这里用平均方差(MSE)损失:

让我们仔细看看:

n是样品数,这里等于4(Alice、Bob、Charlie和Diana)。
y表示要预测的变量,这里是性别。
y_{true} 是变量的真实值(『正确答案』)。例如,Alice的 y_{true} 就是1(男性)。
y_{pred} 是变量的预测值。这就是我们网络的输出。
(y_{true}-y_{pred})^2 被称为方差(squared error)。我们的损失函数就是所有方差的平均值。预测效果越好,损失就越少。

更好的预测 = 更少的损失!

训练网络 = 最小化它的损失

import numpy as npdef mse_loss(y_true,y_pred):# y_true and y_pred are numpy arrays of the same lengthreturn ((y_true - y_pred) ** 2).mean()y_true = np.array([1,0,0,1])
y_pred = np.array([0,0,0,0])print(mse_loss(y_true,y_pred))          # 0.5

7.最小化神经网络损失-反向传播





8.随机梯度下降

9.完整神经网络

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: 完整神经网络.py
@time: 2020/11/10 10:56
"""
import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))def deriv_sigmoid(x):# sigmoid求导fx = sigmoid(x)return fx * (1-fx)def mse_loss(y_true,y_pred):# y_true and y_pred are numpy arrays of the same lengthreturn ((y_true - y_pred) ** 2).mean()class OurNeuralNetwork:'''A neural network with:- 2 inputs- a hidden layer with 2 neurons (h1, h2)- an output layer with 1 neuron (o1)*** DISCLAIMER ***:The code below is intended to be simple and educational, NOT optimal.Real neural net code looks nothing like this. DO NOT use this code.Instead, read/run it to understand how this specific network works.'''def __init__(self):'''将weights、bias初始化'''# weightsself.w1 = np.random.normal()self.w2 = np.random.normal()self.w3 = np.random.normal()self.w4 = np.random.normal()self.w5 = np.random.normal()self.w6 = np.random.normal()# biasself.b1 = np.random.normal()self.b2 = np.random.normal()self.b3 = np.random.normal()def feedforward(self,x):# x is a numpy array with 2 elementsh1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)return o1def train(self,data,all_y_trues):'''- data is a (n x 2) numpy array, n = # of samples in the dataset.- all_y_trues is a numpy array with n elements.Elements in all_y_trues correspond to those in data.'''learn_rate = 0.1epochs = 1000for epoch in range(epochs):for x,y_true in zip(data,all_y_trues):# feedforwardsum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1h1 = sigmoid(sum_h1)sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2h2 = sigmoid(sum_h2)sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3o1 = sigmoid(sum_o1)y_pred = o1# calculate partial derivativesd_L_d_ypred = -2 * (y_true - y_pred)# Neuron o1d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)d_ypred_d_b3 = deriv_sigmoid(sum_o1)d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)# Neuron h1d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)d_h1_d_b1 = deriv_sigmoid(sum_h1)# Neuron h2d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)d_h2_d_b2 = deriv_sigmoid(sum_h2)# --- Update weights and biases# Neuron h1self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1# Neuron h2self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2# Neuron o1self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3# --- Calculate total loss at the end of each epochif epoch % 10 == 0:y_preds = np.apply_along_axis(self.feedforward, 1, data)loss = mse_loss(all_y_trues, y_preds)print("Epoch %d loss: %.3f" % (epoch, loss))if __name__ == '__main__':# Define datasetdata = np.array([[-2, -1],  # Alice[25, 6],  # Bob[17, 4],  # Charlie[-15, -6],  # Diana])all_y_trues = np.array([1,  # Alice0,  # Bob0,  # Charlie1,  # Diana])# Train our neural network!network = OurNeuralNetwork()network.train(data, all_y_trues)# test# Make some predictionsemily = np.array([-7, -3])  # 128 pounds, 63 inchesfrank = np.array([20, 2])  # 155 pounds, 68 inchesprint("Emily: %.3f" % network.feedforward(emily))  # 0.951 - Fprint("Frank: %.3f" % network.feedforward(frank))  # 0.039 - M
搞定了一个简单的神经网络,快速回顾一下:介绍了神经网络的基本结构——神经元;
在神经元中使用S型激活函数;
神经网络就是连接在一起的神经元;
构建了一个数据集,输入(或特征)是体重和身高,输出(或标签)是性别;
学习了损失函数和均方差损失;
训练网络就是最小化其损失;
用反向传播方法计算偏导;
用随机梯度下降法训练网络;
接下来你还可以:用机器学习库实现更大更好的神经网络,例如TensorFlow、Keras和PyTorch;
在浏览器中实现神经网络;
其他类型的激活函数;
其他类型的优化器;
学习卷积神经网络,这给计算机视觉领域带来了革命;
学习递归神经网络,常用语自然语言处理;

深度学习2.0-神经网络相关推荐

  1. 【深度学习】卷积神经网络速成

    [深度学习]卷积神经网络速成 文章目录 [深度学习]卷积神经网络速成 1 概述 2 组成 2.1 卷积层 2.2 池化层 2.3 全连接层 3 一个案例 4 详细分析 1 概述 前馈神经网络(feed ...

  2. 谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析

     谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络.CV.NLP 难点解析 [日期:2016-12-16] 来源:新智元  作者: [字体:大 中 小]  11月22日,谷歌在蒙特利尔的 ...

  3. CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录

    CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录 目录 视频请观看 训练输出记录 视频请观看 深度学习之计算机视觉神经网络训练Yolov3-5c ...

  4. CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录

    CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录 目录 训练全部流程记录 训练全部流程记录 1.采用tiny-yolo-5clessses训练 ...

  5. 深度学习之循环神经网络(12)预训练的词向量

    深度学习之循环神经网络(12)预训练的词向量  在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...

  6. 深度学习之循环神经网络(11-b)GRU情感分类问题代码

    深度学习之循环神经网络(11-b)GRU情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorfl ...

  7. 深度学习之循环神经网络(11-a)LSTM情感分类问题代码

    深度学习之循环神经网络(11-a)LSTM情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorf ...

  8. 深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战

    深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战 1. LSTM模型 2. GRU模型  前面我们介绍了情感分类问题,并利用SimpleRNN模型完成了情感分类问题的实战,在介绍完更为强 ...

  9. 深度学习之循环神经网络(10)GRU简介

    深度学习之循环神经网络(10)GRU简介 1. 复位门 2. 更新门 3. GRU使用方法  LSTM具有更长的记忆能力,在大部分序列任务上面都取得了比基础RNN模型更好的性能表现,更重要的是,LST ...

  10. 深度学习之循环神经网络(9)LSTM层使用方法

    深度学习之循环神经网络(9)LSTM层使用方法 1. LSTMCell 2. LSTM层  在TensorFlow中,同样有两种方式实现LSTM网络.既可以使用LSTMCell来手动完成时间戳上面的循 ...

最新文章

  1. 【Leetcode】刷题之路4(python版)
  2. HEOI2017游记
  3. 怎样下载C/C++的免费、开源且跨平台IDE——Code::Blocks
  4. Web程序员的Mysql进阶序二之sql多条数据插入、多条数据更新、多表同时查询
  5. 安装Hbase(分布式)遇到一些问题及解决方法
  6. thikphp 控制器
  7. 以眼睛的名义:一些光度学概念的解析
  8. 多个Excel合并为一个Excel表
  9. webex无法用计算机呼叫,CiscoWebExMeetingsServer疑难解答指引.PDF
  10. C语言 输出乘法口诀表
  11. R语言Tukey检验进行事后检验(post hoc)实战:单因素方差分析告诉我们并不是所有的群体手段的效果是均等的,确切地找出哪些组彼此不同使用Tukey检验
  12. Java类属性字段校验(validation的使用)
  13. 火车采集器html规则,火车头采集器代码过滤方法
  14. 解放生产力!20 个必知必会 VSCode 小技巧
  15. JAVA儿童接种系统计算机毕业设计Mybatis+系统+数据库+调试部署
  16. 去除水印PNAS-latex
  17. 三角网导线平差实例_三角网近似平差及边长计算表
  18. 支持手机,滑动拖动验证
  19. 退出码 -1073740791 (0xC0000409)
  20. 观《源代码》(电影)有感

热门文章

  1. 在mysql中存储生日,php中计算今天是否为用户生日
  2. CSDN博客搬家到WordPress
  3. Neuron:Neural activities in V1 create a bottom-up saliency map
  4. J2EE DAO模式解析(二)
  5. JSONSerializer把类转换成JSON字符串
  6. 0003-img标签-前端学习笔记
  7. novell.directory.ldap获取邮箱活动目录
  8. 基于朴素贝叶斯的定位算法
  9. NonComVisibleBaseClass Exception
  10. 移动硬盘主分区格式化后,逻辑分区找不到的解决方法