Autoencoder

做者:chen_h
微信號 & QQ:862251340
微信公衆號:coderpai
簡書地址:https://www.jianshu.com/p/fd3...php



本博客是從梁斌博士的 博客上面複製過來的,本人利用 Tensorflow 從新實現了博客中的代碼

深度學習有一個重要的概念叫 autoencoder ,這是個什麼東西呢,本文經過一個例子來普及這個術語。html

簡單來講 autoencoder 是一個壓縮編碼器,也就是對 input 的一坨東西經過變換,輸出和 input 同樣的東西。例如 input 是一個雞, output 也是一個雞, input 是一個鴨, output 也是一個鴨。學術一點說就是找到一個函數可以使得 Function(input) = input ,叫作 identity function 。如上圖所示,即學習 Hw,b(x)=x 。python

但這和深度學習有什麼關係呢? 這就要說到壓縮編碼,咱們都知道input須要有一種編碼形式,若是咱們能在函數內部找到一個更簡潔的編碼形式,那麼這個變換過程就等價於學習到了一種壓縮表示的函數,可以少許的存儲形式來表示本來較複雜的但信息冗餘較大的表示形式。算法

咱們下面的代碼中舉了一個精彩的例子(這個例子是從同窗的一次實驗中直接受啓發,我只是按照本身的理解實現了一把,例子非原創)。在這個例子中,input是4個不一樣的數字,分別是微信

(0,0,0,1)能夠看做1
    (0,0,1,0)能夠看做2
    (0,1,0,0)能夠看做3
    (1,0,0,0)能夠看做4

由於全部的 input 只有這4種,所以其實用4個bit是不經濟的,存在壓縮表示的可能性,好比2個bit就能夠表示這4個不一樣的數。dom

那麼咱們設計了輸入層是 4+1 個神經元(4個神經元接受4bit編碼的input,1個神經元是常數項,這個用來作先驗的);隱藏層是 2+1 個神經元(由於咱們實現已經知道2個bit就夠了,因此2個隱藏層,具備足夠的表達能力);輸出層是 4 個神經元(爲了能讓輸出和輸入保持一致)。ide

經過數輪迭代,咱們看到以下的狀況:函數

(0,0,0,1)->(0.99,0.09)->(0.06,0.00,0.01,0.91)
    (0,0,1,0)->(0.85,0.99)->(0.00,0.07,0.90,0.07)
    (0,1,0,0)->(0.01,0.67)->(0.06,0.87,0.11,0.00)
    (1,0,0,0)->(0.12,0.00)->(0.89,0.10,0.00,0.02)
    input_layer hidden_layer  output_layer

hidden層的編碼剛好能夠看做是:學習

(0.99,0.09)  1,0
     (0.85,0.99)  1,1
     (0.01,0.67)  0,1
     (0.12,0.00)  0,0

也就是說輸入的(0,0,0,1)能夠被壓縮表示成(1,0),最終4bit的信息,能夠用2bit表示,固然還須要保持邊的權重,但這些邊權重只須要一份,在輸入足夠複雜的時候,壓縮表示是有價值的。編碼

那壓縮表示有什麼價值呢?好比一組廣告,一條新聞,人看了挺好,壓縮表示後,人看起來就不爽了,偏偏是人看着不爽了,機器就好處理了,下回再說。

實驗代碼以下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import tensorflow as tf 
import numpy as np 


def model(x, w1, w2, b1, b2):

    a = tf.matmul(x, w1)
    b = tf.add(a,b1)
    c = tf.sigmoid(b)
    hidden = tf.sigmoid(tf.add(tf.matmul(x, w1), b1))
    out = tf.nn.softmax(tf.add(tf.matmul(hidden, w2), b2))

    return out

x = tf.placeholder("float", [4, 4])

w1 = tf.Variable(tf.random_normal([4,2]), name = 'w1')
w2 = tf.Variable(tf.random_normal([2,4]), name = 'w2')
b1 = tf.Variable(tf.random_normal([2]), name = 'b1')
b2 = tf.Variable(tf.random_normal([4]), name = 'b2')


pred = model(x, w1, w2, b1, b2)
cost = tf.reduce_sum(tf.pow(tf.sub(pred, x), 2))
optimizer = tf.train.AdamOptimizer().minimize(cost)

with tf.Session() as sess:

    init = tf.initialize_all_variables()
    sess.run(init)

    input_data = np.array([[0,0,0,1],[0,0,1,0],[0,1,0,0],[1,0,0,0]], float)

    for i in xrange(10000):    
        sess.run(optimizer, feed_dict = {x: input_data})

    res = sess.run(pred, feed_dict = {x: input_data})
    index = np.argmax(res, 1)
    for i in xrange(4):
        tmp = np.zeros((4,))
        tmp[index[i]] = 1.
        print res[i]
        print tmp

Reference:

UFLDL

小白學Tensorflow之自編碼Autoencoder


做者:chen_h
微信號 & QQ:862251340
簡書地址:https://www.jianshu.com/p/fd3...

CoderPai 是一個專一於算法實戰的平臺,從基礎的算法到人工智能算法都有設計。若是你對算法實戰感興趣,請快快關注咱們吧。加入AI實戰微信羣,AI實戰QQ羣,ACM算法微信羣,ACM算法QQ羣。長按或者掃描以下二維碼,關注 「CoderPai」 微信號(coderpai)
這裏寫圖片描述


這裏寫圖片描述

相關文章
相關標籤/搜索