【图像处理】使用自动编码器进行图像降噪(改进版)

阿里雷扎·凯沙瓦尔兹

一、说明

        自动编码器是一种学习压缩和重建输入数据的神经网络。它由一个将数据压缩为低维表示的编码器和一个从压缩表示中重建原始数据的解码器组成。该模型使用无监督学习进行训练,旨在最小化输入和重建输出之间的差异。自动编码器可用于降维、数据去噪和异常检测等任务。它们在处理未标记数据时非常有效,并且可以从大型数据集中学习有意义的表示。

二、自动编码器的工作原理

        网络提供原始图像x,以及它们的噪声版本x~。网络尝试重建其输出 x',使其尽可能接近原始图像 x。通过这样做,它学会了如何对图像进行去噪。

如图所示,编码器模型将输入转换为小型密集表示形式。解码器模型可以看作是能够生成特定特征的生成模型。

编码器和解码器网络通常都是作为一个整体进行训练的。损失函数惩罚网络创建与原始输入 x 不同的输出 x'

通过这样做,编码器学会了保留潜在空间限制所需的尽可能多的相关信息,并巧妙地丢弃不相关的部分,例如噪声。解码器学习获取压缩的潜在信息并将其重建为完整的无错误输入。

三、如何实现自动编码器

        让我们实现一个自动编码器来对手写数字进行降噪。输入是一个 28x28 灰度缩放的图像,构建一个 128 个元素的矢量。

        编码器层负责将输入图像转换为潜在空间中的压缩表示。它由一系列卷积层和全连接层组成。这种压缩表示包含捕获其底层模式和结构的输入图像的基本特征。ReLU用作编码器层中的激活函数。它应用逐元素激活函数,将负输入的输出设置为零,并保持正输入不变。在编码器层中使用ReLU的目标是引入非线性,允许网络学习复杂的表示并从输入数据中提取重要特征。

        代码中的解码器层负责从潜在空间中的压缩表示重建图像。它反映了编码器层的结构,由一系列完全连接和转置卷积层组成。解码器层从潜在空间获取压缩表示,并通过反转编码器层执行的操作来重建图像。它使用转置卷积层逐渐对压缩表示进行上采样,并最终生成与输入图像具有相同尺寸的输出图像。Sigmoid 和 ReLU 激活用于解码器层。Sigmoid 激活将输入值压缩在 0 到 1 之间,将每个神经元的输出映射到类似概率的值。在解码器层中使用 sigmoid 的目标是生成 [0, 1] 范围内的重建输出值。由于此代码中的输入数据表示二进制图像,因此 sigmoid 是重建像素值的合适激活函数。

        通过在编码器层和解码器层使用适当的激活函数,自动编码器模型可以有效地学习将输入数据压缩到低维潜在空间中,然后从潜在空间重建原始输入数据。激活函数的选择取决于所解决问题的具体要求和特征。

二进制交叉熵用作损失函数,Adam 用作最小化损失函数的优化器。“binary_crossentropy”损失函数通常用于二元分类任务,适用于在这种情况下重建二元图像。它衡量预测输出与真实目标输出之间的相似性。“adam”优化器用于在训练期间更新模型的权重和偏差。Adam(自适应矩估计的缩写)是一种优化算法,它结合了 RMSprop 优化器和基于动量的优化器的优点。它单独调整每个权重参数的学习率,并使用梯度的第一和第二时刻来有效地更新参数。

通过使用二进制交叉熵作为损失函数和Adam优化器,自动编码器模型旨在最小化重建误差并优化模型的参数,以生成输入数据的准确重建。

第 1 部分:导入库和模块

import numpy as npimport matplotlib.pyplot as plt
from tensorflow.keras.datasets import mnistfrom tensorflow.keras.layers import input, dense, reshape, flatten, Conv2D, Conv2DTransposefrom tensorflow.keras.models import model from tensorflow.keras.optimizers   import Adamfrom tensorflow.keras.callbacks import EarlyStop

在这一部分中,导入了必要的库和模块。

  • numpy(导入为 )是用于数值运算的库。np
  • matplotlib.pyplot(导入为 )是用于打印的库。plt
  • mnist从 导入以加载 MNIST 数据集。tensorflow.keras.datasets
  • 从 和 导入各种层和模型。tensorflow.keras.layerstensorflow.keras.models
  • 优化程序是从 导入的。Adamtensorflow.keras.optimizers
  • 回调是从 导入的。EarlyStoppingtensorflow.keras.callbacks

第 2 部分:加载和预处理数据集

(x_train, _), (x_test, _) = mnist.load_data()

在这一部分中,加载 MNIST 数据集并将其拆分为训练集和测试集。相应的标签将被忽略,并且不会分配给任何变量。

第 3 部分:预处理数据集

x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
x_train = np.expand_dims(x_train, axis=-1)
x_test = np.expand_dims(x_test, axis=-1)

在这一部分中,数据集被预处理:

  • 和 中图像的像素值通过除以 0.1 归一化为 255 到 0 的范围。x_trainx_test
  • 输入数据的维度使用 展开以包括通道维度。这对于卷积运算是必需的。np.expand_dims

第 4 部分:向训练集添加随机噪声

noise_factor = 0.5
x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape)
x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape)
x_train_noisy = np.clip(x_train_noisy, 0., 1.)
x_test_noisy = np.clip(x_test_noisy, 0., 1.)

在这一部分中,随机噪声被添加到训练集中:

  • 选择0.5的噪声系数来控制噪声量。
  • 使用平均值为 0、标准差为 1 的随机噪声样本生成,然后按噪声因子进行缩放。np.random.normal
  • 噪声训练集和测试集是通过将噪声添加到原始数据中获得的。
  • 对像素值进行裁剪,以确保它们保持在 0 到 1 的有效范围内。

第 5 部分:创建自动编码器模型

input_shape = (28, 28, 1)
latent_dim = 128# Encoder
inputs = Input(shape=input_shape)
x = Conv2D(32, kernel_size=3, strides=2, activation='relu', padding='same')(inputs)
x = Conv2D(64, kernel_size=3, strides=2, activation='relu', padding='same')(x)
x = Flatten()(x)
latent_repr = Dense(latent_dim)(x)# Decoder
x = Dense(7 * 7 * 64)(latent_repr)
x = Reshape((7, 7, 64))(x)
x = Conv2DTranspose(32, kernel_size=3, strides=2, activation='relu', padding='same')(x)
decoded = Conv2DTranspose(1, kernel_size=3, strides=2, activation='sigmoid', padding='same')(x)# Autoencoder model
autoencoder = Model(inputs, decoded)

在这一部分中,自动编码器模型是使用编码器-解码器架构创建的:

  • input_shape定义为 ,表示输入图像的形状。(28, 28, 1)
  • latent_dim设置为 128,这决定了潜在空间的维数。
  • 编码器层定义:
  • 将使用指定的 .input_shape
  • 添加了两个分别具有 32 和 64 个过滤器的卷积层,内核大小为 3x3,步幅为 2,激活和填充设置为 。'relu''same'
  • 卷积层的输出使用 .Flatten()
  • 通过将扁平输出传递到带有神经元的完全连接层来获得潜在表示。Denselatent_dim
  • 解码器层定义:
  • 添加带有神经元的层以匹配编码器中最后一个特征图的形状。Dense7 * 7 * 64
  • 输出将调整为 使用 .(7, 7, 64)Reshape
  • 添加了两个转置卷积层:
  • 第一层有 32 个过滤器,内核大小为 3x3,步幅为 2,激活和填充设置为 。'relu''same'
  • 第二层有 1 个筛选器,内核大小为 3x3,步幅为 2,激活和填充设置为 。'sigmoid''same'
  • 通过指定输入和输出层来创建模型。autoencoder

第 6 部分:编译自动编码器模型

autoencoder.compile(optimizer=Adam(lr=0.0002), loss='binary_crossentropy')

在这一部分中,编译了自动编码器模型:

  • 优化器的学习率为 0.0002。Adam
  • 损失函数设置为 。'binary_crossentropy'

第 7 部分:添加提前停止

early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)

在这一部分中,创建了一个提前停止回调:

  • 它监视验证丢失 ()。'val_loss'
  • 如果验证损失连续 5 个 epoch 没有改善,则停止训练。
  • 恢复训练期间模型的最佳权重。

第 8 部分:训练自动编码器

epochs = 20
batch_size = 128history = autoencoder.fit(x_train_noisy, x_train, validation_data=(x_test_noisy, x_test),epochs=epochs, batch_size=batch_size, callbacks=[early_stopping])

在这一部分中,对自动编码器模型进行了训练:

  • 纪元数设置为 100,批大小设置为 128。
  • 训练数据以 提供,验证数据以 提供。(x_train_noisy, x_train)(x_test_noisy, x_test)
  • 训练过程以指定的周期数、批大小和提前停止回调执行。
  • 训练历史记录存储在变量中。history

第 9 部分:去噪测试图像并显示结果

denoised_test_images = autoencoder.predict(x_test_noisy)# Display original, noisy, and denoised images
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):# Original imagesax = plt.subplot(3, n, i + 1)plt.imshow(x_test[i].reshape(28, 28), cmap='gray')plt.title("Original")ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)# Noisy imagesax = plt.subplot(3, n, i + 1 + n)plt.imshow(x_test_noisy[i].reshape(28, 28), cmap='gray')plt.title("Noisy")ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)# Denoised imagesax = plt.subplot(3, n, i + 1 + n + n)plt.imshow(denoised_test_images[i].reshape(28, 28), cmap='gray')plt.title("Denoised")ax.get_xaxis().set_visible(False)ax.get_yaxis().set_visible(False)
plt.show()

在这一部分中:

  • 通过使用该方法将噪声测试图像通过训练的自动编码器来获得去噪测试图像。predict
  • 原始、噪点和去噪图像使用 .matplotlib.pyplot
  • 将创建一个包含三行的图形来显示图像。
  • 对于每一行,为每个图像创建一个子图。
  • 原始图像、噪点图像和去噪图像显示在单独的子图中。
  • 为每个子图设置轴标签和标题。
  • 结果图使用 表示。plt.show()

四、结果

深度学习
自动编码器
词典

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

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

相关文章

【iOS】动态链接器dyld

参考:认识 dyld :动态链接器 dyld简介 dyld(Dynamic Linker)是 macOS 和 iOS 系统中的动态链接器,它是负责在运行时加载和链接动态共享库(dylib)或可执行文件的组件。在 macOS 系统中&#xf…

STM32MP157驱动开发——按键驱动(定时器)

“定时器 ”机制: 内核函数 定时器涉及函数参考内核源码:include\linux\timer.h 给定时器的各个参数赋值: setup_timer(struct timer_list * timer, void (*function)(unsigned long),unsigned long data):设置定时器&#xf…

多元函数的概念

目录 多元函数的极限: 例题1: 例题2: 多元函数的连续性 连续函数的性质 偏导数 高阶偏导数 定理1: 全微分 可微的必要条件 用定义来判断是否可微 可微的充分条件 连续偏导可微的关系 多元函数的极限: 对于一个二元…

macOS Ventura 13.5 (22G74) 正式版发布,ISO、IPSW、PKG 下载

macOS Ventura 13.5 (22G74) 正式版发布,ISO、IPSW、PKG 下载 本站下载的 macOS Ventura 软件包,既可以拖拽到 Applications(应用程序)下直接安装,也可以制作启动 U 盘安装,或者在虚拟机中启动安装。另外也…

服务器数据库中了Locked勒索病毒,企业应该如何正确处理并采取后续防护措施

网络技术的发展极大地方便了人们的工作生活,但同样带来了一定的网络安全威胁,其中较为危险的威胁就是勒索病毒攻击,勒索病毒不仅会给我们的计算机系统带来破坏,还会加密我们的重要文件数据来敲诈勒索,只有用户支付的赎…

提高可视性的五大方法可增强 Horizon Cloud 下一代平台的性能和用户体验

我们在 VMware Explore US 2022 推出了 VMware Horizon Cloud 下一代平台。该平台为使用现代化虚拟桌面和应用的客户提供了一个新的混合型桌面服务(DaaS)架构,其围绕降低成本和提高可扩展性而构建。首次发布后,我们在 VMware Expl…

gerrit 从安装到出坑

一般公司在做代码审核的时候选择codereview gerrit来处理代码的入库的问题。 它是通过提交的时候产生Change-Id: If4e0107f3bd7c5df9e2dc72ee4beb187b07151b9 来决定是不是入库,一般如果不是通过这个管理,那么就是我们通常的操作 git add . git comm…

【MySQL】MySQL HeatWave 介绍

HeatWave是一个分布式、可扩展、无共享、内存中、混合柱状的查询处理引擎,专为获得极致性能而设计。可以通过向MySQL数据库系统添加一个HeatWave集群来启用它。 HeatWave 是一种大规模并行、高性能内存查询加速器,可将分析工作负载、混合工作负载和机器…

Linux 学习记录55(ARM篇)

Linux 学习记录55(ARM篇) 本文目录 Linux 学习记录55(ARM篇)一、使用C语言封装GPIO函数1. 封装GPIO组寄存器2. 封装GPIO模式以及相关配置3. 封装GPIO初始化结构体4. 使用自己的封装配置GPIO 一、使用C语言封装GPIO函数 1. 封装GPIO组寄存器 #define GPIOA ((GP…

刷题日记09《图论基础》

图的存储结构 对于图结构而言,常见的存储结构主要有两种:邻接表和邻接矩阵: 邻接表很直观,我把每个节点 x 的邻居都存到一个列表里,然后把 x 和这个列表关联起来,这样就可以通过一个节点 x 找到它的所有相邻…

【算法与数据结构】222、LeetCode完全二叉树的节点个数

文章目录 一、题目二、一般遍历解法三、利用完全二叉树性质四、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、一般遍历解法 思路分析:利用层序遍历,然后用num记录节点数量。其他的例如…

视频增强技术-去噪

本文介绍了关于视频增强技术的相关方法包括传统方法和基于深度学习的方法,并给出了他们的对比实验结果,最后对它们简单的做了总结,文中有一些图片和总结来自于网上其他博主的文章,已在文中标记并给出了相关的原文链接,…

一文掌握如何前后端分离?

随着科技的进步和发展,低代码开发产品拥有广阔的市场前景。前后端分离似乎早已经是发展趋势了,因为做好前后端分离对于前后端的工程师而言是非常有利的,这样也有利于提升办公协作效率。那么,如何前后端分离?分别都有哪…

【机器学习】支持向量机SVM入门

优化目标 相较于之前学习的线性回归和神经网络,支持向量机(Supprot Vector Machine,简称SVM)在拟合复杂的非线性方程的时候拥有更出色的能力,该算法也是十分经典的算法之一。接下来我们需要学习这种算法 首先我们回顾…

关于Docker的基本概念和使用

关于Docker的基本概念和使用 一、Docker 概述1、Dcker的概念2、容器的优势3、Docker与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、安装 Docker1、安装依赖包2、设置阿里云镜像源3、安装 Docker-CE并设置为开机自动启动3、查看 docker 版本信息4、docker…

AI智能化技术对项目管理的挑战与应对︱腾讯CSIG能源行业总经理王磊

腾讯CSIG能源行业总经理王磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾,演讲议题:AI智能化技术对项目管理的挑战与应对。大会将于8月12-13日在北京举办,敬请关注! 议题简要: 自从DALLE、Midjourney、…

linux升级mysql

linux升级mysql 一.介绍二.下载三.文件配置1.查找删除mysql2.解压配置 四.修改配置五.初始化mysql服务六.启动mysql七.配置数据库七.测试 一.介绍 由于最近业务需要,不得不将之前的mysql5.7.26升级到mysql8.0加了 Linux安装mysql(5.7.26)&…

flask结合mysql实现用户的添加和获取

1、数据库准备 已经安装好数据库,并且创建数据库和表 create database unicom DEFAULT CHARSET utf8 COLLATE utf8_general_ci; CREATE TABLE admin( id int not null auto_increment primary key, username VARCHAR(16) not null, password VARCHAR(64) not null…

初识 Spring (存储和获取 bean)

目录 初识 Spring总结 DI(依赖注入)Spring 项目的创建创建一个 Maven 项目添加 Spring 框架支持添加启动类 存储 bean 对象创建 bean将 bean 注册到容器中 获取并使用 bean 对象获取 bean 的方法一获取 bean 的方法二获取 bean 的方法三 ApplicationCont…

(Chrome Ext)谷歌扩展程序-谷歌插件渗透测试方法记录

文章目录 前言一、本地获取谷歌插件/扩展程序源码二、工具化信息收集总结 前言 在工作岗位变更之后,越来越多“奇奇怪怪”的东西要去渗透和测试,在我之前干安服的时候,最多的就是测一下web,极少情况下测测app,但是现在…