TensorFlow的簡(jiǎn)單兩層神經(jīng)網(wǎng)絡(luò)設(shè)計(jì)

前言


用TensorFlow做分類任務(wù),最基本的還是兩個(gè)步驟酵使,構(gòu)建計(jì)算圖和執(zhí)行計(jì)算圖荐吉。構(gòu)建計(jì)算圖中,涉及到數(shù)據(jù)的讀取口渔,變量样屠、占位符的定義,神經(jīng)網(wǎng)絡(luò)的設(shè)計(jì)缺脉,激活函數(shù)痪欲、代價(jià)函數(shù)、優(yōu)化器的定義攻礼,等把靜態(tài)的計(jì)算圖構(gòu)建之后业踢,就開始啟動(dòng)會(huì)話執(zhí)行運(yùn)算了,計(jì)算需要訓(xùn)練的節(jié)點(diǎn)礁扮,最后得到結(jié)果知举。

這里使用sklearn中的digits數(shù)據(jù)集進(jìn)行分類任務(wù),設(shè)計(jì)簡(jiǎn)單的兩層神經(jīng)網(wǎng)絡(luò)深员,并用dropout減少過(guò)擬合负蠕,最后得到性能評(píng)估。

數(shù)據(jù)預(yù)處理


讀取digits的數(shù)據(jù)很簡(jiǎn)單倦畅,首先引入sklearn相關(guān)的庫(kù)

from sklearn.datasets import load_digits
digits = load_digits()

構(gòu)建digits實(shí)例遮糖,里面data屬性存放的數(shù)據(jù)樣本,target屬性存放樣本對(duì)應(yīng)的標(biāo)簽叠赐∮耍可以觀察到各自的shape

>>> digits.data.shape
(1797, 64)
>>> digits.target.shape
(1797,)

可以看到,data是由1797個(gè)8*8的圖片組成芭概,target是對(duì)應(yīng)的label赛不。

X, y = digits.data, digits.target

這里的每個(gè)樣本對(duì)應(yīng)一個(gè)標(biāo)簽,我們可以對(duì)標(biāo)簽進(jìn)行獨(dú)熱碼解析罢洲,把它二值化踢故,這樣方便以后softmax回歸。在sklearn中惹苗,你可以選擇OneHotEncoder或者LabelBinarizer對(duì)其進(jìn)行解析殿较。這里選擇OneHotEncoder。

from sklearn.preprocessing import OneHotEncoder
y = OneHotEncoder().fit_transform(y.reshape(-1, 1)).toarray()

OneHotEncoder的輸入必須是 2-D array,而y的shape是一維向量桩蓉,所以先將其reshape淋纲,然后利用OneHotEncoder轉(zhuǎn)換,注意院究,這樣的輸出洽瞬,y最后變成了稀疏矩陣本涕,需要利用toarray再轉(zhuǎn)換成矩陣。

接下來(lái)就是對(duì)訓(xùn)練集伙窃,測(cè)試集的分割菩颖,sklearn有專門的函數(shù),test_size參數(shù)可以選擇分割的比例对供。

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

構(gòu)建計(jì)算圖


網(wǎng)絡(luò)層的設(shè)計(jì)

由于這里是要使用兩層神經(jīng)網(wǎng)絡(luò)位他,可以事先預(yù)定義網(wǎng)絡(luò)的格式、輸入輸出的函數(shù)产场,然后直接調(diào)用鹅髓。傳入的參數(shù)有網(wǎng)絡(luò)層的輸入,最后通過(guò)激活函數(shù)計(jì)算輸出京景,所以要傳入激活函數(shù)窿冯,還要設(shè)計(jì)兩層神經(jīng)元的個(gè)數(shù)。

權(quán)重和偏置的定義通過(guò)tf.Variable實(shí)現(xiàn)确徙。

使用dropout來(lái)減少過(guò)擬合醒串,所以兩層神經(jīng)元使用tf.nn.dropout激活函數(shù)。

def add_layer(input, in_size, out_size, activation=None):
    W = tf.Variable(tf.random_normal([in_size, out_size]), 'W')
    b = tf.Variable(tf.zeros([out_size]) + 0.1, 'b')
    output = tf.nn.dropout(tf.matmul(input, W) + b, keep_prob)
    if activation is None:
        return output
    else:
        return activation(output)

占位符

占位符用來(lái)定義傳遞進(jìn)來(lái)的真實(shí)的數(shù)據(jù)樣本鄙皇,不必制定初始值芜赌,這里,來(lái)定義數(shù)據(jù)樣本伴逸、數(shù)據(jù)標(biāo)簽和dropout概率缠沈。

keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32, [None, 64])
ys = tf.placeholder(tf.float32, [None, 10])

網(wǎng)絡(luò)層定義

這里,使用100個(gè)神經(jīng)元的第一層错蝴,激活函數(shù)使用sigmoid函數(shù)洲愤,第二層因?yàn)橐敵?到9的數(shù)字,設(shè)計(jì)10個(gè)神經(jīng)元顷锰,激活函數(shù)使用softmax函數(shù)柬赐。

l1 = add_layer(xs, 64, 100, tf.nn.tanh)
l2 = add_layer(l1, 100, 10)

代價(jià)函數(shù)與優(yōu)化器

softmax函數(shù)一般與交叉熵代價(jià)函數(shù)相配合,TensorFlow有tf.nn.softmax_cross_entropy_with_logits直接實(shí)現(xiàn)官紫,label參數(shù)傳入真實(shí)標(biāo)簽肛宋,logits參數(shù)傳入神經(jīng)層的輸出。

優(yōu)化器使用梯度下降束世,學(xué)習(xí)率設(shè)定為0.2悼吱,最后的目的就是用梯度下降使參數(shù)按照梯度下降最快的方向變化從而使代價(jià)函數(shù)局部最優(yōu)。

loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=ys, logits=l2))
optimizer = tf.train.GradientDescentOptimizer(0.2)
train = optimizer.minimize(loss)

tensorflow的激活函數(shù)可在tensorflow.nn里面良狈,產(chǎn)生與輸入shape相同的張量。

  • tf.nn.relu
  • tf.nn.relu6
  • tf.nn.crelu
  • tf.nn.elu
  • tf.nn.softplus
  • tf.nn.softsign
  • tf.nn.dropout
  • tf.nn.bias_add
  • tf.sigmoid
  • tf.tanh

根據(jù)不同的模型可以選擇不同的激活函數(shù)笨枯,一般常用的是relu薪丁、sigmoid遇西、tanh

TensorFlow的優(yōu)化器也可以自行選擇,提供了計(jì)算代價(jià)的梯度一些方法严嗜。

  • tf.train.Optimizer
  • tf.train.GradientDescentOptimizer
  • tf.train.AdadeltaOptimizer
  • tf.train.AdagradOptimizer
  • tf.train.AdagradDAOptimizer
  • tf.train.MomentumOptimizer
  • tf.train.AdamOptimizer
  • tf.train.FtrlOptimizer
  • tf.train.ProximalGradientDescentOptimizer
  • tf.train.ProximalAdagradOptimizer
  • tf.train.RMSPropOptimizer

運(yùn)行計(jì)算圖

啟動(dòng)會(huì)話粱檀,首先初始化變量,然后設(shè)置訓(xùn)練迭代1000次漫玄,最后與真實(shí)標(biāo)簽比較茄蚯,得到準(zhǔn)確率。

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(1000):
    sess.run(train, {xs: X_train, ys: y_train, keep_prob: 0.5})
#print(y_pred.shape, ...)
result = tf.equal(tf.argmax(y_test, 1), tf.argmax(l2, 1))
acc = tf.reduce_mean(tf.cast(result, tf.float32))
#print(classification_report(y_test_res, y_pred_res))
print(sess.run(acc, {xs: X_test, keep_prob: 1}))

結(jié)論

當(dāng)?shù)谝粚邮褂胹igmoid激活函數(shù)睦优,最后準(zhǔn)確率為0.875421.

當(dāng)?shù)谝粚邮褂胻anh激活函數(shù)渗常,最后準(zhǔn)確率為0.858586.

使用0.5比例的dropout和sigmoid函數(shù)時(shí),最后準(zhǔn)確率為0.927609.

附上代碼

import tensorflow as tf
from sklearn.datasets import load_digits
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import OneHotEncoder
#from sklearn.metrics import classification_report

digits = load_digits()
#print(digits.data.shape, ...)
X, y = digits.data, digits.target
y = OneHotEncoder().fit_transform(y.reshape(-1, 1)).toarray()
# y=OneHotEncoder().fit_transform(y[:,np.newaxis])
#print(y.shape, ...)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)


def add_layer(input, in_size, out_size, activation=None):
    W = tf.Variable(tf.random_normal([in_size, out_size]), 'W')
    b = tf.Variable(tf.zeros([out_size]) + 0.1, 'b')
    output = tf.nn.dropout(tf.matmul(input, W) + b, keep_prob)
    if activation is None:
        return output
    else:
        return activation(output)

keep_prob = tf.placeholder(tf.float32)
xs = tf.placeholder(tf.float32, [None, 64])
ys = tf.placeholder(tf.float32, [None, 10])

l1 = add_layer(xs, 64, 100, tf.nn.tanh)
l2 = add_layer(l1, 100, 10)

loss = tf.reduce_mean(
    tf.nn.softmax_cross_entropy_with_logits(labels=ys, logits=l2))
optimizer = tf.train.GradientDescentOptimizer(0.2)
train = optimizer.minimize(loss)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()
for i in range(1000):
    sess.run(train, {xs: X_train, ys: y_train, keep_prob: 0.5})
#print(y_pred.shape, ...)
result = tf.equal(tf.argmax(y_test, 1), tf.argmax(l2, 1))
acc = tf.reduce_mean(tf.cast(result, tf.float32))
#print(classification_report(y_test_res, y_pred_res))
print(sess.run(acc, {xs: X_test, keep_prob: 1}))
# 第一層使用sigmoid汗盘,最后為0.875421
# 第一層使用tanh,最后為0.858586
# 使用0.5的dropout皱碘,最后為0.927609
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市隐孽,隨后出現(xiàn)的幾起案子癌椿,更是在濱河造成了極大的恐慌,老刑警劉巖菱阵,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踢俄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡晴及,警方通過(guò)查閱死者的電腦和手機(jī)都办,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抗俄,“玉大人脆丁,你說(shuō)我怎么就攤上這事《ⅲ” “怎么了槽卫?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胰蝠。 經(jīng)常有香客問(wèn)我歼培,道長(zhǎng),這世上最難降的妖魔是什么茸塞? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任躲庄,我火速辦了婚禮,結(jié)果婚禮上钾虐,老公的妹妹穿的比我還像新娘噪窘。我一直安慰自己,他們只是感情好效扫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布倔监。 她就那樣靜靜地躺著直砂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浩习。 梳的紋絲不亂的頭發(fā)上静暂,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音谱秽,去河邊找鬼洽蛀。 笑死,一個(gè)胖子當(dāng)著我的面吹牛疟赊,可吹牛的內(nèi)容都是我干的郊供。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼听绳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颂碘!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起椅挣,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤头岔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鼠证,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體峡竣,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年量九,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了适掰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠列,死狀恐怖类浪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肌似,我是刑警寧澤费就,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站川队,受9級(jí)特大地震影響力细,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜固额,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一眠蚂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧斗躏,春花似錦逝慧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栅干。三九已至,卻和暖如春捐祠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桑李。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工踱蛀, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贵白。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓率拒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親禁荒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猬膨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容