- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章TensorFlow实现AutoEncoder自编码器由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、概述 。
AutoEncoder大致是一个将数据的高维特征进行压缩降维编码,再经过相反的解码过程的一种学习方法。学习过程中通过解码得到的最终结果与原数据进行比较,通过修正权重偏置参数降低损失函数,不断提高对原数据的复原能力。学习完成后,前半段的编码过程得到结果即可代表原数据的低维“特征值”。通过学习得到的自编码器模型可以实现将高维数据压缩至所期望的维度,原理与PCA相似.
2、模型实现 。
1. AutoEncoder 。
首先在MNIST数据集上,实现特征压缩和特征解压并可视化比较解压后的数据与原数据的对照.
先看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
import
tensorflow as tf
import
numpy as np
import
matplotlib.pyplot as plt
# 导入MNIST数据
from
tensorflow.examples.tutorials.mnist
import
input_data
mnist
=
input_data.read_data_sets(
"MNIST_data/"
, one_hot
=
False
)
learning_rate
=
0.01
training_epochs
=
10
batch_size
=
256
display_step
=
1
examples_to_show
=
10
n_input
=
784
# tf Graph input (only pictures)
X
=
tf.placeholder(
"float"
, [
None
, n_input])
# 用字典的方式存储各隐藏层的参数
n_hidden_1
=
256
# 第一编码层神经元个数
n_hidden_2
=
128
# 第二编码层神经元个数
# 权重和偏置的变化在编码层和解码层顺序是相逆的
# 权重参数矩阵维度是每层的 输入*输出,偏置参数维度取决于输出层的单元数
weights
=
{
'encoder_h1'
: tf.Variable(tf.random_normal([n_input, n_hidden_1])),
'encoder_h2'
: tf.Variable(tf.random_normal([n_hidden_1, n_hidden_2])),
'decoder_h1'
: tf.Variable(tf.random_normal([n_hidden_2, n_hidden_1])),
'decoder_h2'
: tf.Variable(tf.random_normal([n_hidden_1, n_input])),
}
biases
=
{
'encoder_b1'
: tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2'
: tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b1'
: tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b2'
: tf.Variable(tf.random_normal([n_input])),
}
# 每一层结构都是 xW + b
# 构建编码器
def
encoder(x):
layer_1
=
tf.nn.sigmoid(tf.add(tf.matmul(x, weights[
'encoder_h1'
]),
biases[
'encoder_b1'
]))
layer_2
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights[
'encoder_h2'
]),
biases[
'encoder_b2'
]))
return
layer_2
# 构建解码器
def
decoder(x):
layer_1
=
tf.nn.sigmoid(tf.add(tf.matmul(x, weights[
'decoder_h1'
]),
biases[
'decoder_b1'
]))
layer_2
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights[
'decoder_h2'
]),
biases[
'decoder_b2'
]))
return
layer_2
# 构建模型
encoder_op
=
encoder(X)
decoder_op
=
decoder(encoder_op)
# 预测
y_pred
=
decoder_op
y_true
=
X
# 定义代价函数和优化器
cost
=
tf.reduce_mean(tf.
pow
(y_true
-
y_pred,
2
))
#最小二乘法
optimizer
=
tf.train.AdamOptimizer(learning_rate).minimize(cost)
with tf.Session() as sess:
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if
int
((tf.__version__).split(
'.'
)[
1
]) <
12
and
int
((tf.__version__).split(
'.'
)[
0
]) <
1
:
init
=
tf.initialize_all_variables()
else
:
init
=
tf.global_variables_initializer()
sess.run(init)
# 首先计算总批数,保证每次循环训练集中的每个样本都参与训练,不同于批量训练
total_batch
=
int
(mnist.train.num_examples
/
batch_size)
#总批数
for
epoch
in
range
(training_epochs):
for
i
in
range
(total_batch):
batch_xs, batch_ys
=
mnist.train.next_batch(batch_size)
# max(x) = 1, min(x) = 0
# Run optimization op (backprop) and cost op (to get loss value)
_, c
=
sess.run([optimizer, cost], feed_dict
=
{X: batch_xs})
if
epoch
%
display_step
=
=
0
:
print
(
"Epoch:"
,
'%04d'
%
(epoch
+
1
),
"cost="
,
"{:.9f}"
.
format
(c))
print
(
"Optimization Finished!"
)
encode_decode
=
sess.run(
y_pred, feed_dict
=
{X: mnist.test.images[:examples_to_show]})
f, a
=
plt.subplots(
2
,
10
, figsize
=
(
10
,
2
))
for
i
in
range
(examples_to_show):
a[
0
][i].imshow(np.reshape(mnist.test.images[i], (
28
,
28
)))
a[
1
][i].imshow(np.reshape(encode_decode[i], (
28
,
28
)))
plt.show()
|
代码解读:
首先,导入将要使用到的各种库和数据集,定义各个参数如学习率、训练迭代次数等,清晰明了便于后期修改。由于自编码器的神经网络结构非常有规律性,都是xW + b的结构,故将每一层的权重W和偏置b的变量tf.Variable统一置于一个字典中,通过字典的key值更加清晰明了的描述。模型构建思路上,将编码器部分和解码器部分分开构建,每一层的激活函数使用Sigmoid函数,编码器通常与编码器使用同样的激活函数。通常编码器部分和解码器部分是一个互逆的过程,例如我们设计将784维降至256维再降至128维的编码器,解码器对应的就是从128维解码至256维再解码至784维。定义代价函数,代价函数表示为解码器的输出与原始输入的最小二乘法表达,优化器采用AdamOptimizer训练阶段每次循环将所有的训练数据都参与训练。经过训练,最终将训练结果与原数据可视化进行对照,如下图,还原度较高。如果增大训练循环次数或者增加自编码器的层数,可以得到更好的还原效果.
运行结果:
2. Encoder 。
Encoder编码器工作原理与AutoEncoder相同,我们将编码得到的低维“特征值”在低维空间中可视化出来,直观显示数据的聚类效果。具体地说,将784维的MNIST数据一步步的从784到128到64到10最后降至2维,在2维坐标系中展示遇上一个例子不同的是,在编码器的最后一层中我们不采用Sigmoid激活函数,而是将采用默认的线性激活函数,使输出为(-∞,+∞).
完整代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
import
tensorflow as tf
import
matplotlib.pyplot as plt
from
tensorflow.examples.tutorials.mnist
import
input_data
mnist
=
input_data.read_data_sets(
"MNIST_data/"
, one_hot
=
False
)
learning_rate
=
0.01
training_epochs
=
10
batch_size
=
256
display_step
=
1
n_input
=
784
X
=
tf.placeholder(
"float"
, [
None
, n_input])
n_hidden_1
=
128
n_hidden_2
=
64
n_hidden_3
=
10
n_hidden_4
=
2
weights
=
{
'encoder_h1'
: tf.Variable(tf.truncated_normal([n_input, n_hidden_1],)),
'encoder_h2'
: tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],)),
'encoder_h3'
: tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3],)),
'encoder_h4'
: tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4],)),
'decoder_h1'
: tf.Variable(tf.truncated_normal([n_hidden_4, n_hidden_3],)),
'decoder_h2'
: tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2],)),
'decoder_h3'
: tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1],)),
'decoder_h4'
: tf.Variable(tf.truncated_normal([n_hidden_1, n_input],)),
}
biases
=
{
'encoder_b1'
: tf.Variable(tf.random_normal([n_hidden_1])),
'encoder_b2'
: tf.Variable(tf.random_normal([n_hidden_2])),
'encoder_b3'
: tf.Variable(tf.random_normal([n_hidden_3])),
'encoder_b4'
: tf.Variable(tf.random_normal([n_hidden_4])),
'decoder_b1'
: tf.Variable(tf.random_normal([n_hidden_3])),
'decoder_b2'
: tf.Variable(tf.random_normal([n_hidden_2])),
'decoder_b3'
: tf.Variable(tf.random_normal([n_hidden_1])),
'decoder_b4'
: tf.Variable(tf.random_normal([n_input])),
}
def
encoder(x):
layer_1
=
tf.nn.sigmoid(tf.add(tf.matmul(x, weights[
'encoder_h1'
]),
biases[
'encoder_b1'
]))
layer_2
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights[
'encoder_h2'
]),
biases[
'encoder_b2'
]))
layer_3
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights[
'encoder_h3'
]),
biases[
'encoder_b3'
]))
# 为了便于编码层的输出,编码层随后一层不使用激活函数
layer_4
=
tf.add(tf.matmul(layer_3, weights[
'encoder_h4'
]),
biases[
'encoder_b4'
])
return
layer_4
def
decoder(x):
layer_1
=
tf.nn.sigmoid(tf.add(tf.matmul(x, weights[
'decoder_h1'
]),
biases[
'decoder_b1'
]))
layer_2
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights[
'decoder_h2'
]),
biases[
'decoder_b2'
]))
layer_3
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights[
'decoder_h3'
]),
biases[
'decoder_b3'
]))
layer_4
=
tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights[
'decoder_h4'
]),
biases[
'decoder_b4'
]))
return
layer_4
encoder_op
=
encoder(X)
decoder_op
=
decoder(encoder_op)
y_pred
=
decoder_op
y_true
=
X
cost
=
tf.reduce_mean(tf.
pow
(y_true
-
y_pred,
2
))
optimizer
=
tf.train.AdamOptimizer(learning_rate).minimize(cost)
with tf.Session() as sess:
# tf.initialize_all_variables() no long valid from
# 2017-03-02 if using tensorflow >= 0.12
if
int
((tf.__version__).split(
'.'
)[
1
]) <
12
and
int
((tf.__version__).split(
'.'
)[
0
]) <
1
:
init
=
tf.initialize_all_variables()
else
:
init
=
tf.global_variables_initializer()
sess.run(init)
total_batch
=
int
(mnist.train.num_examples
/
batch_size)
for
epoch
in
range
(training_epochs):
for
i
in
range
(total_batch):
batch_xs, batch_ys
=
mnist.train.next_batch(batch_size)
# max(x) = 1, min(x) = 0
_, c
=
sess.run([optimizer, cost], feed_dict
=
{X: batch_xs})
if
epoch
%
display_step
=
=
0
:
print
(
"Epoch:"
,
'%04d'
%
(epoch
+
1
),
"cost="
,
"{:.9f}"
.
format
(c))
print
(
"Optimization Finished!"
)
encoder_result
=
sess.run(encoder_op, feed_dict
=
{X: mnist.test.images})
plt.scatter(encoder_result[:,
0
], encoder_result[:,
1
], c
=
mnist.test.labels)
plt.colorbar()
plt.show()
|
实验结果:
由结果可知,2维编码特征有较好的聚类效果,图中每个颜色代表了一个数字,聚集性很好.
当然,本次实验所得到的结果只是对AutoEncoder做一个简单的介绍,要想得到期望的效果,还应该设计更加复杂的自编码器结构,得到区分性更好的特征.
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://blog.csdn.net/marsjhao/article/details/68950697 。
最后此篇关于TensorFlow实现AutoEncoder自编码器的文章就讲到这里了,如果你想了解更多关于TensorFlow实现AutoEncoder自编码器的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有更简单的方法来设置数据加载器,因为在自动编码器的情况下输入和目标数据是相同的,并且在训练期间加载数据? DataLoader总是需要两个输入。 目前我这样定义我的数据加载器: X_train
我正在基于医疗保健开展项目,将针对症状和疾病进行自动编码器培训,即我的输入为文本形式。那行得通吗? (我正在使用Rstudio)。请任何人帮助我 最佳答案 您必须将文本转换为向量/数字。要实现诸如“单
有人可以向我解释为什么自动编码器不收敛吗?对我来说,下面两个网络的结果应该是一样的。然而,下面的自动编码器没有收敛,而它下面的网络却是。 # autoencoder implementation, d
我已经在 Tensorflow 中实现了以下自动编码器,如下所示。它基本上将 MNIST 数字作为输入,学习数据的结构并在其输出处再现输入。 from __future__ import divisi
我尝试在 Keras (tf.keras) 中构建一个 Stacked Autoencoder。作者 堆叠 我不是说深 .我为 Keras 找到的所有示例都在生成,例如3 个编码器层,3 个解码器层,
我正在尝试修复我的 Web 应用程序中的 XSS 漏洞,但我受困于 jqGrid。 我为我所有的网格激活了“自动编码”,文档说:“当设置为 true 时,会对传入的(来自服务器)和发布的数据(来自编辑
引发这个问题的具体原因是 return_sequence TensorFlow 版本的 LSTM 层的参数。 文档说: Boolean. Whether to return the last outp
我在实现变分自动编码器时遇到了一个大问题,它是所有图像最终看起来像这样: 当真实图像是这样的: 训练集是 CIFAR10,预期结果是设法构建相似的图像。虽然结果似乎正确预测了特征图,但我不明白为什么
在变分自编码器中,目标函数有两项,一项使输入和输出 x 相同,另一项是正则化,q(z) 和 p(z) 接近 KL 散度。 我不明白的是为什么我们可以假设 p(z)~Normal Gaussian 具有
我目前使用的生成器在卷积网络上运行良好。但是,当我使用相同的生成器来拟合自动编码器时,出现以下错误。 **Exception: output of generator should be a tupl
我有一个这样定义的自动编码器 inputs = Input(batch_shape=(1,timesteps, input_dim)) encoded = LSTM(4,return_sequence
我使用 lasagne/nolearn 训练了一个自动编码器。假设网络层是 [500, 100, 100, 500]。我已经像这样训练了神经网络: net.fit(X, X) 我想做如下的事情: ne
我的数据是 DataFrame : dOpen dHigh dLow dClose dVolume day_of_week_0 day_of_week_1
我在本教程中阅读了 LSTM-autoencoder:https://blog.keras.io/building-autoencoders-in-keras.html ,并在下面粘贴相应的 kera
我使用 Python 和 Tensorflow 构建了一个自动编码器。为了构建自动编码器,我使用了关于如何构建自动编码器以读取手写数字上的 MNIST 数据集的 Tensorflow 教程。我用它来寻
我做了一个自动编码器模型,并运行测试 行为在我的印象中: 输入:7数据* 88宽度 输出:7数据* 88宽度 行为真实 输入:7数据* 88宽度 输出:7data * 88 * 88 如何解决这个问题
我想向我的自动编码器添加初始化程序 autoencoder=Model(input_img, decoded) autoencoder.add(Dense(64,kernel_initializer=
我在 this tutorial 之后在 Keras 中创建一个自动编码器我不断收到以下错误。 decoder = tf.keras.Model(encoded_input, decoded(inpu
我是 Python 3.5 的新手。我正在尝试编写一个简单的自动编码器,它将在 60 张苹果图像的数据集上进行训练,并尝试重建根中给出的图像。我使用了以下代码: from keras.layers i
我是一名优秀的程序员,十分优秀!