企業(yè)級(jí)AI技術(shù)內(nèi)幕:深度學(xué)習(xí)框架開發(fā)+機(jī)器學(xué)習(xí)案例實(shí)戰(zhàn)+Alluxio解密
- 企業(yè)級(jí)AI技術(shù)內(nèi)幕:深度學(xué)習(xí)框架開發(fā)+機(jī)器學(xué)習(xí)案例實(shí)戰(zhàn)+Alluxio解密
- 王家林 段智華編著
- 3544字
- 2021-03-26 23:53:48
2.2 實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的節(jié)點(diǎn)結(jié)構(gòu)
下面通過代碼實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的節(jié)點(diǎn)結(jié)構(gòu)。
chapter2_Create_AI_Framework版本的Node.py的源代碼如下:

第3~10行代碼:設(shè)置和訪問神經(jīng)元在全局所處的層(Layer)。如圖2-13所示,神經(jīng)網(wǎng)絡(luò)分了很多層,需進(jìn)行設(shè)置,如輸入層、隱藏層、輸出層等,各層都有順序。將輸入層作為整個(gè)神經(jīng)網(wǎng)絡(luò)的第0層,如果設(shè)置2個(gè)隱藏層(2個(gè)隱藏層分別包括4個(gè)、2個(gè)神經(jīng)元),那么第1個(gè)隱藏層作為整個(gè)神經(jīng)網(wǎng)絡(luò)的第1層,第2個(gè)隱藏層作為整個(gè)神經(jīng)網(wǎng)絡(luò)的第2層,輸出層作為整個(gè)神經(jīng)網(wǎng)絡(luò)的第3層。

圖2-13 神經(jīng)網(wǎng)絡(luò)的層次
第12~20行代碼:設(shè)置和訪問神經(jīng)元全局唯一的ID,完成身份的設(shè)置。圖2-13中輸入層的x1、x2等輸入節(jié)點(diǎn)有自己的ID,第一層隱藏層的神經(jīng)元(4個(gè)節(jié)點(diǎn))有自己的ID,第二層隱藏層神經(jīng)元(2個(gè)節(jié)點(diǎn))有自己的ID,輸出層的節(jié)點(diǎn)也有自己的ID。
第22~29行代碼:設(shè)置和訪問神經(jīng)元的名稱。神經(jīng)元除了節(jié)點(diǎn)的ID和網(wǎng)絡(luò)層次以外,還需設(shè)置一個(gè)節(jié)點(diǎn)名稱。ID是一個(gè)數(shù)字,就像是節(jié)點(diǎn)的身份證號(hào),label就是節(jié)點(diǎn)的名稱。
第31~38行代碼:判斷當(dāng)前的神經(jīng)元是否是一個(gè)偏愛因子,這是神經(jīng)元除了節(jié)點(diǎn)的ID、網(wǎng)絡(luò)層次、名稱以外,還需考慮的內(nèi)容。因?yàn)槲覀兪敲嫦驅(qū)ο蟮膶?shí)現(xiàn),在神經(jīng)網(wǎng)絡(luò)中有一個(gè)偏愛因子對(duì)象,偏愛因子也是一個(gè)實(shí)體,我們?cè)谂袛嗌窠?jīng)元的時(shí)候,在最開始的時(shí)候有必要判斷是偏愛因子還是具體的特征,所以一個(gè)很重要的步驟,就是要判斷一下元素是神經(jīng)元本身還是偏愛因子。第33行在set_is_bias_unit方法中傳入一個(gè)參數(shù)is_bias_unit,is_bias_unit是一個(gè)布爾值,判斷是不是偏愛因子,如圖2-14所示。

圖2-14 偏愛因子示意圖
這樣最簡(jiǎn)單的神經(jīng)網(wǎng)絡(luò)的神經(jīng)元節(jié)點(diǎn)就構(gòu)建起來了。注意,這里的節(jié)點(diǎn)有兩種類型,一種是神經(jīng)元;另一種是偏愛因子。
下一步的工作是創(chuàng)建神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),從面向?qū)ο缶幊痰慕嵌龋瑒?chuàng)建神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的工作放在service中,我們創(chuàng)建一個(gè)service的文件夾,在service的文件夾中創(chuàng)建一個(gè)業(yè)務(wù)類NetworkStructure.py,在NetworkStructure.py中實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)邏輯。
chapter2_Create_AI_Framework版本的NetworkStructure.py(v1)的源代碼如下:

第8行代碼:構(gòu)建create_nodes方法。要?jiǎng)?chuàng)建神經(jīng)網(wǎng)絡(luò)首先要?jiǎng)?chuàng)建神經(jīng)網(wǎng)絡(luò)的節(jié)點(diǎn),神經(jīng)網(wǎng)絡(luò)中有很多的節(jié)點(diǎn),怎么判斷有多少個(gè)節(jié)點(diǎn)?最簡(jiǎn)單的方法是先去掉隱藏層,實(shí)現(xiàn)輸入層、輸出層,之后再加上隱藏層。而輸入層有多少個(gè)元素取決于有多少個(gè)特征,所以在create_nodes方法中傳入的第一個(gè)參數(shù)是num_of_features,第二個(gè)參數(shù)是hidden_layers,hidden_layers可能是0個(gè)隱藏層,也可能是100個(gè)隱藏層。注意,create_nodes方法這里沒有使用self參數(shù)。
第10行代碼:定義nodeIndex,每個(gè)節(jié)點(diǎn)有自己的節(jié)點(diǎn)ID,神經(jīng)元的ID默認(rèn)從0開始,神經(jīng)元的ID是全局的。
第12~25行代碼:構(gòu)建輸入層的節(jié)點(diǎn)。注意,因?yàn)槟壳斑€不知道輸入層的數(shù)據(jù)是怎樣的,因此輸入層的神經(jīng)元節(jié)點(diǎn)代碼暫不好編寫,從我們能夠入手的角度出發(fā),從輸入層到下一層有偏愛因子,所以先創(chuàng)建偏愛因子,偏愛因子是一個(gè)節(jié)點(diǎn),如圖2-15所示。

圖2-15 創(chuàng)建輸入層的偏愛因子
- 第15行代碼:構(gòu)建偏愛因子的節(jié)點(diǎn)實(shí)例。
- 第17行代碼:通過set_index方法是設(shè)置偏愛因子節(jié)點(diǎn)的index,偏愛因子是輸入層的第0個(gè)節(jié)點(diǎn)。
- 第18行代碼:將偏愛因子節(jié)點(diǎn)的名稱設(shè)置為“+1”。
- 第19行代碼:設(shè)置偏愛因子節(jié)點(diǎn)的set_is_bias_unit為True,即設(shè)置為偏愛因子節(jié)點(diǎn)。
- 第20行代碼:在創(chuàng)建偏愛因子節(jié)點(diǎn)以后,將其加入到所有節(jié)點(diǎn)的數(shù)組集中。
- 第21行代碼:創(chuàng)建偏愛因子節(jié)點(diǎn)以后,將節(jié)點(diǎn)的索引號(hào)nodeIndex加1。
第27~56行代碼:構(gòu)建隱藏層的節(jié)點(diǎn)。隱藏層中既有神經(jīng)元節(jié)點(diǎn)本身,也有偏愛因子節(jié)點(diǎn),首先要看隱藏層里面有多少層,對(duì)應(yīng)每一層去創(chuàng)建不同的節(jié)點(diǎn)。創(chuàng)建隱藏層使用2個(gè)循環(huán),外層循環(huán)遍歷神經(jīng)網(wǎng)絡(luò)有多少層,每層創(chuàng)建一個(gè)偏愛因子節(jié)點(diǎn);內(nèi)層循環(huán)構(gòu)建每個(gè)隱藏層的每一個(gè)神經(jīng)元節(jié)點(diǎn)本身。
- 第28~40行代碼:外層循環(huán)構(gòu)建每個(gè)隱藏層的偏愛因子節(jié)點(diǎn),如圖2-16所示。第35行代碼設(shè)置隱藏層偏愛因子的節(jié)點(diǎn)名稱為“+1”。第36行代碼設(shè)置偏愛因子節(jié)點(diǎn)的set_is_bias_unit為True。
- 第42~53行代碼:內(nèi)層循環(huán)構(gòu)建每個(gè)隱藏層的神經(jīng)元節(jié)點(diǎn)本身,如圖2-17所示。第43行代碼:for循環(huán)是一個(gè)內(nèi)層循環(huán),每一個(gè)隱藏層的神經(jīng)元節(jié)點(diǎn)有多少個(gè)取決于傳進(jìn)來的這一層的隱藏層hidden_layers[i]有多少個(gè)元素,然后在內(nèi)層循環(huán)里面創(chuàng)建該隱藏層內(nèi)部的神經(jīng)元。
第48行代碼:設(shè)置神經(jīng)元節(jié)點(diǎn)名稱。將神經(jīng)元節(jié)點(diǎn)的名稱設(shè)置為“+1”。
第49行代碼:設(shè)置神經(jīng)元節(jié)點(diǎn)的set_is_bias_unit為False。因?yàn)閯?chuàng)建的是神經(jīng)元節(jié)點(diǎn)本身,而不是偏愛因子節(jié)點(diǎn)。

圖2-16 外層循環(huán)構(gòu)建隱藏層的偏愛因子節(jié)點(diǎn)

圖2-17 內(nèi)層循環(huán)構(gòu)建隱藏層的神經(jīng)元節(jié)點(diǎn)本身
構(gòu)建出神經(jīng)網(wǎng)絡(luò)的隱藏層,將每個(gè)隱藏層的神經(jīng)元節(jié)點(diǎn)創(chuàng)建出來,每個(gè)隱藏層的偏愛因子也創(chuàng)建出來了。
第58~66行代碼:構(gòu)建輸出層的節(jié)點(diǎn),如圖2-18所示。

圖2-18 構(gòu)建輸出層的節(jié)點(diǎn)
- 第62行代碼:設(shè)置輸出層節(jié)點(diǎn)的名稱,將神經(jīng)元節(jié)點(diǎn)命名為Output。
- 第63行代碼:設(shè)置輸出層節(jié)點(diǎn)的set_is_bias_unit為False,因?yàn)檩敵鰧拥墓?jié)點(diǎn)顯然不是偏愛因子。
第68行代碼:返回create_nodes方法構(gòu)建的所有節(jié)點(diǎn)的結(jié)果。在create_nodes方法中創(chuàng)建整個(gè)神經(jīng)網(wǎng)絡(luò)的所有節(jié)點(diǎn),創(chuàng)建一個(gè)數(shù)組節(jié)點(diǎn)存放所有的節(jié)點(diǎn),從輸入層、輸出層、隱藏層三個(gè)角度來考慮,實(shí)現(xiàn)輸入層、隱藏層、輸出層不同層次的節(jié)點(diǎn)創(chuàng)建,create_nodes方法最后返回所有節(jié)點(diǎn)的結(jié)果。
這樣就初步創(chuàng)建了神經(jīng)網(wǎng)絡(luò)節(jié)點(diǎn)。NetworkStructure.py(v1)代碼中創(chuàng)建了輸入層的偏愛因子節(jié)點(diǎn)、隱藏層所有的偏愛因子節(jié)點(diǎn)、隱藏層的所有神經(jīng)元節(jié)點(diǎn)、輸出層的節(jié)點(diǎn)。注意,這里還沒有創(chuàng)建輸入層的節(jié)點(diǎn),后續(xù)我們將進(jìn)行迭代完善,加上這部分代碼。
做完這一步,下面需要通過一個(gè)應(yīng)用程序看一下構(gòu)建節(jié)點(diǎn)的情況,創(chuàng)建一個(gè)Neuron_Network_Entry.py文件構(gòu)建一個(gè)入口,將在Neuron_Network_Entry.py文件調(diào)用構(gòu)建神經(jīng)網(wǎng)絡(luò)NetworkStructure.py的方法。
chapter2_Create_AI_Framework的Neuron_Network_Entry.py(v1)的源代碼如下:

第6~9行代碼:構(gòu)建輸入數(shù)據(jù)。為了方便讀者學(xué)習(xí),這里使用二維數(shù)組硬編碼,二維數(shù)組的第一行成員是[0,0,0],第二個(gè)成員是[0,1,1],第三個(gè)成員是[1,0,1],第四個(gè)成員是[1,1,0]。二維數(shù)組有4行3列,觀察發(fā)現(xiàn),二維數(shù)組的四行成員,它的第一列、第二列數(shù)字如果不同,第三列為1;第一列、第二列數(shù)字如果相同,第三列為0,其實(shí)就是邏輯運(yùn)算中的異或操作(Exclusive OR),機(jī)器學(xué)習(xí)可以通過這個(gè)規(guī)律預(yù)測(cè)數(shù)據(jù)是0還是1,這里的數(shù)據(jù)只有2列,當(dāng)然也可以是200列,可從數(shù)據(jù)中關(guān)聯(lián)出某種關(guān)系,基于這種關(guān)系推斷出結(jié)果是0還是1。第1列和第2列是2個(gè)特征,第3列是結(jié)果。
第11行代碼:設(shè)置輸入特征數(shù)。輸入數(shù)據(jù)中有多少個(gè)輸入特征?這里是除了結(jié)果列的其他列的列數(shù)。實(shí)例instances的第0行的長(zhǎng)度是3,但是它的特征是2個(gè),第一列和第二列是特征,第三列是根據(jù)某種關(guān)系(數(shù)學(xué)公式或者某種運(yùn)算法則)得出的結(jié)果。
第13行代碼:設(shè)置隱藏層每一層的神經(jīng)元節(jié)點(diǎn)數(shù),[4,2]表示第一層隱藏層的神經(jīng)元有4個(gè)節(jié)點(diǎn),第二層隱藏層神經(jīng)元有2個(gè)節(jié)點(diǎn)。
第15行代碼:調(diào)用NetworkStructure的create_nodes方法,傳入的第一個(gè)參數(shù)為輸入特征數(shù),傳入的第二個(gè)參數(shù)為隱藏層每一層的神經(jīng)元節(jié)點(diǎn)數(shù)列表。Python帶self與不帶self在調(diào)用時(shí)的區(qū)別為:沒有加self是靜態(tài)方法,可以直接調(diào)用;如果加上self,必須先創(chuàng)建一個(gè)實(shí)例,然后調(diào)用。
(1)帶self,要?jiǎng)?chuàng)建一個(gè)實(shí)例來調(diào)用方法。例如:

(2)不帶self,直接調(diào)用這個(gè)方法。例如:

在Spyder中使用快捷鍵Ctrl + A全選Neuron_Network_Entry.py的代碼,然后使用快捷鍵Shift + Enter運(yùn)行代碼,在Spyder界面中會(huì)顯示相應(yīng)的結(jié)果。
在hidden_layers=[4,2]的情況下,Neuron_Network_Entry.py的運(yùn)行結(jié)果如下。簡(jiǎn)單的創(chuàng)建神經(jīng)元網(wǎng)絡(luò)節(jié)點(diǎn)的代碼運(yùn)行成功。這里創(chuàng)建了2個(gè)隱藏層,第1個(gè)隱藏層有4個(gè)元素,第2個(gè)隱藏層有2個(gè)元素。運(yùn)行結(jié)果第一行中的第一個(gè)“+1”表示輸入層的偏愛因子節(jié)點(diǎn)的名字,“Hidden layer creation:”字符串之后的第一個(gè)“+1”表示第一個(gè)隱藏層的偏愛因子節(jié)點(diǎn)的名字,其后的4個(gè)“+1”分別表示第一個(gè)隱藏層的4個(gè)神經(jīng)元,其中第4個(gè)“+1”顯示時(shí)落到了第二行;運(yùn)行結(jié)果第二行中的“Hidden layer creation:”字符串之后的第一個(gè)“+1”表示第二個(gè)隱藏層的偏愛節(jié)點(diǎn)的名字,其后的2個(gè)“+1”分別表示第二個(gè)隱藏層的2個(gè)神經(jīng)元。在運(yùn)行結(jié)果的第三行打印輸出層的節(jié)點(diǎn)名字Output。

在hidden_layers=[4]的情況下,只有1個(gè)隱藏層,第1個(gè)隱藏層有4個(gè)神經(jīng)元的情況下,Neuron_Network_Entry.py的運(yùn)行結(jié)果如下。第一行中的第一個(gè)“+1”表示輸入層的偏愛因子節(jié)點(diǎn)的名字,“Hidden layer creation:”字符串之后的第一個(gè)“+1”表示第一個(gè)隱藏層的偏愛因子節(jié)點(diǎn)的名字,其后的4個(gè)“+1”分別表示第一個(gè)隱藏層的4個(gè)神經(jīng)元,其中第4個(gè)“+1”顯示時(shí)落到了第二行;在運(yùn)行結(jié)果的第二行打印輸出層的節(jié)點(diǎn)名字Output。

為了更清晰地顯示運(yùn)行結(jié)果,接下來進(jìn)行輸出結(jié)果的格式化。將chapter2_Create_AI_Framework版本的NetworkStructure.py的程序另存為NetworkStructure.py(v1)并修改相關(guān)行的代碼:
(1)調(diào)整NetworkStructure.py(v1)代碼中第35行的節(jié)點(diǎn)名字,將偏愛因子節(jié)點(diǎn)的名字從“+1”修改為i+1。
(2)調(diào)整NetworkStructure.py(v1)代碼中第48行的節(jié)點(diǎn)名字,我們要訪問具體的神經(jīng)元節(jié)點(diǎn)本身,要在神經(jīng)元節(jié)點(diǎn)名稱中凸顯這個(gè)節(jié)點(diǎn)在什么位置,具體獲取神經(jīng)元節(jié)點(diǎn)處于哪一層,及處在這一層中的第幾個(gè)元素,通過N[i][j]的方式命名。

格式化輸出以后的運(yùn)行結(jié)果如下。在hidden_layers=[4,2]時(shí),運(yùn)行結(jié)果第一行中的第一個(gè)“+1”表示輸入層的偏愛因子的名字;第二行“Hidden layer creation:”后的1是第1層隱藏層的偏愛因子的名字,之后是第一個(gè)隱藏層的4個(gè)神經(jīng)元節(jié)點(diǎn)的名字;第三行“Hidden layer creation:”后的2是第2層隱藏層的偏愛因子的名字,之后是第2個(gè)隱藏層的2個(gè)神經(jīng)元節(jié)點(diǎn)的名字。第四行打印輸出層的節(jié)點(diǎn)名字Output。

- AIGC:讓生成式AI成為自己的外腦
- 情感分析進(jìn)階
- 人工智能時(shí)代
- 新智元:機(jī)器+人類=超智能時(shí)代
- ChatGPT速學(xué)通:文案寫作+PPT制作+數(shù)據(jù)分析+知識(shí)學(xué)習(xí)與變現(xiàn)
- 突破邊界:AI大模型驅(qū)動(dòng)數(shù)智化能力變革
- 區(qū)塊鏈技術(shù)及應(yīng)用
- GPT圖解:大模型是怎樣構(gòu)建的
- 洞見未來的“元宇宙”世界(套裝8冊(cè))
- 初中如何用DeepSeek快速提高英語成績(jī)
- 機(jī)器學(xué)習(xí)與學(xué)習(xí)資源適配
- 人工智能革命:歷史、當(dāng)下與未來
- 計(jì)算機(jī)應(yīng)用與數(shù)據(jù)分析+人工智能
- OpenCV深度學(xué)習(xí)應(yīng)用與性能優(yōu)化實(shí)踐
- 元宇宙中的硬科技