看了Deep Auto-encoder,然后实现了一下,但是发现要初始化好参数,不然可能效果不佳。Deep Auto-encoder的实现

SDAE的思想是每次训练一层网络,训练好了之后将此网络的输入当做下一层网络的输入,用于训练下一层网络。这样当前k层训练好之后,再训练第k+1层,而不是像我上面那个文章一样,一次性将k层一起训练了。将每层都训练好之后,再结合起来进行训练(fine-tune),这样能够达到比较好的效果。

SDAE的思想可以再搜一下,可以了解更清楚。

实现效果:
单独训练好每一层的网络,然后测试一下效果(上面是原图,下面是编码再解码的图片):

然后将网络结合起来进行训练,下面是迭代6000次的效果,测试的时候发现有的图片效果很棒,有的效果不太好(上面是原图,下面是编码再解码的图片):

上面的效果encoder的最后一层神经元有30个,即将28 x 28的图片降到30维,然后再从30维转回图片的效果。
但是30维不好显示在二维图形上面,所以下面将30换成2,然后用散点图进行显示。

重新训练,将图片降到2维之后,再从2维解码生成图片,效果如下:

从测试集中选取了3000个图片,然后通过encoder进行编码,降到2维,绘制效果如下:

可以看出0,1,2,6的被分隔得很开,其他的会重叠在一起。

上面的实验结果都是没有加入噪声数据的,加入20%的噪声数据,即随机将图片上面的像素值设置为0,效果如下(上面的是噪声图片,下面是编码再解码生成的图片):


可以看出,SDAE可以从噪声数据进行降维,然后生成去噪的图片,效果还是不错的。上面的效果是降到10维的效果。
降到2维的效果:


不知道为什么加了噪声之后,生成的图片反而没有黑点了,有点神奇。

代码:

# coding=utf-8from keras.datasets import mnist
from keras.layers import Input, Dense, Reshape,Flatten
from keras.models import Sequential, Model
from keras.optimizers import Adam, SGD
from keras.layers.convolutional import UpSampling2D, Conv2D,MaxPooling2D,Conv2DTranspose
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import sys
import os
import numpy as np
from tensorflow.examples.tutorials.mnist import input_dataimg_height = 28
img_width = 28
batch_size = 64
mnist = input_data.read_data_sets('../data/MNIST_data', one_hot=True)def img_to_code(img_input):if trained_encoder is not None:return trained_encoder.predict(img_input)else:return img_inputdef noise(code):idx = np.around(np.random.uniform(0.,code.shape[1]-1,size=int(code.shape[1]/5))).astype(np.int)noise_code = np.copy(code)noise_code[:,idx] = 0return noise_codedef train_one_by_one():epochs = 3000delta = 0trained_encoder = Nonelayers = [28 * 28, 700, 400, 200, 50,10,2]decoders = []for i in range(len(layers) - 1):encoder = Sequential()if i == len(layers) -2:encoder.add(Dense(units=layers[i + 1]))else:encoder.add(Dense(units=layers[i + 1],activation='sigmoid'))decoder = Sequential()decoder.add(Dense(units=layers[i], activation='sigmoid'))encoder_input = Input(shape=(layers[i],))code = encoder(encoder_input)reconstruct_code = decoder(code)combined = Model(encoder_input, reconstruct_code)optimizer = Adam(0.001)combined.compile(loss='mse', optimizer=optimizer)for j in range(epochs):imgs, _ = mnist.train.next_batch(batch_size)# 由之前训练好的encoder 将image转成code  如果没有训练过的encoder 那code就是imagecode = imgs if (trained_encoder is None) else trained_encoder.predict(imgs)noise_code = noise(code)loss = combined.train_on_batch(noise_code, code)if j % 50 == 0:print("%d layer,loss:%f"%(i,loss))# 经过上面的for循环 已经又训练好了一层encoder  将encoder与之前的合并if trained_encoder is None:trained_encoder = encoderelse:img_input = Input(shape=[img_width * img_height])input_code = trained_encoder(img_input)code = encoder(input_code)trained_encoder = Model(img_input,code)# 保存当前encoder 对应的decoderdecoders.append(decoder)epochs += delta  #每层增加1000次迭代次数img_input = Input(shape=[img_width * img_height])decoders.reverse()last_decode = trained_encoder(img_input)for decoder in decoders:last_decode = decoder(last_decode)combined = Model(img_input, last_decode)combined.compile(loss='mse', optimizer=optimizer)return trained_encoder,combineddef train(combined,epochs):losses = []for i in range(epochs):imgs, labels = mnist.train.next_batch(batch_size)noise_imgs = noise(imgs)loss = combined.train_on_batch(noise_imgs, imgs)if i >= 20 and i % 5 == 0:print("epoch:%d,loss:%f" % (i, loss))losses.append(loss)plt.plot(np.arange(20, epochs, 5), losses)plt.show()picture_num = 4
def test(combined):figure_num = 1for _ in range(picture_num):imgs, labels = mnist.test.next_batch(3)noise_imgs = noise(imgs)score = combined.evaluate(noise_imgs, imgs, verbose=0)print("Test loss:", score)output_imgs = combined.predict(noise_imgs)for i in range(3):plt.figure(figure_num)plt.subplot(2, 3, i + 1)  # 两行一列的第一个子图plt.imshow(noise_imgs[i].reshape((28, 28)), cmap='gray')plt.subplot(2, 3, i + 1 + 3)  # 两行一列的第二个子图plt.imshow(output_imgs[i].reshape((28, 28)), cmap='gray')figure_num += 1def plot_low_dimension():imgs, labels = mnist.test.next_batch(3000)labels = np.transpose(np.nonzero(labels))[:,1]codes = encoder.predict(imgs)plt.figure(10)i = 0for color in ['red','blue','green','black','chocolate','silver','lawngreen','darkcyan','lawngreen','c']:y = (labels.T == i)x = codes[y]plt.scatter(x[:,0],x[:,1],c=color,label=str(i),alpha=0.6,edgecolors='white')i+=1plt.title('Scatter')plt.xlabel('x')plt.ylabel('y')plt.legend(loc='best')plt.show()def plot_3d():imgs, labels = mnist.test.next_batch(3000)labels = np.transpose(np.nonzero(labels))[:,1]codes = encoder.predict(imgs)plt.figure(4)ax = Axes3D(fig)i = 0for color in ['red','blue','green','black','chocolate','silver','lawngreen','darkcyan','lawngreen','c']:y = (labels.T == i)x = codes[y]plt.scatter(x[:,0],x[:,1],x[:,2],c=color,label=str(i),alpha=0.6,edgecolors='white')i+=1# 绘制图例ax.legend(loc='best')# 添加坐标轴(顺序是Z, Y, X)ax.set_zlabel('Z', fontdict={'size': 15, 'color': 'red'})ax.set_ylabel('Y', fontdict={'size': 15, 'color': 'red'})ax.set_xlabel('X', fontdict={'size': 15, 'color': 'red'})# 展示plt.show()if __name__ == '__main__':encoder, combined = train_one_by_one()train(combined, 6000)test(combined)#     plot_low_dimension()

用Keras实现SDAE相关推荐

  1. Keras框架下的保存模型和加载模型

    在Keras框架下训练深度学习模型时,一般思路是在训练环境下训练出模型,然后拿训练好的模型(即保存模型相应信息的文件)到生产环境下去部署.在训练过程中我们可能会遇到以下情况: 需要运行很长时间的程序在 ...

  2. TensorFlow Keras API用法

    TensorFlow Keras API用法 Keras 是与 TensorFlow 一起使用的更高级别的作为后端的 API.添加层就像添加一行代码一样简单.在模型架构之后,使用一行代码,可以编译和拟 ...

  3. Keras神经网络集成技术

    Keras神经网络集成技术 create_keras_neuropod 将Keras模型打包为神经网络集成包.目前,上文已经支持TensorFlow后端. create_keras_neuropod( ...

  4. 常用深度学习框——Caffe/TensorFlow / Keras/ PyTorch/MXNet

    常用深度学习框--Caffe/TensorFlow / Keras/ PyTorch/MXNet 一.概述 近几年来,深度学习的研究和应用的热潮持续高涨,各种开源深度学习框架层出不穷,包括Tensor ...

  5. Keras运行速度越来越慢的问题

    Keras运行迭代一定代数以后,速度越来越慢,经检查是因为在循环迭代过程中增加了新的计算节点,导致计算节点越来越多,内存被占用完,速度变慢.判断是否在循环迭代过程中增加了新的计算节点,可以用下面的语句 ...

  6. Keras ImageDataGenerator用于数据扩充/增强的原理及方法

    摘要 在这篇博客中,您将学习如何使用Keras的ImageDataGenerator类执行数据扩充/增强.另外将介绍什么是数据增强,数据增强的类型,为什么使用数据增强以及它能做什么/不能做什么. 有三 ...

  7. Keras TensorFlow教程:使用自己的数据集进行训练

    大多数Keras教程都尝试使用图像分类数据集(如MNIST(手写识别)或基本对象CIFAR-10(基本对象识别))来开启Keras库的基础知识学习. 这篇文章将对Keras入门教程进行不同的尝试.使用 ...

  8. Python搭建Keras CNN模型破解网站验证码

    在本项目中,将会用Keras来搭建一个稍微复杂的CNN模型来破解以上的验证码.验证码如下: 利用Keras可以快速方便地搭建CNN模型,本项目搭建的CNN模型如下: 将数据集分为训练集和测试集,占比为 ...

  9. keras 的 example 文件 mnist_swwae.py 解析

    首先,该代码在新版本下会运行失败,根据 https://github.com/keras-team/keras/pull/13712/commits,需要把文件C:\ProgramData\Minic ...

最新文章

  1. 人工智能3d建模算法_打破国外垄断,全国产3D芯片为机器人“点睛”
  2. OC画笔CGContextRef
  3. 【Android NDK 开发】JNI 方法解析 ( C/C++ 调用 Java 方法 | 函数签名 | 调用对象方法 | 调用静态方法 )
  4. 腾讯----小Q的歌单
  5. 英特尔Nehalem微架构三级缓存原理学习
  6. Java EE的三层架构
  7. 360浏览器5兼容模式吗_个独模式真能将企业总体税负降低至5%吗,为何大家都热衷核定征收...
  8. [Leetcode][第99题][JAVA][恢复二叉搜索树][中序遍历]
  9. LeetCode 751. IP 到 CIDR(贪心)
  10. java画虚线_在java中绘制虚线
  11. VScode 同时开多个窗口
  12. Python实战之Selenium自动化测试web刷新FW
  13. SaaSBase:什么是SAP(思爱普) ERP?
  14. python开发bi报表_BI报表分析和数据可视化,推荐这三个开源工具!
  15. html设置列表编号起始值,Word多级编号怎么设置,要按我的要求作为起始值?
  16. Multisim基础 共阴极数码管是com_k,共阳极数码管是com_a
  17. 求职经验贴-描述笔者当时找工作情形
  18. 国内可用的 ChatGPT
  19. 《Python股票量化交易从入门到实践》随书赠送“回测框架”的使用帮助
  20. WIN10,配置adb环境

热门文章

  1. android仿新浪微博随便看看
  2. 赵本山2007春节晚会小品 - 全集披露(超级搞笑)
  3. window下查看网页保存的密码
  4. Android Java汉字转拼音总结
  5. 2020年中国激光切割头行业竞争现状分析,国外厂商高端市场优势明显「图」
  6. go windows锁屏 关闭桌面(杀掉文件资源管理器)
  7. Java中对于面向对象思想的理解
  8. 首款搭载HarmonyOS,华为首款搭载Harmonyos体验分布式技术的摄像头发布
  9. java多态实现动物叫唤_Java多态实现
  10. 如何在“动物杂交:新视野”中与朋友联系