BP 算法是一个迭代算法,它的基本思想为:(1) 先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);(2) 计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);(3) 更新参数(目标是误差变小),迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。
下面用图片的形式展示其推到过程

数据集:数据集采用Sort_1000pics数据集。数据集包含1000张图片,总共分为10类。分别是人(0),沙滩(1),建筑(2),大卡车(3),恐龙(4),大象(5),花朵(6),马(7),山峰(8),食品(9)十类,每类100张,(数据集可以到网上下载)。注意网上下载的数据集是一个整体,需要自己手动将图片进行整理分类,方便python进行读取操作,参考和参考进行数据集处理。

import datetime
starttime = datetime.datetime.now()import numpy as np
from sklearn.cross_validation import train_test_split
from sklearn.metrics import confusion_matrix, classification_report
import os
import cv2X = []
Y = []for i in range(0, 10):#遍历文件夹,读取图片for f in os.listdir("./photo/%s" % i):#打开一张图片并灰度化Images = cv2.imread("./photo/%s/%s" % (i, f)) image=cv2.resize(Images,(256,256),interpolation=cv2.INTER_CUBIC)hist = cv2.calcHist([image], [0,1], None, [256,256], [0.0,255.0,0.0,255.0]) X.append((hist/255).flatten())Y.append(i)
X = np.array(X)
Y = np.array(Y)
#切分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=1)from sklearn.preprocessing import LabelBinarizer
import random
def logistic(x):return 1 / (1 + np.exp(-x))def logistic_derivative(x):return logistic(x) * (1 - logistic(x))class NeuralNetwork:def predict(self, x):for b, w in zip(self.biases, self.weights):# 计算权重相加再加上偏向的结果z = np.dot(x, w) + b# 计算输出值x = self.activation(z)return self.classes_[np.argmax(x, axis=1)]class BP(NeuralNetwork):def __init__(self,layers,batch):self.layers = layersself.batch = batchself.activation = logisticself.activation_deriv = logistic_derivativeself.num_layers = len(layers)self.biases = [np.random.randn(x) for x in layers[1:]]self.weights = [np.random.randn(x, y) for x, y in zip(layers[:-1], layers[1:])]def fit(self, X, y, learning_rate=0.1, epochs=1):labelbin = LabelBinarizer()y = labelbin.fit_transform(y)self.classes_ = labelbin.classes_training_data = [(x,y) for x, y in zip(X, y)]n = len(training_data)for k in range(epochs):#每次迭代都循环一次训练# 搅乱训练集,让其排序顺序发生变化random.shuffle(training_data)batches = [training_data[k:k+self.batch] for k in range(0, n, self.batch)]#批量梯度下降for mini_batch in batches:x = []y = []for a,b in mini_batch:x.append(a)y.append(b)activations = [np.array(x)]#向前一层一层的走for b, w in zip(self.biases, self.weights):#计算激活函数的参数,计算公式:权重.dot(输入)+偏向 z = np.dot(activations[-1],w)+b #计算输出值output = self.activation(z)#将本次输出放进输入列表,后面更新权重的时候备用activations.append(output)#计算误差值error = activations[-1]-np.array(y)#计算输出层误差率deltas = [error * self.activation_deriv(activations[-1])]#循环计算隐藏层的误差率,从倒数第2层开始for l in range(self.num_layers-2, 0, -1):deltas.append(self.activation_deriv(activations[l]) * np.dot(deltas[-1],self.weights[l].T))#将各层误差率顺序颠倒,准备逐层更新权重和偏向deltas.reverse()#更新权重和偏向for j in range(self.num_layers-1):# 权重的增长量,计算公式,增长量 = 学习率 * (错误率.dot(输出值)),单个训练数据的误差delta = learning_rate/self.batch*((np.atleast_2d(activations[j].sum(axis=0)).T).dot(np.atleast_2d(deltas[j].sum(axis=0))))#更新权重self.weights[j] -= delta#偏向增加量,计算公式:学习率 * 错误率delta = learning_rate/self.batch * deltas[j].sum(axis=0)#更新偏向self.biases[j] -= deltareturn self   clf0 = BP([X_train.shape[1],10],10).fit(X_train,y_train,epochs=100)
predictions_labels = clf0.predict(X_test)
print(confusion_matrix(y_test, predictions_labels))
print (classification_report(y_test, predictions_labels))
endtime = datetime.datetime.now()
print (endtime - starttime)

实验结果为:

[[19  0  1  0  0  2  1  1  6  1][ 2 10  6  1  0  3  0  1  7  1][ 3  1 12  1  0  3  1  0  3  2][ 1  0  0 21  0  0  1  0  3  3][ 0  1  1  0 29  0  0  1  0  0][ 1  7  1  0  1 17  1  2  2  2][ 2  0  1  0  0  0 24  0  1  2][ 2  0  0  0  0  1  0 21  0  2][ 2  1  2  2  0  2  0  0 20  2][ 0  1  3  2  2  1  2  2  1 16]]precision    recall  f1-score   support0       0.59      0.61      0.60        311       0.48      0.32      0.38        312       0.44      0.46      0.45        263       0.78      0.72      0.75        294       0.91      0.91      0.91        325       0.59      0.50      0.54        346       0.80      0.80      0.80        307       0.75      0.81      0.78        268       0.47      0.65      0.54        319       0.52      0.53      0.52        30avg / total       0.63      0.63      0.63       3000:01:14.663123

因为权值和阈值每次都是随机初始化的,所以每次运行结果就会不一样。读者可以更改w和b的值,将其调整到更佳的状态。

参考:https://www.jianshu.com/p/c7e642877b0e(梯度下降法及其实现)
参考:https://www.leiphone.com/news/201705/TMsNCqjpOIfN3Bjr.html
参考:https://www.k2zone.cn/?p=1110

机器学习之BP神经网络算法实现图像分类相关推荐

  1. 【项目实战】Python基于BP神经网络算法实现家用热水器用户行为分析与事件识别

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 1.项目背景 居民在使用家用热水器的过程中,会因为地区气候.不同区域和用户年龄 ...

  2. 数学建模算法与应用【BP神经网络算法】

    评价预测和分类问题可以用到神经网络.卷积神经网络适合大样本的情况,深度学习包括很多种网络,如卷积神经网络,对抗网络等,深度学习大小样本皆可. 人工神经网络ANN 在机器学习和认知科学领域,人工神经网络 ...

  3. 机器学习:BP神经网络,CNN卷积神经网络,GAN生成对抗网络

    1,基础知识 1.1,概述 机器学习:概念_燕双嘤-CSDN博客1,机器学习概述1.1,机器学习概念机器学习即Machine Learning,涉及概率论.统计学.逼近论.凸分析.算法复杂度理论等多门 ...

  4. MATLAB 中BP神经网络算法用于回归拟合的实现

    转载自:https://www.cnblogs.com/babyfei/p/7400072.html BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单 ...

  5. 基于BP神经网络算法的性别识别

    目录 基于 BP 神经网络算法的性别识别 1 目录 1 1.背景介绍 2 2. OpenCV 的介绍 3 3.安装 OpenCV 4 4. BP 神经网络算法介绍和实践 4 4.1 BP 神经网络结构 ...

  6. bp神经网络权值调整公式,bp神经网络算法推导

    神经网络BP模型 一.BP模型概述误差逆传播(ErrorBack-Propagation)神经网络模型简称为BP(Back-Propagation)网络模型. PallWerbas博士于1974年在他 ...

  7. BP神经网络算法基本原理,bp神经网络实例分析

    BP人工神经网络方法 (一)方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统.理论和实践表明,在信息处理方面,神经网络方法比传统模式识别方法更具有优势. 人 ...

  8. 大数据挖掘建模案例分析:利用BP神经网络算法进行用户行为分析(一)

    泰迪智能科技(数据挖掘平台:TipDM数据挖掘平台)最新推出的数据挖掘实战专栏 专栏将数据挖掘理论与项目案例实践相结合,可以让大家获得真实的数据挖掘学习与实践环境,更快.更好的学习数据挖掘知识与积累职 ...

  9. Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN、SOFM神经网络)、案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略

    Matlab:基于Matlab实现人工智能算法应用的简介(BP神经网络算法NN.SOFM神经网络).案例应用(基于Matlab的GUI的方式创建/训练/预测神经网络)之详细攻略 目录

  10. BP神经网络算法伪代码

    BP神经网络算法伪代码,该代码可以使用到论文写作当中吗,但是需要结合自己的论文需求进行修改,再次记录.信息来源于参考博客,谢谢! 算法伪代码:输入:训练集D学习率η1:数据归一化(此处需根据数据实际情 ...

最新文章

  1. python文本分类评价指标 top1如何计算_python – Keras:如何计算多标签分类的准确......
  2. Spring Security 中使用Keycloak作为认证授权服务器
  3. jquery 二级导航
  4. 推荐算法炼丹笔记:电商搜索推荐业务词汇表
  5. android http最新框架,Android框架学习笔记02AndroidAsycHttp框架
  6. jQuery 学习笔记 事件委派
  7. python中使用matplotlib问题
  8. Java Web之基于注解的Spring MVC环境配置
  9. MySQL 千万级 数据库或大表优化
  10. 拓端tecdat:R语言集成模型:提升树boosting、随机森林、约束最小二乘法加权平均模型融合分析时间序列数据
  11. 若依框架数据库密码加密
  12. Element.closest() 兼容IE
  13. 微信扫描普通二维码进入小程序
  14. charles安装教程--以及针对安装证书后https<unknown>爬坑
  15. Linux压缩命令gzip, bzip2和tar
  16. 基于微信小程序游泳馆管理系统(微信小程序毕业设计)
  17. Spring之Specification复杂查询和Criteria查询
  18. 中国最实用的十大网站
  19. 币圈里,大佬们都在用的网站和APP都在这
  20. 2021年日历记事备忘录(A4可打印版)

热门文章

  1. AD快捷键备份20210202
  2. NotePad++ 正则表达式
  3. html5调查问卷的计分实验,问卷调查实验
  4. SAP中客户需求(销售订单)在计划策略10/30/40下的区别测试
  5. 大众点评有多少用户2019_据说2019年度大众点评排名第一
  6. VBS教程(入门级)
  7. html记笔记模板,使用html和css实现康奈尔笔记的模板
  8. 数据库设计原则、表字段命名规则、索引调优建立规则
  9. 网联兴,银联苦:一文看清支付清算市场新局面的矛盾和疑惑
  10. 3. Ubuntu下载CUDA驱动