国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

BrainScript的基本概念

2019-11-08 02:47:42
字體:
供稿:網(wǎng)友

BrainScript漫步

本節(jié)介紹“brainscript”語言的基本概念。一種新的語言?不要擔心,這是非常直接的。 在CNTK中,在CNTK網(wǎng)絡(luò)描述語言”brainscript”中描述使用BrainScriptNetworkBuilder來定制網(wǎng)絡(luò)定義 。同樣,網(wǎng)絡(luò)的描述被稱為”brainscript”。 brainscript提供了一種簡單的方式來定義網(wǎng)絡(luò),它使用表達式、變量、原始和自定義函數(shù),嵌套塊,和其他很好的理解概念。類似于腳本語言的語法。 ok,讓我們開始一個完整的brainscript例子!

一個完整的brainscript例子網(wǎng)絡(luò)定義


下面的例子顯示了一個隱藏層和一個分類層的簡單的神經(jīng)網(wǎng)絡(luò)的網(wǎng)絡(luò)描述。不妨先花上幾分鐘的時間來試著猜一下這是什么意思。當你閱讀讀下去的時候,你會發(fā)現(xiàn),你猜對了大部分。

BrainScriptNetworkBuilder = { # (we are inside the train section of the CNTK config file) SDim = 28*28 # feature dimension HDim = 256 # hidden dimension LDim = 10 # number of classes # define the model function. We choose to name it 'model()'. model (features) = { # model parameters W0 = ParameterTensor {(HDim:SDim)} ; b0 = ParameterTensor {HDim} W1 = ParameterTensor {(LDim:HDim)} ; b1 = ParameterTensor {LDim} # model formula r = RectifiedLinear (W0 * features + b0) # hidden layer z = W1 * r + b1 # unnormalized softmax }.z # define inputs features = Input {SDim} labels = Input {LDim} # apply model to features z = model (features) # define criteria and output(s) ce = CrossEntropyWithSoftmax (labels, z) # criterion (loss) errs = ErrorPRediction (labels, z) # additional metric P = Softmax (z) # actual model usage uses this # connect to the system. These five variables must be named exactly like this. featureNodes = (features) inputNodes = (labels) criterionNodes = (ce) evaluationNodes = (errs) outputNodes = (P)}

BrainScript Syntax Basics

關(guān)于brainscript語法的幾個一般描述。 brainscript采用一種簡單的語法,旨在像數(shù)學公式一樣表達神經(jīng)網(wǎng)絡(luò)。因此,最基本的語法單位是assignment,可以用來定義變量和函數(shù)。例如:

Softplus (x) = Log (1 + Exp (x))h = Softplus (W * v + b)

Lines, Comments, Include 一條執(zhí)行語句可以放在單行上,也可以放在多行上。還可以多個執(zhí)行語句放在一行上,但是需要用一個分號來分開。例如:

SDim = 28*28 ; HDim = 256 ; LDim = 10 # feature, hidden, and label dimension

BrainScript不是空格敏感。 BrainScript 可以支持在行尾 Python 風格 # 和 C++風格 //的注釋. 還有 C 語法的內(nèi)聯(lián)注釋(/* this is a comment*/),但與c不同的是注釋不能被分割成多行。

進入路徑時可以在文件內(nèi)容中的任何地方插入include "PATH”語句。支持絕對和相對路徑(有或沒有子目錄都可以)。如果是相對路徑的話,按照以下順序搜索:當前工作目錄;include的目錄;配置文件所在的目錄;最后是含有CNTK可執(zhí)行程序的目錄。所有的brainscript函數(shù)都會默認引入一個cntk.core.bs腳本文件,該文件于CNTK可執(zhí)行文件屬于同一目錄。

表達式 接下來是描述你的網(wǎng)絡(luò)的brainscript表達式。brainscript表達式的語法類似于數(shù)學公式。最簡單的表達式是常量,例如數(shù)字和字符串。類數(shù)學公式的例子是W1 * r + b。另一個常見的表達是函數(shù)調(diào)用,例如RectifiedLinear (.)

BrainScript 是一種動態(tài)語言。一個重要的表達式類型是record,使用{...}語法定義,并通過點語法訪問。例如,r = { x = 13 ; y = 42 }分配一個記錄兩成員r,其中第一個成員可以訪問r.x.

除了通常的數(shù)學運算符,BrainScript 有條件表達式(if c then t else f),數(shù)組表達式,和簡單的Lambda表達式。最后,對接CNTK C++代碼,BrainScript 可以直接實例化有限的一組預定義的C++對象,主要是計算網(wǎng)絡(luò)組成的ComputationNode 。有關(guān)更多細節(jié),請參見表達式。

BrainScript 表達式是在于第一次使用時開始計算的。BrainScript 的主要目的是描述網(wǎng)絡(luò),所以一個表達式的值往往不是最終的價值,而是在描述之后圖計算中的一個節(jié)點(如在W1 * r + b)。只有BrainScript 表達式標量(如28×28)是計算時直接計算的。沒有執(zhí)行的表達式(例如,由于條件)從來就不會進行計算。

注:現(xiàn)在不推薦的NDLNetworkBuilder 版本僅支持函數(shù)調(diào)用語法;例如,上述的公式會被寫成Plus (Times (W1, r), b1).。

變量 變量可以保存任何BrainScript 表達式的值(數(shù)字、字符串、數(shù)組、記錄、λ、CNTK C++對象),并可以在表達式中替代。變量是不可變的,即只賦值一次。例如,上面的網(wǎng)絡(luò)例子中的開頭部分:

SDim = 28*28 HDim = 256LDim = 10

這里的變量被設(shè)置為在隨后的表達式中用作參數(shù)的標量數(shù)值。這些值是在訓練中使用的數(shù)據(jù)樣本,隱藏層和標簽的尺寸。這個例子中的設(shè)置是MNIST數(shù)據(jù)集,這是一個收集的28 x 28像素的圖像。每個圖像是一個手寫體數(shù)字(0-9),所以可能有10個標簽,可以應(yīng)用到每個圖像。隱藏的激活維HDim是一個用戶的選擇。

大多數(shù)變量是記錄成員(外部引入的BrainScript 塊是隱式的記錄)。此外,變量可以是函數(shù)參數(shù),也可以作為數(shù)組元素存儲。

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


一個網(wǎng)絡(luò)主要就是通過對輸入的公式描述計算輸出,我們稱這種模型的函數(shù),它通常在BrainScript的具體函數(shù)中定義。作為模型函數(shù)的一部分,用戶必須聲明模型參數(shù)。最后,必須定義網(wǎng)絡(luò)的輸入和標準/輸出。所有這些都被定義為變量。輸入和標準/輸出變量必須被傳遞到系統(tǒng)。 網(wǎng)絡(luò)的模型函數(shù)和模型參數(shù) 模型函數(shù)包含具體的網(wǎng)絡(luò)公式和相應(yīng)的模型參數(shù)。我們的例子使用了矩陣輸入和內(nèi)部提供的能量函數(shù)rectifiedlinear(),所以網(wǎng)絡(luò)的核心功能是由這些方程:

r = RectifiedLinear (W0 * features + b0)z = W1 * r + b1

模型參數(shù)是矩陣,偏置向量,或構(gòu)成學習模型后訓練出的其他值。使用模型參數(shù)張量將輸入樣本數(shù)據(jù)轉(zhuǎn)換為所需的輸出,并通過學習過程中更新。上面的示例網(wǎng)絡(luò)包含以下矩陣參數(shù):

W0 = ParameterTensor {(HDim:SDim)}b0 = ParameterTensor {(HDim)}

在這個例子中,W0是權(quán)重矩陣B0是偏差。ParameterTensor{} 為CNTK內(nèi)部函數(shù),作用是實例化一個向量,矩陣,或任意階張量,并將維數(shù)參數(shù)轉(zhuǎn)化為brainscript數(shù)組(通過冒號:級聯(lián)數(shù)字)。向量的維數(shù)是一個單一的數(shù)字,而矩陣維數(shù)應(yīng)定義為(numrows:numcols)。默認情況下,當通過層henormal時,當直接實例化時, 參數(shù)使用均勻隨機數(shù)來初始化,其他選項的見這里的完整描述。與常規(guī)的函數(shù)不同,parametertensor { }使用大括號來代替圓括號()。BrainScript 的約定中,大括號的功能是創(chuàng)建參數(shù)或?qū)ο螅皇且粋€函數(shù)。 brainscript函數(shù)的形式是f(x)=an expression of x,比如說SQR(x)=×××

我們上述例子中,實際的模型函數(shù)有點復雜:

model (features) = { # model parameters W0 = ParameterTensor {(HDim:SDim)} ; b0 = ParameterTensor {HDim} W1 = ParameterTensor {(LDim:HDim)} ; b1 = ParameterTensor {LDim} # model formula r = RectifiedLinear (W0 * features + b0) # hidden layer z = W1 * r + b1 # unnormalized softmax}.z

來解釋下外面的 { ... } 和最后的 .z ,大括號里面的內(nèi)容是定義了6個變量(W0, b0, W1, b1, r, and z).模型函數(shù)的值是z,可以通過z.的形式來訪問,其他的外部變量都無法直接訪問。語句{ ... ; x = ... }.x 是一種使用內(nèi)部變量的用法.

試試將上面的語法使用單一表達式的方式來實現(xiàn),如下:

model (features) = ParameterTensor {(LDim:HDim)} * (RectifiedLinear (ParameterTensor {(HDim:SDim)} * features + ParameterTensor {HDim})) + ParameterTensor {LDim}

這個方式很難讀,更重要的是不允許一個變量在表達式的多個地方出現(xiàn)。

輸入inputs 如下例子,inputs的作用是將樣本和標簽輸入到神經(jīng)網(wǎng)絡(luò):

features = Input {SDim}labels = Input {LDim}

Input{}是定義cntk網(wǎng)絡(luò)時需要的第二個特殊的函數(shù)(第一個是Parameter{}),它將網(wǎng)絡(luò)外面的輸入接收為一個變量:通過readerInput{}的參數(shù)是數(shù)據(jù)維數(shù),在這個例子中,features 輸入的參數(shù)就是樣本數(shù)據(jù)的維數(shù)(我們定義成的SDim),labels 輸入的參數(shù)就是標簽數(shù)據(jù)的維數(shù),input的變量名稱與reader中的參數(shù)名稱一致。

訓練標準和網(wǎng)絡(luò)輸出 我們?nèi)匀恍枰暶骶W(wǎng)絡(luò)的輸出是如何與世界交互的。我們的模型函數(shù)計算邏輯值(非歸一化日志概率)。這些邏輯值可以用來

聲明網(wǎng)絡(luò)標準

測量精度 Ctrl + I

給定一個輸入計算輸出類的概率,根據(jù)一個分類的決定(注意,非標準化的日志后Z通常可以用來直接分類)。

ce = CrossEntropyWithSoftmax (labels, z)

CrossEntropyWithSoftmax()將輸入的樣本通過softmax()函數(shù)計算出的結(jié)果,與真實的值label比較,使用cross-entropy 算出錯誤值,這個錯誤值通過反向傳播(BP)來更新網(wǎng)絡(luò)中的參數(shù),因此,上面例子中,我們通過softmax()的歸一化計算出來的值p,并不是在訓練中使用,而是要得到p需要使用網(wǎng)絡(luò)來計算。(請注意,在許多情況下,Z通常是足夠的分類,在這種情況下,Z本身將是輸出)

CNTK使用Stochastic Gradient Descent (SGD) 在做為學習算法,SGD需要使用全模型參數(shù)來計算目標函數(shù)的梯度,更重要的是,SGD不要求用戶指定的梯度,相反,CNTK每一個內(nèi)置函數(shù)都有其對應(yīng)的函數(shù)導數(shù)。系統(tǒng)自動執(zhí)行網(wǎng)絡(luò)參數(shù)的反向傳播更新。這部分對用戶不可見。用戶再也不用關(guān)注梯度。 除了訓練標準,計算在訓練階段還要經(jīng)常預測錯誤率,通過不斷的訓練,來驗證和改進網(wǎng)絡(luò)系統(tǒng)。CNTK使用如下的函數(shù)來處理:

errs = ClassificationError (labels, z)

這個概率是網(wǎng)絡(luò)通過比較正確標簽和錯誤率計算而來的。通常是由系統(tǒng)來顯示,雖然這是有用的,但它不是強制性使用ClassificationError().

Inputs, Outputs, and Criteria與系統(tǒng)的通信 既然所有變量都定義完了,我們必須告訴系統(tǒng)哪些變量應(yīng)該當作輸入、輸出和標準來處理。通過定義如下5個特殊的變量來實現(xiàn)這一過程:

featureNodes = (features)labelNodes = (labels)criterionNodes = (ce)evaluationNodes = (errs)outputNodes = (z:P)

它的值是數(shù)組,支持用冒號分隔(冒號:是一個brainscript中通過級聯(lián)兩個值或數(shù)組的形式)。上面的outputnodes表明Z和P都為輸出節(jié)點。

注:不推薦使用ndlnetworkbuilder要求數(shù)組中的元素是由逗號分隔的。

概述


上述的7個特殊名稱我們必須要知道:

ParameterTensor{}: 初始化和聲明一個可學習的參數(shù)

Input{}:聲明一個可以從data reader輸入數(shù)據(jù)的變量

featureNodes, labelNodes, criterionNodes, evaluationNodes, and outputNodes: 聲明系統(tǒng)中于輸入、輸出、標準相關(guān)的特殊名稱變量。

另外,本文未提到的還有3個CNTK內(nèi)置的特殊函數(shù):

Constant(): 聲明一個常數(shù)

PastValue() and FutureValue(): 在循環(huán)中不同的時間步長中訪問網(wǎng)絡(luò)函數(shù)中的變量。

還有一些其他的內(nèi)置函數(shù),例如用c++實現(xiàn)的Sigmoid() or Convolution(),在BrainScript 中實現(xiàn)了預定義的庫函數(shù)例如BS.RNNs.LSTMP(),還有作為庫函數(shù)命名空間的(例如:BS.RNNs)參看 Full-Function-Reference 的全部介紹

下一節(jié)BS表達式


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 汕尾市| 长葛市| 太原市| 禹城市| 乐清市| 鸡东县| 微山县| 清原| 章丘市| 英德市| 兰坪| 清苑县| 巴里| 沛县| 平顶山市| 宝清县| 桐乡市| 邯郸县| 绥阳县| 长乐市| 南开区| 赤水市| 滁州市| 东阳市| 潼关县| 阳曲县| 怀安县| 汾阳市| 藁城市| 珲春市| 五常市| 阳原县| 弥勒县| 海阳市| 朝阳市| 博白县| 桐城市| 田东县| 乌海市| 晋中市| 临湘市|