卷积和降噪自编码器

1.导入各种包

from pathlib import Path
import pandas as pd
import numpy as np
from numpy.random import choiceimport tensorflow as tf
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, UpSampling2D
from tensorflow.keras.models import Model
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.datasets import fashion_mnistimport matplotlib.pyplot as plt
import seaborn as sns

2.数据准备

(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()
X_train.shape, X_test.shape
class_dict = {0: 'T-shirt/top',1: 'Trouser',2: 'Pullover',3: 'Dress',4: 'Coat',5: 'Sandal',6: 'Shirt',7: 'Sneaker',8: 'Bag',9: 'Ankle boot'}
classes = list(class_dict.keys())#规范数据
image_size = 28
def data_prep_conv(x, size=image_size):return x.reshape(-1, size, size, 1).astype('float32')/255
X_train_scaled = data_prep_conv(X_train)
X_test_scaled = data_prep_conv(X_test)
X_train_scaled.shape, X_test_scaled.shape

out:

#训练与函数结合
def train_autoencoder(path, model, x_train=X_train_scaled, x_test=X_test_scaled):callbacks = [EarlyStopping(patience=5, restore_best_weights=True),ModelCheckpoint(filepath=path, save_best_only=True, save_weights_only=True)]model.fit(x=x_train, y=x_train, epochs=100, validation_split=.1, callbacks=callbacks)model.load_weights(path)mse = model.evaluate(x=x_test, y=x_test)return model, mse

3.卷积Autoencoder

定义一个三层的编码器,它分别使用32、16和8个过滤器的2D卷积。第三层的编码大小是4 x 4 x 8 = 128,比之前的例子要大。

input_ = Input(shape=(28, 28, 1), name='Input_3D')x = Conv2D(filters=32,kernel_size=(3, 3),activation='relu',padding='same',name='Encoding_Conv_1')(input_)
x = MaxPooling2D(pool_size=(2, 2), padding='same', name='Encoding_Max_1')(x)
x = Conv2D(filters=16,kernel_size=(3, 3),activation='relu',padding='same',name='Encoding_Conv_2')(x)
x = MaxPooling2D(pool_size=(2, 2), padding='same', name='Encoding_Max_2')(x)
x = Conv2D(filters=8,kernel_size=(3, 3),activation='relu',padding='same',name='Encoding_Conv_3')(x)
encoded_conv = MaxPooling2D(pool_size=(2, 2),padding='same',name='Encoding_Max_3')(x)x = Conv2D(filters=8,kernel_size=(3, 3),activation='relu',padding='same',name='Decoding_Conv_1')(encoded_conv)
x = UpSampling2D(size=(2, 2), name='Decoding_Upsample_1')(x)
x = Conv2D(filters=16,kernel_size=(3, 3),activation='relu',padding='same',name='Decoding_Conv_2')(x)
x = UpSampling2D(size=(2, 2), name='Decoding_Upsample_2')(x)
x = Conv2D(filters=32,kernel_size=(3, 3),activation='relu',name='Decoding_Conv_3')(x)
x = UpSampling2D(size=(2, 2), name='Decoding_Upsample_3')(x)
decoded_conv = Conv2D(filters=1,kernel_size=(3, 3),activation='sigmoid',padding='same',name='Decoding_Conv_4')(x)autoencoder_conv = Model(input_, decoded_conv)
autoencoder_conv.compile(optimizer='adam', loss='mse')
autoencoder_conv.summary()

这里是定义了一个解码器,它限制了滤波器的数量,并使用2D采样代替最大池化来解决滤波器数量的减少的问题。out可见三层自动编码器有12785个参数,略高于前一种深度自动编码器容量的5%。
out:

path = (results_path / 'autencoder_conv.32.weights.hdf5').as_posix()
autoencoder_deep, mse = train_autoencoder(path, autoencoder_conv, x_train=X_train_scaled, x_test=X_test_scaled)

out结果略

f'MSE: {mse:.4f} | RMSE {mse**.5:.4f}'

out:

训练在75个周期后停止,结果测试RMSE进一步减少9%,这是由于卷积滤波器从图像数据学习的能力更有效并且编码尺寸更大。

autoencoder_conv.load_weights(path)
reconstructed_images = autoencoder_deep.predict(X_test_scaled)
reconstructed_images.shapefig, axes = plt.subplots(ncols=n_classes, nrows=2, figsize=(20, 4))
for i in range(n_classes):axes[0, i].imshow(X_test_scaled[i].reshape(image_size, image_size), cmap='gray')axes[0, i].axis('off')axes[1, i].imshow(reconstructed_images[i].reshape(image_size, image_size) , cmap='gray')axes[1, i].axis('off')

out:

4.去噪自编码器

自编码器在去噪任务中的应用只影响训练阶段。下面会在标准正态分布的Fashion MNIST数据中添加噪声,同时保持像素值在[0,1]范围内。

def add_noise(x, noise_factor=.3):return np.clip(x  + noise_factor * np.random.normal(size=x.shape), 0, 1)X_train_noisy = add_noise(X_train_scaled)
X_test_noisy = add_noise(X_test_scaled)
fig, axes = plt.subplots(nrows=2, ncols=5, figsize=(20, 4))axes = axes.flatten()
for i, ax in enumerate(axes):ax.imshow(X_test_noisy[i].reshape(28, 28), cmap='gray')ax.axis('off')

out:

x = Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same', name='Encoding_Conv_1')(input_)
x = MaxPooling2D(pool_size=(2, 2), padding='same', name='Encoding_Max_1')(x)
x = Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same', name='Encoding_Conv_2')(x)
encoded_conv = MaxPooling2D(pool_size=(2, 2), padding='same', name='Encoding_Max_3')(x)x = Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same', name='Decoding_Conv_1')(encoded_conv)
x = UpSampling2D(size=(2, 2), name='Decoding_Upsample_1')(x)
x = Conv2D(filters=32, kernel_size=(3, 3), activation='relu', padding='same', name='Decoding_Conv_2')(x)
x = UpSampling2D(size=(2, 2), name='Decoding_Upsample_2')(x)
decoded_conv = Conv2D(filters=1, kernel_size=(3, 3), activation='sigmoid', padding='same', name='Decoding_Conv_4')(x)autoencoder_denoise = Model(input_, decoded_conv)
autoencoder_denoise.compile(optimizer='adam', loss='mse')path = (results_path / 'autencoder_denoise.32.weights.hdf5').as_posix()callbacks = [EarlyStopping(patience=5,restore_best_weights=True),ModelCheckpoint(filepath=path,save_best_only=True,save_weights_only=True)]#继续在有噪声的输入上训练卷积自编码器,目的是学习如何生成未损坏的原始数据:
autoencoder_denoise.fit(x=X_train_noisy,y=X_train_scaled,epochs=100,batch_size=128,shuffle=True,validation_split=.1,callbacks=callbacks)

out略

autoencoder_denoise.load_weights(path)
mse = autoencoder_denoise.evaluate(x=X_test_noisy, y=X_test_scaled)
f'MSE: {mse:.4f} | RMSE {mse**.5:.4f}'

out:

5.可视化

下图从上到下分别是原始图像和去噪后的图像。它说明了自编码器成功地从噪声图像中产生压缩编码,这些压缩编码与从原始图像中产生的非常相似。

MLAT-Autoencoders---下篇-关键代码及结果展示(2)相关推荐

  1. MLAT-Autoencoders---下篇-关键代码及结果展示(1)

    自编码器的实现(python) 本节主要展示了应用深度前馈.稀疏约束神经网络构建自编码器.另外卷积自编码器对图像进行去噪这一应用也非常实用,将在单独放在下篇展示. 1.导入各类包 from pathl ...

  2. MLAT-Autoencoders---下篇-关键代码及结果展示(3)(终)

    用于回报预测和交易的条件自动编码器 本节主要介绍自编码器在资产定价中的应用. 应用步骤分为: 第一步:创建包含股价和元数据信息的新数据集 第二步:计算预测资产特征 第三步:创建和训练条件式自动编码器架 ...

  3. 数独项目--关键代码展示:

    关键代码展示: //判断该数字在当前数独是否符合要求 int judge(int num, int ple){ int x = ple / 9; //x表示数字的纵坐标 int y = ple % 9 ...

  4. [2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析

    [2021-CVPR] Jigsaw Clustering for Unsupervised Visual Representation Learning 论文简析及关键代码简析 论文:https:/ ...

  5. 编写程序描述影视歌三栖艺人 需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人。 实现思路及关键代码 1)分析影视歌三栖艺人的特性 a)可以演电影 b)可以演电视剧 c)可以唱歌

    编写程序描述影视歌三栖艺人 需求说明:请使用面向对象的思想,设计自定义类,描述影视歌三梄艺人. 实现思路及关键代码 1)分析影视歌三栖艺人的特性 a)可以演电影 b)可以演电视剧 c)可以唱歌 2)定 ...

  6. JAVA 网络聊天程序设计与实现(附关键代码) 可群聊私聊发送图片

    1 需求分析 经分析,本程序是一个C/S结构,使用TCP协议实现聊天功能,需要实现的功能有如下几点. 本程序需要有客户端以及服务器端. 客户端应有良好的交互界面,服务器端应有转发客户端发来的消息和临时 ...

  7. 原生安卓开发app的框架frida常用关键代码定位

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 多情却似总无情,唯觉樽前笑不成. ...

  8. ztree 树怎么写 简单树 关键代码

    只上关键代码,花了我一天半的时间研究,不容易啊!!!!!!!!!!!!!!!!!!!!!!! //******************************************树树树ztree* ...

  9. Ext结合DWR的关键代码(运行成功的DWRProxy)

    关键代码如下: Store为: var ds = new Ext.data.Store({ proxy: new Ext.data.DWRProxy({ callback: Folder.getMes ...

最新文章

  1. 2008找回企业久违的网速
  2. blog摘录--测试感触
  3. Linux 防火墙命令的操作命令CentOS
  4. golang协程退出
  5. php将配置信息写入文件,Php写入配置文件的经典漏洞
  6. 一套比较完整的前端技术选型,需要规整哪些东西,你知道不?
  7. 格兰杰因果关系检验_混频(mixed frequency)数据的格兰杰因果(Grange causality)检验及其Matlab实现...
  8. CIT 中文笔记完整版
  9. GitHub C 和 C++ 开源库的清单(含示例代码)
  10. 2022年2月份谷哥学术资源分下下载列表:19/20
  11. java 1.6 jre 下载_jre1.6 64位官方下载
  12. Unity EasyAR图像跟踪
  13. 云原生开发平台的选择
  14. elasticsearch.exceptions.SSLError: ConnectionError([SSL: CERTIFICATE_VERIFY_FAILED] certificate veri
  15. java pgm_java - 如何用Java读取PGM图像? - 堆栈内存溢出
  16. Spring Boot + Vue 前后端分离开发,前端网络请求封装与配置
  17. CString、CStringA 和 CStringW
  18. Android中的多线程编程与异步处理
  19. 单片机总结及实训QY-BC12
  20. 集齐支付宝福卡秘籍来了!

热门文章

  1. 【时空序列】AAAI2021| 利用时空融合图神经网络进行交通流量预测
  2. Java日期格式化字母含义
  3. 一级域名怎么申请二级域名
  4. 黄宇清 java_二面笔记 2015.9.19
  5. 媒体:中国大学不应培养“精致的利己主义者”
  6. matlab中 hold on 与 hold off,figure作用
  7. 用Photoshop画气泡
  8. 移动端大图缩放模糊_移动端png小图片显示模糊
  9. win10笔记本外接屏幕不清晰的解决方法
  10. 阿里云URL转发类问题排查