Tensorflow實戰之自編碼器與多層感知機

2021-09-12 19:11:49 字數 2454 閱讀 8018

在無標註資料的情況下,則可利用無監督自編碼器來進行影象特徵的提取;

自編碼器,即使用自身的高階特徵對自身進行編碼,簡單來說就是該網路訓練時,輸出等於輸入,使得中間層能夠學習組成影象的基本高階特徵,然後實現利用這些稀疏的高階特徵組合重構自己,所以其本質也是一種輸入輸出一致的神經網路。

期望輸出與輸入一致;

希望通過網路生成的高階特徵實現自我重構,而非簡單的畫素點複製。

如何實現:

通過限制中間隱含層的節點數量,即小於輸入輸出節點數量,使得其達不到畫素點複製能力;

對中間層權重加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...