python神經(jīng)網(wǎng)絡(luò)使用tensorflow實(shí)現(xiàn)自編碼Autoencoder
學(xué)習(xí)前言
當(dāng)你發(fā)現(xiàn)數(shù)據(jù)的維度太多怎么辦!沒關(guān)系,我們給它降維!
當(dāng)你發(fā)現(xiàn)不會(huì)降維怎么辦!沒關(guān)系,來這里看看怎么autoencode
antoencoder簡(jiǎn)介
1、為什么要降維
隨著社會(huì)的發(fā)展,可以利用人工智能解決的越來越多,人工智能所需要處理的問題也越來越復(fù)雜,作為神經(jīng)網(wǎng)絡(luò)的輸入量,維度也越來越大,也就出現(xiàn)了當(dāng)前所面臨的“維度災(zāi)難”與“信息豐富、知識(shí)貧乏”的問題。
維度太多并不是一件優(yōu)秀的事情,太多的維度同樣會(huì)導(dǎo)致訓(xùn)練效率低,特征難以提取等問題,如果可以通過優(yōu)秀的方法對(duì)特征進(jìn)行提取,將會(huì)大大提高訓(xùn)練效率。
常見的降維方法有PCA(主成分分析)和LDA(線性判別分析,F(xiàn)isher Linear Discriminant Analysis),二者的使用方法我會(huì)在今后的日子繼續(xù)寫B(tài)LOG進(jìn)行闡明。
2、antoencoder的原理
如圖是一個(gè)降維的神經(jīng)網(wǎng)絡(luò)的示意圖,其可以將n維數(shù)據(jù)量降維2維數(shù)據(jù)量:
輸入量與輸出量都是數(shù)據(jù)原有的全部特征,我們利用tensorflow的optimizer對(duì)w1ij和w2ji進(jìn)行優(yōu)化。在優(yōu)化的最后,w1ij就是我們將n維數(shù)據(jù)編碼到2維的編碼方式,w2ji就是我們將2維數(shù)據(jù)進(jìn)行解碼到n維數(shù)據(jù)的解碼方式。
3、python中encode的實(shí)現(xiàn)
def encoder(x): layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']), biases['encoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']), biases['encoder_b2'])) layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']), biases['encoder_b3'])) layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']), biases['encoder_b4']) return layer_4 def decoder(x): layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']), biases['decoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']), biases['decoder_b2'])) layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']), biases['decoder_b3'])) layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']), biases['decoder_b4'])) return layer_4 encoder_op = encoder(X) decoder_op = decoder(encoder_op)
其中encode函數(shù)的輸出就是編碼后的結(jié)果。
全部代碼
該例子為手寫體識(shí)別例子,將784維縮小為2維,并且以圖像的方式顯示。
import matplotlib.pyplot as plt import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data",one_hot = "true") learning_rate = 0.01 #學(xué)習(xí)率 training_epochs = 10 #訓(xùn)練十次 batch_size = 256 display_step = 1 examples_to_show = 10 n_input = 784 X = tf.placeholder(tf.float32,[None,n_input]) #encode的過程分為4次,分別是784->128、128->64、64->10、10->2 n_hidden_1 = 128 n_hidden_2 = 64 n_hidden_3 = 10 n_hidden_4 = 2 weights = { #這四個(gè)是用于encode的 'encoder_h1': tf.Variable(tf.truncated_normal([n_input, n_hidden_1],)), 'encoder_h2': tf.Variable(tf.truncated_normal([n_hidden_1, n_hidden_2],)), 'encoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_3],)), 'encoder_h4': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_4],)), #這四個(gè)是用于decode的 'decoder_h1': tf.Variable(tf.truncated_normal([n_hidden_4, n_hidden_3],)), 'decoder_h2': tf.Variable(tf.truncated_normal([n_hidden_3, n_hidden_2],)), 'decoder_h3': tf.Variable(tf.truncated_normal([n_hidden_2, n_hidden_1],)), 'decoder_h4': tf.Variable(tf.truncated_normal([n_hidden_1, n_input],)), } biases = { #這四個(gè)是用于encode的 'encoder_b1': tf.Variable(tf.random_normal([n_hidden_1])), 'encoder_b2': tf.Variable(tf.random_normal([n_hidden_2])), 'encoder_b3': tf.Variable(tf.random_normal([n_hidden_3])), 'encoder_b4': tf.Variable(tf.random_normal([n_hidden_4])), #這四個(gè)是用于decode的 'decoder_b1': tf.Variable(tf.random_normal([n_hidden_3])), 'decoder_b2': tf.Variable(tf.random_normal([n_hidden_2])), 'decoder_b3': tf.Variable(tf.random_normal([n_hidden_1])), 'decoder_b4': tf.Variable(tf.random_normal([n_input])), } def encoder(x): #encode函數(shù),分為四步,layer4為編碼后的結(jié)果 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['encoder_h1']), biases['encoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['encoder_h2']), biases['encoder_b2'])) layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['encoder_h3']), biases['encoder_b3'])) layer_4 = tf.add(tf.matmul(layer_3, weights['encoder_h4']), biases['encoder_b4']) return layer_4 def decoder(x): #decode函數(shù),分為四步,layer4為解碼后的結(jié)果 layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['decoder_h1']), biases['decoder_b1'])) layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['decoder_h2']), biases['decoder_b2'])) layer_3 = tf.nn.sigmoid(tf.add(tf.matmul(layer_2, weights['decoder_h3']), biases['decoder_b3'])) layer_4 = tf.nn.sigmoid(tf.add(tf.matmul(layer_3, weights['decoder_h4']), biases['decoder_b4'])) return layer_4 encoder_op = encoder(X) decoder_op = decoder(encoder_op) #將編碼再解碼的結(jié)果與原始碼對(duì)比,查看區(qū)別 y_pred = decoder_op y_label = X #比較特征損失情況 cost = tf.reduce_mean(tf.square(y_pred-y_label)) train = tf.train.AdamOptimizer(learning_rate).minimize(cost) init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) #每個(gè)世代進(jìn)行total_batch次訓(xùn)練 total_batch = int(mnist.train.num_examples/batch_size) for epoch in range(training_epochs): for i in range(total_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) _,c = sess.run([train,cost],feed_dict={X:batch_xs}) if epoch % display_step == 0: print("Epoch :","%02d"%epoch,"cost =","%.4f"%c) #利用test測(cè)試機(jī)進(jìn)行測(cè)試 encoder_result = sess.run(encoder_op,feed_dict={X:mnist.test.images}) plt.scatter(encoder_result[:,0],encoder_result[:,1],c=np.argmax(mnist.test.labels,1),s=1) plt.show()
實(shí)現(xiàn)結(jié)果為:
可以看到實(shí)驗(yàn)結(jié)果分為很多個(gè)區(qū)域塊,基本可以識(shí)別。
以上就是python神經(jīng)網(wǎng)絡(luò)使用tensorflow實(shí)現(xiàn)自編碼Autoencoder的詳細(xì)內(nèi)容,更多關(guān)于tensorflow自編碼Autoencoder的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Keras模型轉(zhuǎn)成tensorflow的.pb操作
這篇文章主要介紹了Keras模型轉(zhuǎn)成tensorflow的.pb操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07Python利用networkx畫圖繪制Les?Misérables人物關(guān)系
這篇文章主要為大家介紹了Python利用networkx畫圖處理繪制Les?Misérables悲慘世界里的人物關(guān)系圖,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05python實(shí)現(xiàn)爬蟲統(tǒng)計(jì)學(xué)校BBS男女比例之?dāng)?shù)據(jù)處理(三)
這篇文章主要介紹了python實(shí)現(xiàn)爬蟲統(tǒng)計(jì)學(xué)校BBS男女比例之?dāng)?shù)據(jù)處理,需要的朋友可以參考下2015-12-12python HTTPX庫實(shí)現(xiàn)同步異步請(qǐng)求用法示例
這篇文章主要為大家介紹了python HTTPX庫實(shí)現(xiàn)同步異步請(qǐng)求用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Python使用cx_Freeze庫生成msi格式安裝文件的方法
這篇文章主要介紹了Python使用cx_Freeze庫生成msi格式安裝文件的方法,結(jié)合實(shí)例形式分析了Python基于cx_Freeze庫生成msi格式安裝文件操作技巧與相關(guān)問題解決方法,需要的朋友可以參考下2018-07-07Python實(shí)現(xiàn)冒泡,插入,選擇排序簡(jiǎn)單實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)冒泡,插入,選擇排序簡(jiǎn)單實(shí)例,很適合Python初學(xué)者學(xué)習(xí)參考之用,需要的朋友可以參考下2014-08-08Python導(dǎo)入Excel表格數(shù)據(jù)并以字典dict格式保存的操作方法
本文介紹基于Python語言,將一個(gè)Excel表格文件中的數(shù)據(jù)導(dǎo)入到Python中,并將其通過字典格式來存儲(chǔ)的方法,感興趣的朋友一起看看吧2023-01-01OpenCV+Imutils實(shí)現(xiàn)圖像的旋轉(zhuǎn)操作
imutils是在OPenCV基礎(chǔ)上的一個(gè)封裝,達(dá)到更為簡(jiǎn)結(jié)的調(diào)用OPenCV接口的目的,它可以輕松的實(shí)現(xiàn)圖像的平移,旋轉(zhuǎn),縮放,骨架化等一系列的操作。本文將用其實(shí)現(xiàn)圖像的旋轉(zhuǎn)操作,感興趣的可以學(xué)習(xí)一下2022-05-05使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程
這篇文章主要介紹了使用Python構(gòu)建Hopfield網(wǎng)絡(luò)的教程,本文來自于IBM官方網(wǎng)站的技術(shù)文檔,需要的朋友可以參考下2015-04-04