在無標註資料的情況下,則可利用無監督自編碼器來進行影象特徵的提取;
自編碼器,即使用自身的高階特徵對自身進行編碼,簡單來說就是該網路訓練時,輸出等於輸入,使得中間層能夠學習組成影象的基本高階特徵,然後實現利用這些稀疏的高階特徵組合重構自己,所以其本質也是一種輸入輸出一致的神經網路。
期望輸出與輸入一致;
希望通過網路生成的高階特徵實現自我重構,而非簡單的畫素點複製。
如何實現:
通過限制中間隱含層的節點數量,即小於輸入輸出節點數量,使得其達不到畫素點複製能力;
對中間層權重加l正則,懲罰係數越大,學習到的特徵組合越稀疏;
在資料中加入雜訊,促使網路學習影象深層次的高階特徵。
實戰1之中使用softmax regression模型好處在於簡單易用,但是不足在於由於其沒有中間層,擬合能力不強。所謂的多層感知機顧名思義就是引入了非線性隱含層。引入隱含層的好處在於,只要中間隱含層的節點數量足夠,則網路理論上可以你和任意函式,且隱含層的層數越多,越容易擬合複雜函式;
其實層數也不是越多越好,至少按照目前的網路構建方案來看,層數越深會遇到很多問題,比如說過擬合(在訓練集上**準確率公升高但是在測試集上準確率反而下降,模型泛化能力不強)、引數調節困難(引數增多,不同引數對結果影響大)、態度瀰散(層數增加,反向傳播梯度驟減,導致引數更新緩慢)等。
在原文章的基礎上我又新增了一層,但是就**結果的準確率來看,多了兩層隱含層和一層隱含層並沒有太大的效能提示,但是玩玩還是可以的,有許多地方可以調節,比如啟用函式、中間層節點數、學習率、dropout率等等
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("pathtodataset/",one_hot=true)
sess = tf.interactivesession()
in_units =784
h1_units =300 #隱含層1節點數
h2_units =100#隱含層2節點數
w1 = tf.variable(tf.truncated_normal([in_units,h1_units],stddev=0.1))#w=權重 b=偏置
b1 = tf.variable(tf.zeros([h1_units]))
w2 = tf.variable(tf.truncated_normal([h1_units,h2_units],stddev=0.1))
b2 = tf.variable(tf.zeros([h2_units]))
w3 = tf.variable(tf.zeros([h2_units,10]))#由於輸出對應與0~9,10維向量,所以w3,b3設定需對應
b3 = tf.variable(tf.zeros([10]))
x = tf.placeholder(tf.float32,[none , in_units])
keep_prob = tf.placeholder(tf.float32)
hidden1 = tf.nn.tanh(tf.matmul(x,w1) + b1)#啟用函式 可選:softmax softplus relu tanh
hidden1_drop = tf.nn.dropout(hidden1, keep_prob)#dropout
hidden2 = tf.nn.tanh(tf.matmul(hidden1_drop,w2) + b2)#啟用函式 可選:softmax softplus relu tanh
#hidden2_drop = tf.nn.dropout(hidden2, keep_prob)
y = tf.nn.softmax(tf.matmul(hidden2,w3)+b3) #**輸出
y_=tf.placeholder(tf.float32,[none,10])#真值
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_*tf.log(y),reduction_indices=[1]))
train_step = tf.train.adagradoptimizer(0.3).minimize(cross_entropy)
tf.global_variables_initializer().run()
for i in range(3000):
batch_xs, batch_ys = mnist.train.next_batch(100)
train_step.run()
correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(accuracy.eval())
TensorFlow實現MNIST的自編碼網路
本篇部落格將介紹基於無監督學習的乙個簡單應用 自編碼器 autoencoder 並學習tensorflow搭建乙個自編碼網路,並用它在mnist資料集上訓練。自編碼網路的作用是將輸入樣本壓縮到隱藏層,然後解壓,在輸出端重建樣本。最終輸出層神經元數量等於輸入層神經元的數量。這裡面主要有兩個過程 壓縮和...
利用tensorflow實現自編碼
1 原理 監督神經網路的本質就是對特徵的不斷學習挖掘的過程,而中間層就可以理解為對上一層特徵的提取,自編碼就是對神經網路中間層的提取,所以我們可以把高維的資料經過幾層對映到低維,在進行還原的過程 2 測試資料 構建2個三維的球,將其對映到2維,檢視資料分布 def make ball r 2,a 0...
Tensorflow實戰 張量
import tensorflow as tf tf.constant 是乙個計算,這個計算的結果為乙個張量,儲存在變數a中。a tf.constant 1.0,2.0 name a b tf.constant 2.0,3.0 name b result tf.add a,b,name add pr...