BrainScript CNTK文字格式讀取器
此頁面會從 BrainScript 的觀點記載 CNTKTextFormatReader,但 Python 使用者也可以閱讀本檔來學習 ,這些概念、參數和模式全都相同。
CNTKTextFormatReader (稍後只要 CTF 讀取器) 就設計來取用根據下列規格格式化的輸入文字資料。 它支援下列主要功能:
- 每個檔案) 多個輸入資料流程 (輸入
- 疏鬆和密集輸入
- 可變長度序列
CNTK CTF) (文字格式
輸入檔中的每個行都包含一或多個輸入的範例。 由於 (明確或隱含地) 每個線條也會附加至序列,因此它會定義一或多個< 序列、輸入、範例 >關聯。 每個輸入行都必須格式化如下:
[Sequence_Id](Sample or Comment)+
其中
Sample=|Input_Name (Value )*
Comment=|# some content
- 每一行都是以序列識別碼開頭,並包含一或多個範例 (,換句話說,每一行都是未排序的範例集合) 。
- 序號是數位。 可以省略,在此情況下,行號會當做序列識別碼使用。
- 每個範例實際上是由輸入名稱組成的索引鍵/值組,而對應的值向量 (對應至較高維度,則會在網路本身) 完成。
- 每個範例的開頭都是管線符號 (
|
) 後面接著輸入名稱, (沒有空格) ,後面接著空白字元分隔符號,然後是值清單。 - 每個值都是疏鬆輸入的數位或索引前置編號。
- 索引標籤和空格都可以交替作為分隔符號使用。
- 批註會以管道開頭,後面緊接著雜湊符號:
|#
,後面接著批註的實際內容 (本文) 。 本文可以包含任何字元,不過主體內的管道符號必須藉由將雜湊符號附加至本文, (請參閱下列範例) 。 批註本文會繼續執行,直到行尾或下一個未逸出管道為止,無論哪一個都先出現。
簡單範例
此範例是以一組最少的參數和格式選項為基礎。
若要在CNTK組態的讀取器區段中,使用 CTF 讀取器將 設定 readerType
CNTKTextFormatReader
為 :
...
reader = [
readerType = "CNTKTextFormatReader"
file = "c:\mydata\SampleInput.txt" # See the second example for Linux path example
# IMPORTANT!
# All inputs are grouped within "input" sub-section.
input = [
A = [
dim = 5
format = "dense"
]
B = [
dim = 1000000
format = "sparse"
]
C = [
dim = 1
format = "dense"
]
]
]
# the rest of the cntk config ...
(此片段以及本檔中的其他 NDL 範例僅 reader
提供區段,省略其餘CNTK組態;如需一組完整範例網路和對應資料集的指標,請參閱此頁面結尾,以取得一組完整的範例網路和對應的資料集)
CTF 讀取器需要下列一組參數:
file
- 具有資料集的檔案路徑。input
- 子區段,定義輸入名稱 (A
所識別的輸入,B
並在C
上述範例中) 。 在每個輸入中,必須指定下列必要參數:format
- 指定輸入類型。dense
必須是 或sparse
dim
- 為 密集 輸入指定輸入值向量 (維度,這會直接對應至每個樣本中的值數目,對於 疏 松,這代表可能索引值範圍) 的上限。
與上述讀取器組態對應的輸入資料看起來應該像這樣:
|B 100:3 123:4 |C 8 |A 0 1 2 3 4 |# a CTF comment
|# another comment |A 0 1.1 22 0.3 54 |C 123917 |B 1134:1.911 13331:0.014
|C -0.001 |# a comment with an escaped pipe: '|#' |A 3.9 1.11 121.2 99.13 0.04 |B 999:0.001 918918:-9.19
請注意下列有關輸入格式的資訊:
|Input_Name
會識別每個輸入範例的開頭。 此元素為必要專案,後面接著對應值向量。- 密集向量只是浮點值的清單;疏鬆向量是 Tuple 的清單
index:value
。 - 索引標籤和空格在 輸入向量) 以及輸入) 之間的 輸入分隔符號 (,可做為值分隔符號 (。
- 下列擴充範例說明每個個別行構成長度為 1 (「Real」 可變長度序列的「序列」) 。
- 每個輸入識別碼只能出現在單一行 (上,每個輸入每個行需求都會轉譯成 一個範例) 。
- 在概念上,一行內輸入樣本的順序並不重要 (,每一行都是索引鍵/值組的未排序集合)
- 每個格式正確的線條都必須以「換行字元」
\n
或「歸位字元、換行字元」\r\n
符號結尾。
擴充範例
此範例會提供所有可能的組態參數,並顯示各種輸入格式選項。 如需此範例中使用的組態參數完整描述,請參閱 下表 。
...
precision="double"
reader = [
readerType = "CNTKTextFormatReader"
file = "/home/mydata/SampleInput.txt" # See the first example for Windows style path example
randomize = true
randomizationWindow = 30
skipSequenceIds = false
maxErrors = 100
traceLevel = 2
chunkSizeInBytes = 1024
keepDataInMemory = true
frameMode = false
input = [
Some_very_long_input_name = [
alias = "a"
dim = 3
format = "dense"
]
Some_other_also_very_long_input_name = [
alias = "b"
dim = 2
format = "dense"
]
]
]
# the rest of the cntk config ...
使用複合讀取器時,其會如下所示:
reader = {
verbosity = 0 ;
randomize = true;
randomizationWindow=30
deserializers = ({
type = "CNTKTextFormatDeserializer" ; module = "CNTKTextFormatReader"
file = "/home/mydata/SampleInput.txt" # See the first example for Windows style path example
maxErrors = 100
skipSequenceIds = false
traceLevel = 2
input = {
qu1fea = {alias = "qui"; dim = 95589; format = "sparse"}
qu2fea = {alias = "quj"; dim = 95589; format = "sparse"}
pairweight = {alias = "wij"; dim = 1; format = "dense"}
}
})
}
接著,對應的輸入檔看起來大致如下:
100 |a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
100 |b 102983 14532 |a 7 8 9
100 |a 7 8 9
200 |b 300 400 |a 10 20 30
333 |b 500 100
333 |b 600 -900
400 |a 1 2 3 |b 100 200
|a 4 5 6 |b 101 201
|a 4 5 6 |b 101 201
500 |a 1 2 3 |b 100 200
上述範例中討論的所有選項,仍適用于這裡。 在上面,我們引進了兩個額外的功能:
輸入名稱別名
輸入名稱可以是任意長名稱,因此在整個輸入檔中重複這些名稱可能沒有空間效率。 若要減輕這種情況,資料集可以使用「別名」,而不是完整的輸入名稱。 接著必須在每個輸入子區段內指定別名。 在我們的範例中,資料集會分別使用別名 和 b
,這些別名 a
會分別對應至讀取器組態區段中的 「Some_very_long_input_name」 和 「Some_other_also_very_long_input_name」。
序列識別碼
如先前所述,輸入檔中的每個個別行都 代表序列, 其中包含每個輸入的單一範例。 不過,如果行前面加上非負數,則會使用數位做為對應的 序列識別碼。所有共用相同序列識別碼的後續行都會合並在一起,成為相同序列的一部分。 因此,針對 N 行重複相同的數值前置詞,即可建立多樣本序列,每個輸入都包含 1 到 N 個樣本。 省略第二行和後續行的序列前置詞具有相同的效果。 因此,上述範例資料集會定義 識別碼 為 100
、 200
、 333
400
和 500
的五個序列。
將讀取器區段中的參數設定 skipSequenceIds
為 true
,會強制讀取器忽略資料集中的所有明確序列識別碼,並將個別的行視為個別序列。 此外,省略資料集中第一行的序列識別碼有相同的效果-- 會忽略所有後續的序列識別碼、視為個別序列的行,如下列範例所示:
|a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
200 |b 102983 14532 |a 7 8 9
使用序列時要考慮的一些最終事項:
- 序列識別碼必須是唯一的。
- 識別碼前置詞只能重複連續行。
- 行中的序列長度 (也就是說,共用相同識別碼前置詞的行數) 不得超過樣本中的最大輸入長度, (此序列中輸入) 的樣本數目。
例如,下列資料集 無效:
100 |a 1 2 3 |b 100 200
200 |a 4 5 6 |b 101 201
100 |b 102983 14532 |a 7 8 9
123 |a 1 2 3 |b 100 200
456 |a 4 5 6
456 |b 101 201
幾個Real-World範例
- 分類:每一行都包含範例,其中包含標籤和特徵。 不需要序列識別碼,因為每一行都是其長度為 1 的「序列」。
|class 23:1 |features 2 3 4 5 6
|class 13:1 |features 1 2 0 2 3
...
- DSSM:每一行都包含來源目的檔案組,透過單字包表示,編碼為疏鬆向量。
|src 12:1 23:1 345:2 45001:1 |tgt 233:1 766:2 234:1
|src 123:1 56:1 10324:1 18001:3 |tgt 233:1 2344:2 8889:1 2234:1 253434:1
- 部分聲控標籤:序列會將每個元素對應至對應的標籤。 序列會垂直對齊 (每行一個單字 + 標記) 。
0 |word 234:1 |tag 12:1
0 |word 123:1 |tag 10:1
0 |word 123:1 |tag 13:1
1 |word 234:1 |tag 12:1
1 |word 123:1 |tag 10:1
...
- 順序分類:對應至單一標籤的序列。 序列垂直對齊;「class」 標籤可以發生在任何具有相同 sequenceId 的行中。
注意
目前行數不得超過最長序列的長度。 這表示標籤無法自行出現在一行上。 這是未來將會隨即提升的實作詳細資料。
0 |word 234:1 |class 3:1
0 |word 123:1
0 |word 890:1
1 |word 11:1 |class 2:1
1 |word 344:1
- 序列到序列:將來源序列對應至目標序列。 這兩個序列會垂直對齊,在最簡單的情況下,只會在另一個序列之後列印。 其聯結方式是擁有相同的整體「順序識別碼」 (,在此情況下會變成「工作單位識別碼」) 。
注意
目前行數不得超過最長序列的長度。 這表示序列必須水準對齊。 這是未來將會隨即提升的實作詳細資料。
0 |sourceWord 234:1 |targetWord 344:1
0 |sourceWord 123:1 |targetWord 456:1
0 |sourceWord 123:1 |targetWord 2222:1
0 |sourceWord 11:1
1 |sourceWord 123:1
...
- Learning排名:「sequence」 代表查詢,每個範例都有一份具有手動標籤評等的檔。 在此情況下,「sequence」 只是 (學習到排名遺失函式內容中的多重集,) 沒有排序。
0 |rating 4 |features 23 35 0 0 0 21 2345 0 0 0 0 0
0 |rating 2 |features 0 123 0 22 44 44 290 22 22 22 33 0
0 |rating 1 |features 0 0 0 0 0 0 1 0 0 0 0 0
1 |rating 1 |features 34 56 0 0 0 45 1312 0 0 0 0 0
1 |rating 0 |features 45 45 0 0 0 12 335 0 0 0 0 0
2 |rating 0 |features 0 0 0 0 0 0 22 0 0 0 0 0
...
組態參數
參數 | 描述 |
---|---|
precision |
指定輸入值的浮點精確度 (double 或 float ) 。 選擇性,預設為 float 。 |
reader
區段
參數 | 描述 |
---|---|
readerType |
指定其中一個支援的CNTK讀取器,以載入 (例如 CNTKTextFormatReader ) 。 必要。 |
file |
包含輸入資料集的檔案路徑, (Windows或 Linux 樣式) 。 必要。 |
randomize |
指定輸入是否應該 (隨機化, false ) true 。 選擇性,預設為 true 。 |
randomizationSeed |
初始隨機化種子值 (在輸入資料重新隨機化) 時遞增每個掃掠。 選擇性,預設為 0 。 |
randomizationWindow |
指定隨機化視窗 ( (正整數) 的大小,亦即隨機化範圍) 。 此參數會影響資料集需要一次存放在記憶體中的數量。 選擇性的,視 sampleBasedRandomizationWindow 值而定,預設為範例中整個資料集的大小 (亦即,輸入會隨機分散到整個資料集) ,或 4GB (的磁碟空間,例如 128 當區塊大小等於 32MB) 時。 當 為 false 時 randomize ,會忽略此參數。 |
sampleBasedRandomizationWindow |
如果 true 為 ,則隨機化視窗的大小會解譯為特定數目的樣本,否則為數個區塊。 選擇性,預設為 false 。 與 randomizationWindow 類似,當 為 false 時 randomize ,會忽略此參數。 |
skipSequenceIds |
如果 true 為 ,則讀取器會忽略輸入檔中的序列識別碼,將每個個別行解譯為大小為 1 的獨立序列, (請參閱序列識別碼) 一節 。 選擇性,預設為 false 。 |
maxErrors |
應該引發例外狀況的輸入錯誤數目。 選擇性,預設為 0 ,這表示第一個格式不正確的值會觸發例外狀況。 |
traceLevel |
輸出詳細資訊層級。 0 - 只顯示錯誤; 1 - 顯示錯誤和警告; 2 - 顯示所有輸出。 選擇性,預設為 1 。 |
chunkSizeInBytes |
單一讀取作業中要從磁片讀取的連續位元組數目。 選擇性,預設為 33554432 (32MB) 。 |
keepDataInMemory |
如果 true 為 ,則會在記憶體中快取整個資料集。 選擇性,預設為 false 。 |
frameMode |
true 表示讀取器使用針對僅包含單一範例) 之框架 (序列優化的封裝方法。 選擇性,預設為 false 。 |
cacheIndex |
指定在前置處理階段期間建置的中繼資料是否應該寫出到磁片,並在有可用 (true 時 false 從磁片載入 ,) 。 選擇性,預設為 false 。 如需詳細資訊,請參閱下面的一節。 CNTK 2.1 版的新功能。 |
索引快取
注意
CNTK 2.1 版的新功能。
索引快取可大幅 (2-3x) 減少啟動時間,特別是在處理大型輸入檔案時。 cacheIndex
將 旗標設定為 true
會向讀取器發出訊號,以將索引中繼資料寫入磁片 (與輸入檔相同的目錄,) 如果快取檔案無法使用,或快取檔案過時 (早于輸入檔) 。 撰寫是最好的工作,而且會在個別的執行緒上執行,以免影響讀取器效能。 如果快取檔案存在且為最新狀態,讀取器將不再流覽輸入檔以建置索引,而是會從快取檔案載入索引。 請注意,某些讀取器組態參數會對索引編制 (產生直接的影響,例如,不同的 值 frameMode
可能會導致具有不同序列數目的索引) 。 基於這個理由,讀取器可能會忽略快取檔案,其設定不同于產生快取的組態。 若要查看快取的完整優點,後續重新執行時不應修改組態。
input
子區段
input
結合一些個別輸入,每個輸入都有適當標記的組態子區段。 以下所述的所有參數都是與特定輸入相關聯的 輸入名稱 子區段所特有。
參數 | 描述 |
---|---|
alias |
用來識別資料集中輸入的替代簡短名稱 (字串) 。 選擇性 |
format |
指定 (的 dense 輸入類型, sparse ) 。 必要。 |
dim |
維度 (輸入值的正整數) ,也就是密集輸入樣本中的輸入 (值數目、疏松輸入) 的索引範圍上限。 必要。 |
definesMBSize |
旗標 (預設為 false) ,指出是否應該在此特定資料流程的樣本中計算迷你批次大小 選擇性。 |
您會在CNTK存放庫中找到完整的網路定義和對應的資料集範例。 您也可以在該處找到使用 CNTKTextFormat 讀取器的 端對端測試 。