1. 程式人生 > >稀疏自編碼器tensorflow

稀疏自編碼器tensorflow

        自編碼器是一種無監督機器學習演算法,通過計算自編碼的輸出與原輸入的誤差,不斷調節自編碼器的引數,最終訓練出模型。自編碼器可以用於壓縮輸入資訊,提取有用的輸入特徵。如,[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]四位元資訊可以壓縮成兩位,[0,0],[1,0],[1,1],[0,1]。此時,自編碼器的中間層的神經元個數為2。但是,有時中間隱藏層的神經元個數可能超過輸出,此時需要通過稀疏因子調節代價函式,讓中間隱藏層的神經元資訊大部分接近於0但不為0.自編碼器具體推導詳見http://ufldl.stanford.edu/wiki/index.php/%E8%87%AA%E7%BC%96%E7%A0%81%E7%AE%97%E6%B3%95%E4%B8%8E%E7%A8%80%E7%96%8F%E6%80%A7。

以下是通過tensorflow實現的稀疏自編碼器。

1、初始化引數

input_nodes = 8*8 //輸入節點數
hidden_size = 100//隱藏節點數
output_nodes = 8*8//輸出節點數

2、初始化訓練集資料,從mat檔案中讀取影象塊,隨機生成10000個8*8的影象塊

def sampleImage():
    mat = scipy.io.loadmat('F:/ml/code/IMAGES.mat')
    pic = mat['IMAGES']
    shape = pic.shape
    patchsize = 8
    numpatches = 1000
    patches = []
    i = np.random.randint(0, shape[0]-patchsize,numpatches)
    j = np.random.randint(0, shape[1]-patchsize, numpatches)
    k = np.random.randint(0, shape[2], numpatches)


    for l in range(numpatches):
        temp = pic[i[l]:(i[l]+patchsize), j[l]:(j[l]+patchsize), k[l]]
        temp = temp.reshape(patchsize*patchsize)
        patches.append(temp)
    return patches

3、通過xvaier初始化第一層的權重值,xvaier初始化詳見http://blog.csdn.net/shuzfan/article/details/51338178

def xvaier_init(input_size, output_size):
    low = -np.sqrt(6.0/(input_nodes+output_nodes))
    high = -low
    return tf.random_uniform((input_size, output_size), low, high, dtype = tf.float32)

4、計算代價函式,代價函式由三部分組成,均方差項,權重衰減項,以及稀疏因子項

def computecost(w,b,x,w1,b1):
    p = 0.1
    beta = 3
    lamda = 0.00001
    
    hidden_output = tf.sigmoid(tf.matmul(x,w) + b)
    pj = tf.reduce_mean(hidden_output, 0)
    sparse_cost = tf.reduce_sum(p*tf.log(p/pj)+(1-p)*tf.log((1-p)/(1-pj)))
    output = tf.sigmoid(tf.matmul(hidden_output,w1)+b1)
    regular = lamda*(tf.reduce_sum(w*w)+tf.reduce_sum(w1*w1))/2
    cross_entropy = tf.reduce_mean(tf.pow(output - x, 2))/2 +sparse_cost*beta + regular #+ regular+sparse_cost*beta 
    return cross_entropy, hidden_output, output

5、視覺化自編碼器:為了使隱藏單元得到最大激勵(隱藏單元需要什麼樣的特徵輸入),將這些特徵輸入顯示出來。

def show_image(w):
    sum = np.sqrt(np.sum(w**2, 0))
    changedw = w/sum
    a,b = changedw.shape
    c = np.sqrt(a*b)
    d = int(np.sqrt(a))
    e = int(c/d)
    buf = 1
    newimage = -np.ones((buf+(d+buf)*e,buf+(d+buf)*e))
    k = 0
    for i in range(e):
        for j in range(e):
            maxvalue = np.amax(changedw[:,k])
            if(maxvalue<0):
                maxvalue = -maxvalue
            newimage[(buf+i*(d+buf)):(buf+i*(d+buf)+d),(buf+j*(d+buf)):(buf+j*(d+buf)+d)] = np.reshape(changedw[:,k],(d,d))/maxvalue
            k+=1
    
    plt.figure("beauty")
    plt.imshow(newimage)
    plt.axis('off')
    plt.show()   

6、主函式,通過AdamOptimizer下降誤差,調節引數

def main():
    w = tf.Variable(xvaier_init(input_nodes, hidden_size))
    b = tf.Variable(tf.truncated_normal([hidden_size],0.1))   
    x = tf.placeholder(tf.float32, shape = [None, input_nodes])
    w1 = tf.Variable(tf.truncated_normal([hidden_size,input_nodes], -0.1, 0.1))
    b1 = tf.Variable(tf.truncated_normal([output_nodes],0.1))


    cost, hidden_output, output = computecost(w,b,x,w1,b1)
    train_step = tf.train.AdamOptimizer().minimize(cost)
    train_x = sampleImage()
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    
    for i in range(100000):
        _,hidden_output_, output_,cost_,w_= sess.run([train_step, hidden_output, output,cost,w], feed_dict = {x : train_x})
        if i%1000 == 0:
            print(hidden_output_)
            print(output_)
            print(cost_)
    np.save("weights1.npy", w_)
    show_image(w_)

        本次實驗過程中,除了整體思想,最難的還是調節引數。使用稀疏因子加入代價函式,個人覺得隱藏層的神經元數要多於輸入層,結果才比較理想。希望大家多多指教。

程式碼地址:https://github.com/summersunshine1/datamining/tree/master/sparseencoder

相關推薦

稀疏編碼tensorflow

        自編碼器是一種無監督機器學習演算法,通過計算自編碼的輸出與原輸入的誤差,不斷調節自編碼器的引數,最終訓練出模型。自編碼器可以用於壓縮輸入資訊,提取有用的輸入特徵。如,[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]四位元資訊可以

稀疏編碼及事實上現——怎樣搞基

disk initial 圖片 app .com 沒有 back ext 稀疏 自編碼器是什麽? 自編碼器本身就是一種BP神經網絡。它是一種無監督學習算法。 我們都知道神經網絡能夠從隨意精度逼近隨意函數,這裏我們讓神經網絡目標值等於輸

稀疏編碼一覽表

stanford table c51 eight bottom 我們 otto 維數 text 以下是我們在推導sparse autoencoder時使用的符號一覽表: 符號 含義 訓練樣本的輸入特征,. 輸出

[編碼] [稀疏編碼] Auto Encoder原理詳解

alt mage auto ali 技術 14. 大牛 pca center   自編碼器是一種有效的提取特征的方法,與PCA無監督降維不同,它實際上是獨立於有監督、無監督算法外的自監督算法,Hinton大牛主要就是搞這塊的,比如被他當做寶貝的玻爾茲曼機... 下面這個PP

7 Recursive AutoEncoder結構遞迴編碼(tensorflow)不能呼叫GPU進行計算的問題(非機器配置,而是網路結構的問題)

一、原始碼下載 程式碼最初來源於Github:https://github.com/vijayvee/Recursive-neural-networks-TensorFlow,程式碼介紹如下:“This repository contains the implementation of a single h

生成模型--稀疏編碼(sparse autoencoder,SAE)

稀疏自編碼器(sparse autoencoder,SAE)   在自動編碼的基礎上加上稀疏性限制,就可得到稀疏自動編碼器(Sparse AutoEncoder)。   用來約束自動編碼器重構的方法,是對其損失函式施加約束。比如,可對損失函式新增一個正則化約束,

DeepLearning學習隨記(一)稀疏編碼

                講義從稀疏自編碼(Sparse Autoencoder)這一章節開始講起。前面三節是神經網路、BP神經網路以及梯度檢驗的方法。由於還有點神經網路的相關知識,這部分不是太難懂。就從自編碼器和稀疏性(Autoencoders and sparisity)記起吧。稀疏自編碼器構建:假

UFLDL向量化程式設計練習:用MNIST資料集的稀疏編碼訓練實現

     折騰了兩天,總算實現了用MNIST資料集的稀疏自編碼器訓練。發現了以下問題:      1,matlab程式設計所寫程式碼不能太奢侈。定義變數時要儘量節省記憶體資源,向量能解決的不要用方陣,int8型別能解決的不要用雙精度數;      2,UFLDL提供的min

深度學習入門教程UFLDL學習實驗筆記一:稀疏編碼

UFLDL即(unsupervised feature learning & deep learning)。這是斯坦福網站上的一篇經典教程。顧名思義,你將在這篇這篇文章中學習到無監督特徵學習和深度學習的主要觀點。 UFLDL全文出處在這:http://ufldl.stanford.edu/wiki/

深度學習筆記:稀疏編碼(1)——神經元與神經網路

  筆者在很久以前就已經學習過UFLDL深度學習教程中的稀疏自編碼器,近期需要用到的時候發現有些遺忘,溫習了一遍之後決定在這裡做一下筆記,本文不是對神經元與神經網路的介紹,而是筆者學習之後做的歸納和整理,打算分為幾篇記錄。詳細教程請見UFLDL教程,看完教程之後

ufldl 深度學習入門 第一發:基於BP網路實現稀疏編碼

目的:打算使用深度學習的方式實現人臉關鍵點的檢測,第一步是要學習深度學習。 步驟:第一步在ufldl上面學習深度學習的演算法基礎知識,然後找部落格上基於python呼叫theano庫實現人臉關鍵點檢測的演算法,看懂後基於C++實現,然後用java實現app,呼叫C++實現的

深度學習入門 ---稀疏編碼

在學習稀疏自編碼器之前,需要讀者有BP神經網路的基礎 1. 為什麼要用稀疏自編碼器   對於沒有帶類別標籤的資料,由於為其增加類別標記是一個非常麻煩的過程,因此我們希望機器能夠自己學習到樣本中的一些重要特徵。通過對隱藏層施加一些限制,能夠使得它在惡劣

系統學習深度學習(二) --編碼,DA演算法,SDA,稀疏編碼

轉自:http://www.cnblogs.com/neopenx/p/4370350.html,作者寫的很好,輕鬆易懂。 起源:PCA、特徵提取.... 隨著一些奇怪的高維資料出現,比如影象、語音,傳統的統計學-機器學習方法遇到了前所未有的挑戰。 資料維度過高,資料單

關於稀疏編碼的自己的理解

一個稀疏自編碼器為什麼最後視覺化得到這樣的結果呢? 首先輸入是隨機的10000張圖片的任意區域性裁剪出來的8x8的圖片,隨機抽取200張出來看看就是這樣 很亂,沒有任何規律,可以理解成自然界的所有影象的區域性的縮影,然後通過隨機的W,b得到第二層的輸出

UFLDL:稀疏編碼

吳恩達的 CS294A 是一門很好的深度學習入門課程,打算接下來的學習以這個課程的內容為主。UFLDL Tutorial 是 CS294A 課程的 wiki 頁,包含了課程講義和作業。如果你對 監督學習、邏輯迴歸、梯度下降 等基礎概念並不熟悉,可以先學習 之前的

TensorFlow』單隱藏層編碼設計

ase numpy loss 分享 examples sum write 對象 plt 計算圖設計 很簡單的實踐, 多了個隱藏層 沒有上節的高斯噪聲 網絡寫法由上節的面向對象改為了函數式編程, 其他沒有特別需要註意的,實現如下: import numpy as np

tensorflow學習筆記(三):實現編碼

sea start ear var logs cos soft 編碼 red 黃文堅的tensorflow實戰一書中的第四章,講述了tensorflow實現多層感知機。Hiton早年提出過自編碼器的非監督學習算法,書中的代碼給出了一個隱藏層的神經網絡,本人擴展到了多層,改進

TensorFlow』讀書筆記_降噪編碼

沒有 tutorials oftp transfer 初始化 hot nis gauss ant 『TensorFlow』降噪自編碼器設計 之前學習過的代碼,又敲了一遍,新的收獲也還是有的,因為這次註釋寫的比較詳盡,所以再次記錄一下,具體的相關知識查閱之前寫的文章即可(見

實戰tensorflow——編碼

自編碼器簡介: 深度學習提取的是頻繁出現的特徵;特徵是需要不斷抽象的,它從見到的微觀特徵開始,不斷抽象特徵的層級,逐漸網複雜的巨集觀特徵轉變。 特徵的稀疏表達:使用少量的基本特徵組合拼裝得到更高層抽象的特徵 Hinton的思路就是先用自編碼器的方法進行無監督的預訓練,提取特徵

基於TensorFlow理解三大降維技術:PCA、t-SNE 和編碼

余弦相似度 應對 新的 問題 技術 編碼 http 壓縮 方法 在我們開始之前,先看一個問題:如果你要為以下案例選擇一種降維技術,你會怎麽選? 1. 你的系統可以使用余弦相似度測量距離,但你需要將其可視化,以便不懂技術的董事會成員也能理解,這些人可能甚至從來沒聽說過余弦相