自編碼網路的簡單版類似於PCA

2021-08-28 21:58:37 字數 3189 閱讀 6912

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=)

coding_tensroval,outputsval = sess.run([codings,outputs], feed_dict=)

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()

其網路的輸出資料,即資料的還原程度為:

原始資料為:

puzzle簡單實現 類似於迷宮 非遞迴棧

如果圓圈能夠移動到最後0的位置,返回true,否則返回false。程式執行,列印詳細的移動路徑。下圖示例演示跳轉過程 一維陣列4 8 5 2 3 5 1 6 4 0 puzzlenode class public class puzzlenode public intgetindex public ...

Swift 定義類似於object c的巨集檔案

import uikit 螢幕寬度 let screenwidth cgfloat uiscreen.main.bounds.size.width 螢幕高度 let screenheight cgfloat uiscreen.main.bounds.size.height 安全距離 let safe...

利用Opengl實現類似於角色漫遊的場景

這是圖形學第3次練習,利用glulookat 函式實現視點跟蹤。我繪製了乙個模擬地球,觀察點確定在地球的 後方 每次變換方向時,觀察點也隨之變換。user eye 0 pos 0 float sin rad 5 user eye 2 pos 2 float cos rad 5 其中,user eye...