自編碼器(AutoEncoder

2021-08-13 20:13:12 字數 3581 閱讀 7464

本文講述自編碼器(auto encoder,下文簡稱ae),將按照以下的思路展開講解,力圖使得初學者能看懂其中要義。目錄如下:

1.ae的基本原理

2.ae的用途

3.基於mnist資料集的ae的簡單python實現

ae,是神經網路模型的一種,是一種全連線網路模型,而且進行無監督學習,下圖是簡單的ae結構。

從上圖可以看出ae模型主要由以下構建組成:

1)編碼器,即為輸入層和第乙個隱層之間的部分,主要進行特徵提取,也稱編碼過程

2)解碼器,隱層到輸出層之間部分,把隱層提取到的特徵重新還原輸出

ae是相對簡單的全連線模型,因為ae模型往往是對稱的,也就是說編碼過程和解碼過程的網路組織是一樣的,舉個簡單的例子:現有一5層的ae模型,若輸入層神經元個數為200個,那麼輸出層神經元個數也是200個,第乙個隱層有100個神經元,那麼輸出層的前一層也有100個神經元。ae模型的訓練過程和全連線網路模型的訓練過程是一樣的。  

我們學習一種演算法,要明白演算法的原理精髓,還要知道該演算法的應用場景。ae的主要用途概括主要有兩個:   a.特徵提取,去燥,降維,資訊補全;  b.為深層網路確定相對合理的網路初始化引數。下面對這兩種用途做詳細介紹。

首先,ae是非常有效的資料降維模型,降維和資訊補全對應了兩種不同的網路架構,不嚴格的講,隱層神經元個數少於輸入層神經元個數,就認為該ae模型可以進行資料降維,ae的降維效果和著名的pca(principal component analysis,主成分分析)降維演算法有過之而無不及,pca只能進行線性特徵降維,而ae的範圍就不僅侷限於此了。隱層神經元個數若大於輸入層神經元個數,這種ae模型是可以進行缺失資訊填補的,至於去燥,現有的denoising autoencoder 模型就能夠對原始資料進行去燥處理。

再次,ae的另乙個主要作用是為深層網路確定相對合理的網路初始化引數,了解深度學習的博友都知道,深層網路由於其網路層次往往較深,如果我們用隨機化引數進行模型的訓練,很多情況下會出現梯度消失或者梯度**這樣的情形,因此,如果能在深層模型訓練之前給每一層的權值賦予相對合理對的權值,就能有效避免梯度消失和梯度**問題。

前面我們介紹了ae的基本原理和應用場景,這裡我們在mnist資料集上用ae進行python實現如下。

importos

importnumpyasnp

importtensorflowastf

fromtensorflow.examples.tutorials.mnistimportinput_data

importmatplotlib.pyplotasplt

os.environ['tf_cpp_min_log_level']='2'#

讀取mnist

資料集mnist=input_data.read_data_sets("mnist_data",one_hot=true)

input_num=784

hidden_num=256

learning_rate=0.01

epoch=50

batch_size=550

example_to_show=5

#權重字典

weights=

#偏置字典

biases=

input=tf.placeholder(tf.float32,[none,input_num])

defencode(input):

returntf.nn.sigmoid(tf.add(tf.matmul(input, weights['encode_weight']),

biases['encode_bias']))

defdecode(input):

returntf.nn.sigmoid(tf.add(tf.matmul(input,weights['decode_weight']),

biases['decode_bias']))

#定義誤差

output=decode(encode(input))

cost = tf.reduce_mean(tf.pow(input - output, 2)) #

最小二乘法

optimizer = tf.train.adamoptimizer(learning_rate).minimize(cost)

#訓練模型

withtf.session()assess:

init=tf.global_variables_initializer()

sess.run(init)

total_batch = int(mnist.train.num_examples / batch_size)

print(total_batch)

fortimeinrange(epoch):

forbatchinrange(total_batch):

batch_xs, batch_ys = mnist.train.next_batch(batch_size) #

獲取需要用到的資料,

y_batch

不會用到

_, c = sess.run([optimizer, cost], feed_dict=)

print("epoch:",(time + 1),"cost=", round(c,6))

encode_decode = sess.run(

output, feed_dict=)

f, a = plt.subplots(2, 5, figsize=(5, 2))

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

才疏學淺,不正確之處,歡迎指正!
參考:

自編碼器(AutoEncoder)

自編碼器主要分為兩步 編碼 encoder 和解碼 decoder 編碼階段主要是將輸入資訊對映到低維度的空間 提取有用的特徵 解碼階段主要是為了還原輸入的結果。其中損失函式l用於度量輸出資訊與輸入資訊偏離的程度 正則自編碼器是在損失函式中加入對模型複雜度的懲罰項 根據損失函式的不同,自編碼器可以分...

DL入門 2 自編碼器 AutoEncoder

寫在前面 看 綜述時,面臨這樣乙個問題 很多dl的方法只是會簡單運用,卻不是特別了解其詳細原理,故針對cnn rnn lstm autoencoder rbm dbn以及dbm分別做一些簡單總結,以達到了解的目的,此篇為autoencoder。2.自編碼器分類 3 損失函式的設計 自動編碼器是一種無...

AutoEncoder(自編碼器)之風雨調參路

早在一年多前就接觸到了自編碼器這個簡單巧妙的深度學習模型,還曾編寫過簡單的基於mnist的自編碼器。但是因為覺得其思想簡單,就扔入 庫中任其生鏽。一年後的今天,居然因為當初的不求甚解賠付了鉅額罰單。組會偶然收到來自老師的煉丹秘籍,是stanford視覺組的大佬總結的各種奇技淫巧。我看了不免熱血沸騰,...