本文講述自編碼器(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實現如下。
importosimportnumpyasnp
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視覺組的大佬總結的各種奇技淫巧。我看了不免熱血沸騰,...