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

以下使用单隐层训练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()

结果如下:

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

最新文章

  1. maven之一:maven安装和eclipse集成
  2. Android系统拍照源码
  3. golang AES/ECB/PKCS5 加密解密 url-safe-base64
  4. jQuery Mobile 1.1八大新特性介绍
  5. 也说说EM
  6. Java之Static静态修饰符详解
  7. [转]Creating an iPhone Daemon
  8. C#爬虫系列(一)——国家标准全文公开系统
  9. zookeeper伪分布式集群环境搭建
  10. Android与js互相调用
  11. 三:OVS+GRE之完整网络流程
  12. Visual Studio 2013 编译 64 位 Python 的 C 扩展 (使用 PyObject 包装)
  13. 录毛线脚本,直接抓包手写最简洁的LoadRunner性能测试脚本
  14. (链表 递归) leetcode 24. Swap Nodes in Pairs
  15. 图集内子图压缩及 ETC2 fallback选项的作用
  16. js 动画效果实现
  17. 电脑cpu100%的原因
  18. 微服务统一登陆认证怎么做?JWT ?
  19. Json转list,二层解析转换
  20. Python3基础 str format 输出花括号{}

热门文章

  1. WPF界面开发:DevExpress WPF在GridControl中固定行时处理时刻
  2. Nuxt 服务端渲染
  3. PHP类的设计模式
  4. 使用fiddler抓取jmeter发送的请求
  5. 【winfrom-多语言】实现多语言切换:使用资源文件
  6. WPF显示数据库内容
  7. noi.ac #536 打地鼠
  8. Fantasy of a Summation (LightOJ - 1213)(快速幂+简单思维)
  9. CentOS 7下使用Apache2部署Django项目,解决文件名中含有中文报错的问题
  10. Python中导入类