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中Flask框架简单入门实例
Mar 21 Python
Python函数参数类型*、**的区别
Apr 11 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
利用Python实现图书超期提醒
Aug 02 Python
python中defaultdict的用法详解
Jun 07 Python
使用python实现快速搭建简易的FTP服务器
Sep 12 Python
局域网内python socket实现windows与linux间的消息传送
Apr 19 Python
Python中asyncio模块的深入讲解
Jun 10 Python
Python list与NumPy array 区分详解
Nov 06 Python
python:动态路由的Flask程序代码
Nov 22 Python
Python表达式的优先级详解
Feb 18 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 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
如何对PHP程序中的常见漏洞进行攻击
2006/10/09 PHP
PHP的error_reporting错误级别变量对照表
2014/07/08 PHP
ThinkPHP单字母函数(快捷方法)使用总结
2014/07/23 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
php5.3不能连接mssql数据库的解决方法
2014/12/27 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
windows7配置Nginx+php+mysql的详细教程
2016/09/04 PHP
轻松实现php文件上传功能
2017/02/17 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
前端开发必须知道的JS之原型和继承
2010/07/06 Javascript
基于jquery的表头固定的若干方法
2011/01/27 Javascript
基于jquery实现拆分姓名的方法(纯JS版)
2013/05/08 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
canvas绘制环形进度条
2017/02/23 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
微信小程序实现侧边栏分类
2019/10/21 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
对Python字符串中的换行符和制表符介绍
2018/05/03 Python
pywinauto自动化操作记事本
2019/08/26 Python
python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解
2020/02/11 Python
Django中的session用法详解
2020/03/09 Python
基于Python测试程序是否有错误
2020/05/16 Python
Python+MySQL随机试卷及答案生成程序的示例代码
2021/02/01 Python
马来西亚网上花店:FlowerAdvisor马来西亚
2020/01/03 全球购物
几个Linux面试题笔试题
2016/08/01 面试题
环保公益广告语
2014/03/13 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
期中考试后的感想
2015/08/07 职场文书
多人股份制合作协议书
2016/03/19 职场文书