keras自动编码器实现系列之卷积自动编码器操作


Posted in Python onJuly 03, 2020

图片的自动编码很容易就想到用卷积神经网络做为编码-解码器。在实际的操作中,

也经常使用卷积自动编码器去解决图像编码问题,而且非常有效。

下面通过**keras**完成简单的卷积自动编码。 编码器有堆叠的卷积层和池化层(max pooling用于空间降采样)组成。 对应的解码器由卷积层和上采样层组成。

@requires_authorization
# -*- coding:utf-8 -*-

from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
from keras.models import Model
from keras import backend as K
import os

## 网络结构 ##
input_img = Input(shape=(28,28,1)) # Tensorflow后端, 注意要用channel_last
# 编码器部分
x = Conv2D(16, (3,3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2,2), padding='same')(x)
x = Conv2D(8,(3,3), activation='relu', padding='same')(x)
x = MaxPooling2D((2,2), padding='same')(x)
x = Conv2D(8, (3,3), activation='relu', padding='same')(x)
encoded = MaxPooling2D((2,2), padding='same')(x)

# 解码器部分
x = Conv2D(8, (3,3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3,3), activation='relu', padding='same')(x) 
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)

autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

# 得到编码层的输出
encoder_model = Model(inputs=autoencoder.input, outputs=autoencoder.get_layer('encoder_out').output)

## 导入数据, 使用常用的手写识别数据集
def load_mnist(dataset_name):
'''
load the data
'''
  data_dir = os.path.join("./data", dataset_name)
  f = np.load(os.path.join(data_dir, 'mnist.npz'))
  train_data = f['train'].T
  trX = train_data.reshape((-1, 28, 28, 1)).astype(np.float32)
  trY = f['train_labels'][-1].astype(np.float32)
  test_data = f['test'].T
  teX = test_data.reshape((-1, 28, 28, 1)).astype(np.float32)
  teY = f['test_labels'][-1].astype(np.float32)

  # one-hot 
  # y_vec = np.zeros((len(y), 10), dtype=np.float32)
  # for i, label in enumerate(y):
  #   y_vec[i, y[i]] = 1
  # keras.utils里带的有one-hot的函数, 就直接用那个了
  return trX / 255., trY, teX/255., teY

# 开始导入数据
x_train, _ , x_test, _= load_mnist('mnist')

# 可视化训练结果, 我们打开终端, 使用tensorboard
# tensorboard --logdir=/tmp/autoencoder # 注意这里是打开一个终端, 在终端里运行

# 训练模型, 并且在callbacks中使用tensorBoard实例, 写入训练日志 http://0.0.0.0:6006
from keras.callbacks import TensorBoard
autoencoder.fit(x_train, x_train,
        epochs=50,
        batch_size=128,
        shuffle=True,
        validation_data=(x_test, x_test),
        callbacks=[TensorBoard(log_dir='/tmp/autoencoder')])

# 重建图片
import matplotlib.pyplot as plt 
decoded_imgs = autoencoder.predict(x_test)
encoded_imgs = encoder_model.predict(x_test)
n = 10
plt.figure(figsize=(20, 4))
for i in range(n):
  k = i + 1
  # 画原始图片
  ax = plt.subplot(2, n, k)
  plt.imshow(x_test[k].reshape(28, 28))
  plt.gray()
  ax.get_xaxis().set_visible(False)
  # 画重建图片
  ax = plt.subplot(2, n, k + n)
  plt.imshow(decoded_imgs[i].reshape(28, 28))
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)
plt.show()

# 编码得到的特征
n = 10
plt.figure(figsize=(20, 8))
for i in range(n):
  k = i + 1
  ax = plt.subplot(1, n, k)
  plt.imshow(encoded[k].reshape(4, 4 * 8).T)
  plt.gray()
  ax.get_xaxis().set_visible(False)
  ax.get_yaxis().set_visible(False)
plt.show()

补充知识:keras搬砖系列-单层卷积自编码器

考试成绩出来了,竟然有一门出奇的差,只是有点意外。

觉得应该不错的,竟然考差了,它估计写了个随机数吧。

头文件

from keras.layers import Input,Dense
from keras.models import Model 
from keras.datasets import mnist
import numpy as np 
import matplotlib.pyplot as plt

导入数据

(X_train,_),(X_test,_) = mnist.load_data()
 
X_train = X_train.astype('float32')/255.
X_test = X_test.astype('float32')/255.
X_train = X_train.reshape((len(X_train),-1))
X_test = X_test.reshape((len(X_test),-1))

这里的X_train和X_test的维度分别为(60000L,784L),(10000L,784L)

这里进行了归一化,将所有的数值除上255.

设定编码的维数与输入数据的维数

encoding_dim = 32

input_img = Input(shape=(784,))

构建模型

encoded = Dense(encoding_dim,activation='relu')(input_img)
decoded = Dense(784,activation='relu')(encoded)
 
autoencoder = Model(inputs = input_img,outputs=decoded)
encoder = Model(inputs=input_img,outputs=encoded)
 
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
deconder = Model(inputs=encoded_input,outputs = decoder_layer(encoded_input))

模型编译

autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')

模型训练

autoencoder.fit(X_train,X_train,epochs=50,batch_size=256,shuffle=True,validation_data=(X_test,X_test))

预测

encoded_imgs = encoder.predict(X_test)

decoded_imgs = deconder.predict(encoded_imgs)

数据可视化

n = 10
for i in range(n):
 ax = plt.subplot(2,n,i+1)
 plt.imshow(X_test[i].reshape(28,28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 ax = plt.subplot(2,n,i+1+n)
 plt.imshow(decoded_imgs[i].reshape(28,28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()

完成代码

from keras.layers import Input,Dense
from keras.models import Model 
from keras.datasets import mnist
import numpy as np 
import matplotlib.pyplot as plt 
 
(X_train,_),(X_test,_) = mnist.load_data()
 
X_train = X_train.astype('float32')/255.
X_test = X_test.astype('float32')/255.
X_train = X_train.reshape((len(X_train),-1))
X_test = X_test.reshape((len(X_test),-1))
 
encoding_dim = 32
input_img = Input(shape=(784,))
 
encoded = Dense(encoding_dim,activation='relu')(input_img)
decoded = Dense(784,activation='relu')(encoded)
 
autoencoder = Model(inputs = input_img,outputs=decoded)
encoder = Model(inputs=input_img,outputs=encoded)
 
encoded_input = Input(shape=(encoding_dim,))
decoder_layer = autoencoder.layers[-1]
deconder = Model(inputs=encoded_input,outputs = decoder_layer(encoded_input))
 
autoencoder.compile(optimizer='adadelta',loss='binary_crossentropy')
autoencoder.fit(X_train,X_train,epochs=50,batch_size=256,shuffle=True,validation_data=(X_test,X_test))
 
encoded_imgs = encoder.predict(X_test)
decoded_imgs = deconder.predict(encoded_imgs)
 
##via
n = 10
for i in range(n):
 ax = plt.subplot(2,n,i+1)
 plt.imshow(X_test[i].reshape(28,28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
 
 ax = plt.subplot(2,n,i+1+n)
 plt.imshow(decoded_imgs[i].reshape(28,28))
 plt.gray()
 ax.get_xaxis().set_visible(False)
 ax.get_yaxis().set_visible(False)
plt.show()

以上这篇keras自动编码器实现系列之卷积自动编码器操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
python aiohttp的使用详解
Jun 20 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
NumPy统计函数的实现方法
Jan 21 Python
Python字符编码转码之GBK,UTF8互转
Feb 09 Python
Python作用域与名字空间原理详解
Mar 21 Python
Python count函数使用方法实例解析
Mar 23 Python
Python如何把Spark数据写入ElasticSearch
Apr 18 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
scrapy实践之翻页爬取的实现
Jan 05 Python
Python with语句用法原理详解
Jul 03 #Python
Keras搭建自编码器操作
Jul 03 #Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 #Python
python图片验证码识别最新模块muggle_ocr的示例代码
Jul 03 #Python
keras topN显示,自编写代码案例
Jul 03 #Python
python如何使用代码运行助手
Jul 03 #Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 #Python
You might like
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
php数组函数array_key_exists()小结
2015/12/10 PHP
微信公众号开发之通过接口删除菜单
2017/02/20 PHP
JavaScript Cookie 直接浏览网站分网址
2009/12/08 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
javascript中Array()数组函数详解
2015/08/23 Javascript
基于jQuery Ajax实现上传文件
2016/03/24 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
纯JS实现弹性导航条效果
2017/03/06 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
element-ui的回调函数Events的用法详解
2018/10/16 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
vue拖拽排序插件vuedraggable使用方法详解
2020/08/21 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
微信小程序如何连接Java后台
2019/08/08 Javascript
微信小程序拼接图片链接无底洞深入探究
2019/09/03 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
vue实现拖拽进度条
2021/03/01 Vue.js
详解Django解决ajax跨域访问问题
2018/08/24 Python
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
python爬取微信公众号文章的方法
2019/02/26 Python
Django自带的加密算法及加密模块详解
2019/12/03 Python
用 Python 制作地球仪的方法
2020/04/24 Python
python模块如何查看
2020/06/16 Python
函授自我鉴定
2013/11/06 职场文书
周年庆促销方案
2014/03/15 职场文书
安全环保演讲稿
2014/08/28 职场文书
2014年仓库工作总结
2014/11/20 职场文书
运动会开幕词
2015/01/28 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
大学班干部竞选稿
2015/11/20 职场文书
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers