自编码器可以用于降维,添加噪音学习也可以获得去噪的效果。

以下使用单隐层训练mnist数据集,并且共享了对称的权重参数。

模型本身不难,调试的过程中有几个需要注意的地方:

  • 模型对权重参数初始值敏感,所以这里对权重参数w做了一些限制
  • 需要对数据标准化
  • 学习率设置合理(Adam,0.001)

1,建立模型

import numpy as np
import tensorflow as tf class AutoEncoder(object):
'''
使用对称结构,解码器重用编码器的权重参数
'''
def __init__(self, input_shape, h1_size, lr):
tf.reset_default_graph()# 重置默认计算图,有时出错后内存还一团糟
with tf.variable_scope('auto_encoder', reuse=tf.AUTO_REUSE):
self.W1 = self.weights(shape=(input_shape, h1_size), name='h1')
self.b1 = self.bias(h1_size)
self.W2 = tf.transpose(tf.get_variable('h1')) # 共享参数,使用其转置
self.b2 = self.bias(input_shape)
self.lr = lr
self.input = tf.placeholder(shape=(None, input_shape),
dtype=tf.float32)
self.h1_out = tf.nn.softplus(tf.matmul(self.input, self.W1) + self.b1)# softplus,类relu
self.out = tf.matmul(self.h1_out, self.W2) + self.b2
self.optimizer = tf.train.AdamOptimizer(learning_rate=self.lr)
self.loss = 0.1 * tf.reduce_sum(
tf.pow(tf.subtract(self.input, self.out), 2))
self.train_op = self.optimizer.minimize(self.loss)
self.sess = tf.Session()
self.sess.run(tf.global_variables_initializer()) def fit(self, X, epoches=100, batch_size=128, epoches_to_display=10):
batchs_per_epoch = X.shape[0] // batch_size
for i in range(epoches):
epoch_loss = []
for j in range(batchs_per_epoch):
X_train = X[j * batch_size:(j + 1) * batch_size]
loss, _ = self.sess.run([self.loss, self.train_op],
feed_dict={self.input: X_train})
epoch_loss.append(loss)
if i % epoches_to_display == 0:
print('avg_loss at epoch %d :%f' % (i, np.mean(epoch_loss)))
# return self.sess.run(W1) # 权重初始化参考别人的,这个居然很重要!用自己设定的截断正态分布随机没有效果
def weights(self, shape, name, constant=1):
fan_in = shape[0]
fan_out = shape[1]
low = -constant * np.sqrt(6.0 / (fan_in + fan_out))
high = constant * np.sqrt(6.0 / (fan_in + fan_out))
init = tf.random_uniform_initializer(minval=low, maxval=high)
return tf.get_variable(name=name,
shape=shape,
initializer=init,
dtype=tf.float32) def bias(self, size):
return tf.Variable(tf.constant(0, dtype=tf.float32, shape=[size])) def encode(self, X):
return self.sess.run(self.h1_out, feed_dict={self.input: X}) def decode(self, h):
return self.sess.run(self.out, feed_dict={self.h1_out: h}) def reconstruct(self, X):
return self.sess.run(self.out, feed_dict={self.input: X})

2,加载数据及预处理

from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data() import random
X_train = X_train.reshape(-1, 784)
# 测试集里随机10个图片用做测试
test_idxs = random.sample(range(X_test.shape[0]), 10)
data_test = X_test[test_idxs].reshape(-1, 784)
# 标准化
import sklearn.preprocessing as prep
processer = prep.StandardScaler().fit(X_train) # 这里还是用全部数据好,这个也很关键!
X_train = processer.transform(X_train)
X_test = processer.transform(data_test) # 随机5000张图片用做训练
idxs = random.sample(range(X_train.shape[0]), 5000)
data_train = X_train[idxs]

3,训练

model = AutoEncoder(784, 200, 0.001)  # 学习率对loss影响也有点大
model.fit(data_train, batch_size=128, epoches=200) # 200轮即可

4,测试,可视化对比图

decoded_test = model.reconstruct(X_test)

import matplotlib.pyplot as plt
%matplotlib inline
shape = (28, 28)
fig, axes = plt.subplots(2,10,
figsize=(10, 2),
subplot_kw={
'xticks': [],
'yticks': []
},
gridspec_kw=dict(hspace=0.1, wspace=0.1))
for i in range(10):
axes[0][i].imshow(np.reshape(X_test[i], shape))
axes[1][i].imshow(np.reshape(decoded_test[i], shape))
plt.show()

结果如下:

以上,可以在输入中添加点高斯噪音,增加鲁棒性。

TensorFlow自编码器(AutoEncoder)之MNIST实践的更多相关文章

  1. 用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识

    用tensorflow搭建RNN(LSTM)进行MNIST 手写数字辨识 循环神经网络RNN相比传统的神经网络在处理序列化数据时更有优势,因为RNN能够将加入上(下)文信息进行考虑.一个简单的RNN如 ...

  2. 吴裕雄 PYTHON 神经网络——TENSORFLOW 双隐藏层自编码器设计处理MNIST手写数字数据集并使用TENSORBORD描绘神经网络数据2

    import os import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data os.envi ...

  3. 吴裕雄 PYTHON 神经网络——TENSORFLOW 单隐藏层自编码器设计处理MNIST手写数字数据集并使用TensorBord描绘神经网络数据

    import os import numpy as np import tensorflow as tf import matplotlib.pyplot as plt from tensorflow ...

  4. 学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

    分布式TensorFlow由高性能gRPC库底层技术支持.Martin Abadi.Ashish Agarwal.Paul Barham论文<TensorFlow:Large-Scale Mac ...

  5. 深度学习之自编码器AutoEncoder

    原文地址:https://blog.csdn.net/marsjhao/article/details/73480859 一.什么是自编码器(Autoencoder) 自动编码器是一种数据的压缩算法, ...

  6. Tesorflow-自动编码器(AutoEncoder)

    直接附上代码: import numpy as np import sklearn.preprocessing as prep import tensorflow as tf from tensorf ...

  7. tensorflow学习笔记五:mnist实例--卷积神经网络(CNN)

    mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的.但是CNN层数要多一些,网络模型需要自己来构建. 程序比较复杂,我就分成几个部分来叙述. 首先,下载并加载数据: import ...

  8. tensorflow学习笔记四:mnist实例--用简单的神经网络来训练和测试

    刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第一个例子,就从神经网络开始. 神经网络没有卷积功能,只有简单的三层:输入层,隐藏层和输 ...

  9. Tensorflow学习笔记(对MNIST经典例程的)的代码注释与理解

    1 #coding:utf-8 # 日期 2017年9月4日 环境 Python 3.5  TensorFlow 1.3 win10开发环境. import tensorflow as tf from ...

随机推荐

  1. jquery实现在光标位置(input、textarea)插入内容的方法

    通过扫码枪扫码.按钮点击事件在光标处插入文本,这是前台js常用的功能.但是在input输入框和textarea文本框定位光标,插入数据是有点不同的 首先最简单的,适用于input输入框的方法 HTML ...

  2. (转载)Google 发布 Android 性能优化典范

    2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android  App.课程专题不仅仅介绍了Android系统中 ...

  3. Http 数据操作

    /// <summary> /// 上传数据参数 /// </summary> public class UploadEventArgs : EventArgs { int b ...

  4. 解压 压缩 C#

    public class SharpZip { public SharpZip() { } /// <summary> /// 压缩 /// </summary> /// &l ...

  5. [winafl]这几天的折腾

    1.自己写的exe 2.自己写的dll,然后写了接口程序去load...但是这个速度真是迷醉 先把基本的几种类型跑起来,再解决速度和样本的问题...

  6. 如何查询Office版本号

     造冰箱的大熊猫@cnblogs 2019/1/28 如何查询当前所用Microsoft Office的版本信息? 以Word 2007为例,点击程序左上角的Office图标,在弹出的菜单中选择“Wo ...

  7. Confluence 6 分享一个文件

    协同合作和编辑不仅仅是发生在页面中,很多时候你需要与你的项目小组针对文档,报告,图片,表格进行协同操作.不管是针对性的市场计划或者一个完整的项目计划,你可以在 Confluence 中让你的项目小组成 ...

  8. 全网最!详!细!tarjan算法讲解。——转载自没有后路的路

    全网最!详!细!tarjan算法讲解.   全网最详细tarjan算法讲解,我不敢说别的.反正其他tarjan算法讲解,我看了半天才看懂.我写的这个,读完一遍,发现原来tarjan这么简单! tarj ...

  9. Spring Boot教程(四十)使用Flyway来管理数据库版本

    在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作.在实现这个例子的时候,我们事先在MySQL中创建了用户表.创建表的过程我们在实 ...

  10. linux修改ulimit参数

    有如下三种修改方式: 1.在/etc/rc.local 中增加一行 ulimit -SHn 655352.在/etc/profile 中增加一行 ulimit -SHn 655353.在/etc/se ...