學(xué)習(xí)筆記 — 神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)(ng)_第四周

更好的閱讀體驗(yàn)苇羡,請(qǐng)點(diǎn)擊這里


內(nèi)容概要:

  1. Parameters vs Hyperparameters
  2. 為什么用深度神經(jīng)網(wǎng)絡(luò)(why deep presentation)
  3. 逐步實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)
  4. 確定各層參數(shù)矩陣維度 & 隨機(jī)初始化
  5. 使用tensorflow實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)

0 - 符號(hào)約定

1 - 參數(shù)(Parameters) & 超參 (HyperParameters)


參數(shù)是模型內(nèi)部的配置變量兴猩,可以通過(guò)訓(xùn)練數(shù)據(jù)估計(jì)參數(shù)的值;超參是模型外部的配置啤握,必須手動(dòng)設(shè)置參數(shù)的值盒延。由于超參的設(shè)置對(duì)參數(shù)會(huì)產(chǎn)生非常大的影響,因此,超參可以理解成控制參數(shù)的參數(shù)秘血。事實(shí)上即彪,使用不同的超參配置進(jìn)行神經(jīng)網(wǎng)絡(luò)訓(xùn)練紧唱,得到的結(jié)果可能會(huì)大相徑庭。

常見的參數(shù)有:W隶校,b等

常見的超參有:learning rate漏益,iterations number, hidden layer number深胳,hidden unit number等绰疤。

2 - 為什么用深度神經(jīng)網(wǎng)絡(luò)(why deep presentation)


Informally:There are functions you can compute with a "small" L-layer deep neural network that shallower networks require exponentially more hidden units to compute.

上面這句話的意思就是,在神經(jīng)網(wǎng)絡(luò)中舞终,針對(duì)復(fù)雜函數(shù)的逼近轻庆,增加層數(shù)會(huì)比增加神經(jīng)元更有效。

直觀上理解敛劝,增加層數(shù)能夠表達(dá)更多的信息余爆,而增加單層的神經(jīng)元數(shù)量,對(duì)于信息的表達(dá)提升能力有限攘蔽。以CNN(卷積神經(jīng)網(wǎng)絡(luò))進(jìn)行圖片識(shí)別任務(wù)為例龙屉,以圖片識(shí)別為例,針對(duì)目標(biāo)的識(shí)別層層遞進(jìn)满俗,第一個(gè)隱含層檢測(cè)邊緣转捕,第二個(gè)隱含層檢測(cè)目標(biāo)的組件,第三個(gè)隱含層就可以看到目標(biāo)的輪廓了唆垃。如果在第一個(gè)隱含層增加神經(jīng)元數(shù)量五芝,僅僅是增加了邊緣檢測(cè)的正確率,依然不能檢測(cè)圖片中的組件辕万。

3 - 逐步實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)


假設(shè)需要實(shí)現(xiàn)的深度神經(jīng)網(wǎng)絡(luò)層數(shù)為$L$(隱含層數(shù)量為$L-1$)枢步,首先,隨機(jī)初始化各層的參數(shù)渐尿;其次是向前傳播過(guò)程醉途,這里要注意的是,隱含層要使用ReLU激活函數(shù)砖茸,防止深度增加造成梯度消失隘擎;接著計(jì)算loss;然后是向后傳播過(guò)程凉夯,這個(gè)過(guò)程的激活函數(shù)要和向前傳播過(guò)程一致货葬;接著由梯度下降法更新參數(shù)采幌;【向前傳播】-【計(jì)算loss】-【向后傳播】-【更新參數(shù)】是一個(gè)循環(huán),需要迭代計(jì)算num_iterations次震桶;最后是用訓(xùn)練好的模型在測(cè)試集上進(jìn)行預(yù)測(cè)休傍。

其實(shí)現(xiàn)框架圖如下:

深度神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)框架

前向傳播過(guò)程的一種簡(jiǎn)介表示方法: [LINEAR -> RELU] *(L-1) -> LINEAR -> SIGMOID


因此,使用Python實(shí)現(xiàn)上圖所示的深度神經(jīng)網(wǎng)絡(luò)框架蹲姐,需要完成6個(gè)部分的內(nèi)容:

  • 隨機(jī)初始化$L$-layer neural network的參數(shù)
  • 實(shí)現(xiàn)向前傳播(forward propagation)模塊(上圖紫色部分)
    • 單層線性方程組計(jì)算磨取,結(jié)果保存為 $Z^{[l]}$
    • 激活函數(shù) (relu/sigmoid)
    • 將以上兩步組合成一個(gè)新的 [LINEAR->ACTIVATION]向前傳播函數(shù)
    • 堆疊向前傳播函數(shù):[LINEAR->RELU] 重復(fù) L-1次,表示第1至L-1層柴墩,即所有隱含層寝衫;在后面加上一個(gè)[LINEAR->SIGMOID],表示第L層拐邪,也就是輸出層
  • 計(jì)算loss
  • 實(shí)現(xiàn)向后傳播(backward propagation)模塊(上圖紅色部分)
    • 向后傳播過(guò)程主要是計(jì)算當(dāng)前參數(shù)的loss函數(shù)梯度
  • 更新參數(shù)
  • 預(yù)測(cè)函數(shù)

上面6個(gè)部分的python實(shí)現(xiàn)與之前寫的單隱層神經(jīng)網(wǎng)絡(luò)大同小異,值的注意的是各層參數(shù)矩陣的維度變化隘截。

Note: 以上摘自本周課程作業(yè)扎阶,完整的python實(shí)現(xiàn)過(guò)程,請(qǐng)查看課程作業(yè)婶芭!

4 - 確定各層參數(shù)矩陣維度 & 隨機(jī)初始化


與單隱層神經(jīng)網(wǎng)絡(luò)一樣东臀,深度神經(jīng)網(wǎng)絡(luò)的參數(shù)初始化也必須是隨機(jī)的,絕對(duì)不能將所有參數(shù)初始化為0犀农。通常惰赋,使用標(biāo)準(zhǔn)正態(tài)分布來(lái)初始化$W$參數(shù),$b$可以初始化為0呵哨。

對(duì)于深度神經(jīng)網(wǎng)絡(luò)而言赁濒,參數(shù)初始化的另外一個(gè)難點(diǎn)是確定每一層的參數(shù)矩陣維度,這里非常容易出錯(cuò)孟害。假設(shè)輸入數(shù)據(jù)集$X$的大小為$(12288, 209)$ (with $m=209$ examples)拒炎,那么各層參數(shù)矩陣維度可以用下表表示:

其中,$n^{[l]}$ 表示第 $l$ 層的神經(jīng)元數(shù)量挨务。仔細(xì)觀察上表击你,可以發(fā)現(xiàn),第l層的變量維度:

5 - TensorFlow實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)


ng在本周課程編程作業(yè)中提供了cat數(shù)據(jù)集和以下用于識(shí)別圖片中是否有貓的深度神經(jīng)網(wǎng)絡(luò)模型谎柄。

下面用TensorFlow來(lái)實(shí)現(xiàn)丁侄,代碼如下:

import h5py
import numpy as np
import tensorflow as tf

# 讀入數(shù)據(jù)集
train_dataset = h5py.File('datasets/train_catvnoncat.h5', "r")
train_set_x_orig = np.array(train_dataset["train_set_x"][:]) #  train set features  (209, 64, 64, 3)
train_set_y_orig = np.array(train_dataset["train_set_y"][:]) #  train set labels (209, 0)

test_dataset = h5py.File('datasets/test_catvnoncat.h5', "r")
test_set_x_orig = np.array(test_dataset["test_set_x"][:]) # test set features (50, 64, 64, 3)
test_set_y_orig = np.array(test_dataset["test_set_y"][:]) # test set labels (50, 0)

classes = np.array(test_dataset["list_classes"][:]) # the list of classes

train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))
test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))

# Reshape the training and test examples 
train_x_flatten = train_set_x_orig.reshape(train_set_x_orig.shape[0], -1).T   
# The "-1" makes reshape flatten the remaining dimensions
test_x_flatten = test_set_x_orig.reshape(test_set_x_orig.shape[0], -1).T

# Standardize data to have feature values between 0 and 1.
train_x = train_x_flatten/255.
test_x = test_x_flatten/255.
# 啟用tensorboard
import os

if not os.path.exists('log'):
    os.mkdir('log')
    
logdir = os.path.join(os.getcwd(), 'log')
print('啟用tensorboar,請(qǐng)復(fù)制以下代碼(port可以修改)到cmd中朝巫,執(zhí)行:\n',
      'tensorboard --logdir=%s --port=6068' % logdir)
請(qǐng)復(fù)制以下代碼(port可以修改)到cmd中鸿摇,執(zhí)行,啟用tensorboar:
 tensorboard --logdir=C:\Users\Mike\Documents\Blog\manuscripts\log --port=6068
# 定義網(wǎng)絡(luò)結(jié)構(gòu) 
layers_dims = [12288, 20, 7, 5, 1]  
# 輸入層(第一個(gè)數(shù)字)和輸出層(最后一個(gè)數(shù)字)不能修改捍歪,中間的隱含層可以修改户辱,
# 在中間增加數(shù)字就是增加隱含層鸵钝,數(shù)字表示隱含層神經(jīng)元數(shù)量
train_size = train_set_x_orig.shape[0]
L = len(layers_dims)


# 隨機(jī)初始化參數(shù)(單層)
def init_parameters(shape):
    W = tf.get_variable('W', shape, initializer=tf.truncated_normal_initializer(stddev=0.1, seed=1))
    b = tf.get_variable('b', shape=(shape[0],1) , initializer=tf.constant_initializer(0.0))
    return W, b

# 前向傳播
def L_forward_propagation(X, L):
    for i in range(1, L-1):
        if i == 1:
            A_pred = X
        else:
            A_pred = A
        with tf.variable_scope('hidden_layer'+str(i)):
            W, b = init_parameters(shape=(layers_dims[i], layers_dims[i-1]))
            A = tf.nn.relu(tf.matmul(W, A_pred) + b)
    # output layer
    with tf.variable_scope('output_layer'):
        W, b = init_parameters(shape=(layers_dims[L-1], layers_dims[L-2]))
        Y = tf.matmul(W, A) + b  # 這里輸出的是線性方程計(jì)算結(jié)果,并沒(méi)有經(jīng)過(guò)激活函數(shù)
    return Y

# 輸入數(shù)據(jù)
with tf.name_scope('input_layer'):
    X = tf.placeholder(tf.float32, shape=(layers_dims[0], train_size), name='X')
    y_ = tf.placeholder(tf.float32, shape=(layers_dims[-1], train_size), name='Y_label')


y = L_forward_propagation(X, L)


# 計(jì)算損失函數(shù)的命名空間庐镐。
with tf.name_scope("loss_function"):
    cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits=y, labels=y_)
    loss = tf.reduce_mean(cross_entropy)


# 訓(xùn)練模型
learning_rate = 0.05
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
# train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

# 寫入計(jì)算圖到log
summary_writer = tf.summary.FileWriter(logdir, tf.get_default_graph())
summary_writer.close()
num_iterations = 1600

with tf.Session() as sess:
    tf.global_variables_initializer().run()
    for i in range(num_iterations):
        _, total_loss,  = sess.run([train_step, loss ], feed_dict={X: train_x, y_: train_set_y_orig})
        if i % 100 == 0:
            print("After %i training step(s), loss on training set is %s." % (i, str(total_loss)))
After 0 training step(s), loss on training set is 0.693251.
After 100 training step(s), loss on training set is 0.644346.
After 200 training step(s), loss on training set is 0.634704.
After 300 training step(s), loss on training set is 0.564144.
After 400 training step(s), loss on training set is 0.585186.
After 500 training step(s), loss on training set is 0.426819.
After 600 training step(s), loss on training set is 0.381561.
After 700 training step(s), loss on training set is 0.495546.
After 800 training step(s), loss on training set is 0.341763.
After 900 training step(s), loss on training set is 0.376317.
After 1000 training step(s), loss on training set is 0.663143.
After 1100 training step(s), loss on training set is 0.433534.
After 1200 training step(s), loss on training set is 0.183415.
After 1300 training step(s), loss on training set is 0.887958.
After 1400 training step(s), loss on training set is 0.163736.
After 1500 training step(s), loss on training set is 0.0112102.

參考資料


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市必逆,隨后出現(xiàn)的幾起案子怠堪,更是在濱河造成了極大的恐慌,老刑警劉巖名眉,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粟矿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡损拢,警方通過(guò)查閱死者的電腦和手機(jī)陌粹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)福压,“玉大人掏秩,你說(shuō)我怎么就攤上這事【D罚” “怎么了蒙幻?”我有些...
    開封第一講書人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胆筒。 經(jīng)常有香客問(wèn)我邮破,道長(zhǎng),這世上最難降的妖魔是什么仆救? 我笑而不...
    開封第一講書人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任抒和,我火速辦了婚禮,結(jié)果婚禮上派桩,老公的妹妹穿的比我還像新娘构诚。我一直安慰自己,他們只是感情好铆惑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開白布范嘱。 她就那樣靜靜地躺著,像睡著了一般员魏。 火紅的嫁衣襯著肌膚如雪丑蛤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評(píng)論 1 285
  • 那天撕阎,我揣著相機(jī)與錄音受裹,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棉饶,可吹牛的內(nèi)容都是我干的厦章。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼照藻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼袜啃!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起幸缕,我...
    開封第一講書人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤群发,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后发乔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熟妓,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年栏尚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了起愈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡译仗,死狀恐怖告材,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情古劲,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布缰猴,位于F島的核電站产艾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滑绒。R本人自食惡果不足惜闷堡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疑故。 院中可真熱鬧杠览,春花似錦、人聲如沸纵势。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)钦铁。三九已至软舌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牛曹,已是汗流浹背佛点。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人超营。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓鸳玩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親演闭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子不跟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

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

  • 更好的閱讀體驗(yàn),請(qǐng)點(diǎn)擊這里 內(nèi)容概要: 四種常用的激活函數(shù)船响、導(dǎo)數(shù)躬拢,以及為什么需要非線性激活函數(shù) 神經(jīng)元模型 參數(shù)隨...
    binzeng閱讀 2,046評(píng)論 0 1
  • 自律米诉,就是自我約束菱蔬,自我控制。 對(duì)史侣,想要生活的有自律拴泌,我也可以做到,就如我的一位同事說(shuō)的:別人可以你為什么不可以?...
    平凡的開始閱讀 415評(píng)論 0 0
  • 一惊橱、課程筆記 1蚪腐、本次課程的四個(gè)目的: a.What 這個(gè)習(xí)慣到底是什么? b.Why 為什么我們要養(yǎng)成這個(gè)習(xí)慣税朴?...
    iSamo閱讀 340評(píng)論 1 0
  • {古風(fēng)放生} 松水渡舟放生中回季,浪花綻放如玉瑩。祈禱祝福三皈已正林,救出魚眾喜穿行泡一。 江畔公園翠蔭濃,鴿王來(lái)會(huì)喜鵲鳴觅廓。隨...
    真如自在閱讀 266評(píng)論 0 1
  • 本文參加#感悟三下鄉(xiāng)杈绸,青春筑夢(mèng)行#活動(dòng)帖蔓,本人承諾,文章內(nèi)容為原創(chuàng)瞳脓,且為在其他平臺(tái)發(fā)表過(guò)讨阻。 距離暑期社會(huì)實(shí)踐結(jié)束已經(jīng)...
    哈哈哈哈kkw閱讀 145評(píng)論 0 0