自编码网络的简单版类似于PCA

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yangdashi888/article/details/82999589

1、自编码网络的知识点:

知道了自编码学习其实就是学习到了输入数据的隐含特征,通过新的特征来表征原始数据,本节将介绍如何使用这些隐含特征进行模式分类;
还是以前面的三层自编码网络:
这里写图片描述
抽象一下如下:
这里写图片描述
其中学习到的权值系数W1与W1’是不一样的,我们把W1叫做编码权值,W1’叫做译码权值,原始数据在编码权值下的新数据Y就可以视为学习到了新维度下的数据,这在第三节也说过。那么如果我们用自编码学习并计算出到Y,再把Y用于分类,就可以构成神经网络的分类器了,网络深了就是深度网络的分类器了,当然后面接分类器可以是常用的分类器,比如SVM,贝叶斯,logistics,等等,也可以在接一个神经网络分类器。本实验为了比较我们在Y后面接SVM分类器看看,那么在上面一步完成后我们的分类器就变成下面这样子:
这里写图片描述 

其中左边的网络是一个自编码网络,从中可以观察到的特点有:输出的维度跟输入的维度一样;网络属于一个无监督的网络,因为其不用进行任何数据的标注。下面就给出一个简单的自编码网络代码:

import numpy.random as rnd
import numpy as np
from sklearn.preprocessing import StandardScaler
import tensorflow as tf
import matplotlib.pyplot as plt
# 这个Axes3D要输入来,否则下面画3D散点图时参数projection = '3d'会报错
from mpl_toolkits.mplot3d import Axes3D


rnd.seed(4)
m = 200
w1, w2 = 0.1, 0.3
noise = 0.1
angles = rnd.rand(m) * 3 * np.pi / 2 - 0.5
data = np.empty((m, 3))
data[:, 0] = np.cos(angles) + np.sin(angles) / 2 + noise * rnd.randn(m) / 2
data[:, 1] = np.sin(angles) * 0.7 + noise * rnd.randn(m) / 2
data[:, 2] = data[:, 0] * w1 + data[:, 1] * w2 + noise * rnd.randn(m)

# 进行训练、测试数据的预处理,这里主要是为了使输入网络的数据具有一致性
scaler = StandardScaler()
X_train = scaler.fit_transform(data[:100])
X_test = scaler.transform(data[100:])

n_inputs = 3
n_hidden = 2
# 输出的维度跟输入的维度一直是自编码网络的一个特点
n_outputs = n_inputs
learning_rate = 0.01
X = tf.placeholder(tf.float32, shape=(None, n_inputs))
hidden = tf.layers.dense(X, n_hidden)
outputs = tf.layers.dense(hidden, n_outputs)
reconstruction_loss = tf.reduce_mean(tf.square(outputs - X))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(reconstruction_loss)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

n_iteration = 1000
codings = hidden

for i in range(n_iteration):
    sess.run(training_op, feed_dict={X: X_train})
coding_tensroVal,outputsVal = sess.run([codings,outputs], feed_dict={X: X_test})
codings_val = coding_tensroVal

fig = plt.figure()
plt.plot(codings_val[:, 0], codings_val[:, 1], "b.")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
fig1 = plt.figure()
ax = plt.subplot(111, projection = '3d')
plt.title("3Ddata")
# 转换为3d数据,用于画在图表上,便于观察
X_val = np.reshape(outputsVal[:, 0], (10, 10))
Y_val = np.reshape(outputsVal[:, 1], (10, 10))
Z_val = np.reshape(outputsVal[:, 2], (10, 10))
ax.scatter(X_val, Y_val, Z_val)
ax.set_xlabel("x label", color='r')
ax.set_ylabel("y label", color='g')
ax.set_zlabel("z label", color='b')
plt.show()

其网络的输出数据,即数据的还原程度为:

原始数据为:

猜你喜欢

转载自blog.csdn.net/yangdashi888/article/details/82999589