15.1 BP神经网络实现图像压缩——了解神经网络在图像处理方面的应用(matlab程序)

news2024/11/23 21:54:52

1.简述

      

BP神经网络现在来说是一种比较成熟的网络模型了,因为神经网络对于数字图像处理的先天优势,特别是在图像压缩方面更具有先天的优势,因此,我这一段时间在研究神经网络的时候同时研究了一下关于BP网络实现图像压缩的原理和过程,并且是在MATLAB上进行了仿真的实验,结果发现设计的BP神经网络具有不错的泛化能力,对于用于图像压缩方面的效果还不错.

BP神经网络的模型的架构和训练的原理

BP神经网络是现在目前的发展的比较成熟的神经网络之一了,也是一种比较给力的非线性的可微分函数进行权值修正和调整的多层前馈人工神经网络,经得住严密的数学逻辑推导,在很多的模式识别的书中和很多的数据压缩的论文中得以大量的广泛和认同.BP神经网络算法主要的特点是输入信号的正向传递,误差的反向传播.BP网络的学习算法的本质其实就是把样本集合的输入输出问题变换为一个非线性优化的问题.其中分为三层的网络结构,包括输入层,隐藏层,输出层这样的三层.典型的一个网络模型的结构可以由下边的部分构成:

首先说一下前向传播:

首先在BP的神经网络模型中我们现在假设为L层,其中他的输入层是第1层,输出层是最后一层也就是L层,隐藏层的话其实就是从第2层到第L-1层了.要是在输出层的第K个神经单元,就可以简单的表示为

这个上标表示为层数,下标表示为第K个神经元,同理,其他的层数和神经元也都可以如此概述.这样的话对于第L层的神经元个数就可以用|L|来表示.即第L层的第J个神经元的输入与输出的关系如下图所示:

其中

b表示为第L层的第J个神经元与L-1层第J个神经元的链接权重.

而其输出的Oij如下所示,其中f是激励函数

在神经网络中我们有很多的激活函数可以选择,但是我们在这里还是选择使用sigmood函数,为什么选用这个函数?因为在我搜集了很多资源来看,如果我们使用一些其他的激活函数或者直接放弃使用激活函数,不过我们使用多少次隐藏层,我们最终得到的仍然是一个线性的函数,但是在使用非线性的sigmoid函数以后,就不会有这个问题,我们的网络也可以去拟合非线性的函数.

在这里我们只需要记住sigmoid函数的推导,因为在接下来的反向传播中我们要去使用.

求导以后:

反向传播

关于反向传播,这个部分大概是整个BP神经网络的精华所在了.那么反向传播究竟是个什么东西呢?其实反向传播就是通过最后的误差来更新权值.打个比方,你现在是个学生,学校里搞了一大堆试卷,发给你们考试以后你们考完发现取得的效果并不好,当校长看到成绩单后,校长很生气,校长就说了,年级主任你去给我找问题,年级主任然后就跟班主任说你给我去找问题,,,一直到你们这些学生,老师让你们去改.这样对应的就是我们神经网络的输入层一直改到输出层.在这里使用到的一个重要的法则就是梯度下降法则.

梯度下降法,大学高数的知识,其实就是你更新权重的同时不能更新,而是按照梯度的方向更新才能够给更新权重,能够获得更多的收敛.公式如下:

这里有一个负梯度方向需要说明一下,因为你的学习速率是大于0的,对于误差E来说,他对W的偏导数就必须要大于0这样也就是说,误差随着权重的增大而增大,那我们就需要通过减少权重来减小误差,所以W的变化率需要小于0,当然,如果我们要求某某某的最大值的话,也可以使用正梯度.

直观上来看神经网络的每个神经元的权重更新都是通过误差的偏导来更新的,在这里我们引入一个新的变量误差,对于第l层的第j个神经元的误差定义为

这样的权重更新过程可以为:

在这里我们需要用到的就是链式求导法则,具体如下:

根据sigmoid函数的求导公式,并且对于误差进行偏导,我们就可以得到第L层的神经元的误差项:

所以就能够得到输出层上一层与输出的权重更新公式:

所以就能够得到输出层上一层与输出的权重更新公式:

对于隐藏层,我们需要在求导时对于他的输出层单元的每个误差影响进行叠加,与输出层类似,不再赘述.

对于第L-1层的第j个神经元的误差项来说,由于每个神经元连接到输出层的每个单元,因此我们要对输出层的|L|个单元进行求和,从而得到了误差项的计算公式:

所以便得到了L-2与L-1层的链接权重的公式:

而对于其他层,我们进行推广就可以得到第I层第J个的神经单元的误差公式额权重更新公式:

对于推导过程,简单的来说就是链式求导,由上面公式我们可以看出反向传播也是求导,只是对于隐层以及输入层来说,它们所产生的误差在传播过程中能够影响每一个最终的输出层单元,所以我们需要对其产生的误差求和。反向传播的前提是前向传播,而前向传播的公式相信大家很容易都能记住,而反向传播其实就是对前向传播的公式链式求导,只需要注意到求导过程中对于w对输出层的影响来判断什么时候需要进行求和操作就可以.

基于MATLAB的BP神经网络图像压缩过程的分析:

因为在MATLAB上应用BP神经网络对于数字图像进行压缩主要包括训练样本构造,仿真以及图像重建这三个环节.

训练样本的构建

因为我的机器的性能不够,考虑到需要将整幅图像中的所有像素数据都需要作为BP网络的输入数据,为了控制整个网络的训练规模和训练速度,因此对于图像进行分块化处理,但是考虑到临近像素之间的相关性和差异性,因此小图像的所占的像素比例不应该太大,假设一个图像是由N*N个像素构成,将整个图像切割为M个规则大小的小图像块,其中每个图像由n*n个像素构成,将每个小图像的数据重构为一个列向量,作为样本的训练向量,然后进行归一化数据处理.

这里用的是最值线性函数转换法,即:

Y(k)={X(k)-X(min)}/{X(max)-X(min)}

其中X(k)是转换之前的数据,Y(k)是转换之后的数据,X(min),X(max)是整个数据集合里边的最小值和最大值.通过归一化,可以将每个训练向量的像素值归一到[0,1]的范围内.

2:在创建并且训练好符合条件的BP网络后,使用上边提到Sigmoid对于归一化后的处理的图像数据进行仿真压缩,输出仿真向量,然后通过图像重建来还原为一幅完整的图像数据.

3:现在以静态的图像进行试验,控制大小为128*128,先将整幅图像分隔成为4*4的小图像快,再将每个小图像转化为16*1的列向量,统一归一化处理进行作为网络的输入的样本,按照上述的操作进行分析,创建BP网络,进行训练,这一次压缩比为4.

2.代码

%% 清理
clear,clc
close all

%% 载入数据
col=256;
row=256;
I=imread('lena.bmp');
load comp
com.lw=double(com.lw)/63;
com.b=double(com.b)/63;
com.d=double(com.d)/63;
com.lw=com.lw*(maxlw-minlw)+minlw;
com.b=com.b*(maxb-minb)+minb;
com.d=com.d*(maxd-mind)+mind;

%% 重建
for i=1:4096
   Y(:,i)=com.lw*(com.d(:,i)) +com.b;
end

%% 反归一化
Y=uint8(Y*255);

%% 图像块恢复
I1=re_divide(Y,col,4);

%% 计算性能
fprintf('PSNR :\n  ');
psnr=10*log10(255^2*row*col/sum(sum((I-I1).^2)));
disp(psnr)
a=dir();
for i=1:length(a)
   if (strcmp(a(i).name,'comp.mat')==1) 
       si=a(i).bytes;
       break;
   end
end
fprintf('rate: \n  ');
rate=double(si)/(256*256);
disp(rate)
figure(1)
imshow(I)
title('原始图像');
figure(2)
imshow(I1)
title('重建图像'); 
 

3.运行结果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721762.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java:ThreadLocal解析

Java:ThreadLocal解析 前言一、 什么是ThreadLocal?二、ThreadLocal的内存泄漏问题1.什么是内存泄漏?2.为什么会出现内存泄漏问题?3.如何解决内存泄漏问题?(1)ThreadLocal会自动清除key为null的…

层级在BW4HANA中的处理

目录 1.从flatfile加载层级的处理 2. 从ERP数据源抽取区间层级到BW 2.1 在ERP中的层级数据源 2.1.1 PSA格式和IDoc格式的区别 2.1.2 怎么查看Interval的字段 2.1.3 如何在S4里查看层级数据源结构 2.1.4 关于时间相关层级date to和date from 1.从flatfile加载层级的处理 层…

【快速开始】一个简单的Flask-SocketIO应用,完成后端推送消息接收与关闭

效果图 先看运行效果图 OK,下面开始。 安装环境 本人使用环境及版本: Anaconda: 虚拟环境: Python版本:3.8.13 安装包及版本: Flask-SocketIO:5.3.4 eventlet:0.33.3 快速开…

BUU [ZJCTF 2019]NiZhuanSiWei

BUU [ZJCTF 2019]NiZhuanSiWei 先看题目,提示了useless.php。 猜到了flag在哪。 没啥可以学的,直接上exp。 ?textdata://text/plain,welcome to the zjctf &filephp://filter/readconvert.base64-encode/resourceuseless.php &passwordO:4:&q…

工作学习总结:安卓地图SDK测试--前置准备阶段8天

工作学习总结:安卓地图SDK测试--前置准备阶段8天 安卓地图SDK测试--前置准备阶段8天前置知识:1、安卓环境开发部署2、高德 SDK demo 如何进行调试(1)SHA1 密钥无法获取(2)下载了高德 3D 地图 demo&#xff…

Leetcode---352周赛

周赛题目 2760. 最长奇偶子数组 2761. 和等于目标值的质数对 2762. 不间断子数组 2763. 所有子数组中不平衡数字之和 一、最长奇偶子数组 这题的数据范围允许用暴力来做,只要我们分别枚举左端点left和右端点right,然后看区间[left,right]是否符合题目条…

stable diffusion 百宝书

文章目录 0. 环境搭建0.1 Windows0.1.1 git环境安装0.1.2 python 环境搭建0.1.2.1 配置pip国内镜像源 0.1.3 stable diffusion环境搭建0.1.3.1 远程访问Stable diffusion0.1.3.2 模型 Lora下载 1. 基础知识1.1 Stable Diffusion Webui及基础参数1.2 参数说明1.2.1 采样方法1.2.…

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B

【AI实战】从零开始搭建中文 LLaMA-33B 语言模型 Chinese-LLaMA-Alpaca-33B 简介环境配置环境搭建依赖安装 代码及模型权重拉取拉取 Chinese-LLaMA-Alpaca拉取 llama-30b-hf 模型权重及代码拉取 chinese-llama-lora-33b 模型权重及代码 合并模型权重先转换 pth 类型的模型权重&…

docker版jenkins安装node打包vue2

下载node 通过jenkins配置下载因为某些原因会失败,故自己下载安装https://nodejs.org/zh-cn/download解压然后复制到docker的jenkins容器 tar -xvf node-v16.18.1-linux-x64.tar.xzdocker cp ./node-v16.18.1-linux-x64 jenkins:/node配置 jenkins-全局工具配置- …

【Vim编辑器】编码技巧:模板(自动添加信息)+配置参考(~/.vimrc)

前言: 在编写代码时,为了提高代码的可读性和维护性,我们经常在文件的头部添加一些信息提示,如作者、日期、版本号等。本文介绍了如何在 Vim 编辑器中实现自动添加信息提示的功能。 结尾提供~/.vimr参考配置,可提高代码…

短视频seo矩阵+抖音小程序源码开源部署(二)

一、 开发思路: 通过短视频seo矩阵抖音小程序的形式,实现视频的批量制作,小程序内容批量挂载,客户线索批量收集,实现企业运营价值最大化。开发逻辑:通过短视频矩阵布局seo搜索关键词,接入小程序…

Elasticsearch:文档版本控制和乐观并发控制

在今天的文章中,我来详细描述一下 Elasticsearch 文档的版本控制以及如何更新文档。你也可以阅读我之前的文章 “Elasticsearch:深刻理解文档中的 verision 及乐观并发控制”。 版本控制 我们知道 Elasticsearch 的每个文档都有一个相对应的版本。这个版…

GO微服务简介及特性介绍

微服务特性 一、微服务简介-构建单体应用 互联网技术发展迅速的今天,微服务倍受关注:文章、博客、社交媒体讨论和会议演讲都在谈论。与此同时,也有持怀疑态度的软件社区人员认为微服务没什么新鲜可言。反对者声称它的思想只是面向服务架构的…

Windows系统安装JAVA步骤流程(超详细)

超详细的Windows系统安装JAVA步骤流程,Windows操作系统安装java,先下载JDK,然后配置环境变量,阿里云百科分享详细安装流程如下: 目录 Window操作系统安装java流程 下载JDK 配置环境变量 JAVA_HOME 设置 PATH设置…

Centos安装RabbitMQ

#安装 yum install rabbitmq-server #启动 systemctl start rabbitmq-server #查看状态 systemctl status rabbitmg-server #安装管理插件 rabbitmg-plugins enable rabbitmg_management #新增admin账号 rabbitmqctl add_user admin admin #设置为管理员 rabbitmqctl set_user_…

电子电气架构——车载DoIP通信

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 人们会在生活中不断攻击你。他们的主要武器是向你灌输对自己的怀疑:你的价值、你的能力、你的潜力。他们往往会将此伪装成客观意见,但无一例外的是…

基于FreeRTOS的嵌入式设备管理关键技术研究及实现(学习二)

嵌入式操作系统FreeRTOS FreeRTOS是一个专门为轻量级嵌入式应用设计的迷你操作系统,它的主要功能由IPC、时钟管理、内存管理、任务通知以及任务调度等部分构成。 FreeRTOS的代码可以分解为三个主要区块:任务调度、通讯、硬件库。 任务调度:F…

windows环境安装robotframework-ride

在Windows环境下,可以通过以下步骤安装Robot Framework RIDE: 安装Python 首先,需要在Windows环境下安装Python。建议使用Python 3.x版本,可以从官方网站下载并安装:https://www.python.org/downloads/windows/ 安装w…

shiro登录认证

一,创建数据库 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0; -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS user; CREATE TABLE user ( uid int(11) NOT NULL AUTO_INCREMENT, uname va…

opencv中Rect()类与rectangle()函数详解

文章目录 Rect()矩形类1、实例化 Rect() 类:(1)构造函数: 2、Rect类的成员函数(1)rect.size() 和 rect.area() 和 rect.width() 和 rect.height(),用来描述矩形的宽度,高度&#xff…