共用方式為


BrainScript CNTK文字格式讀取器

此頁面會從 BrainScript 的觀點記載 CNTKTextFormatReader,但 Python 使用者也可以閱讀本檔來學習 ,這些概念、參數和模式全都相同。

CNTKTextFormatReader (稍後只要 CTF 讀取器) 就設計來取用根據下列規格格式化的輸入文字資料。 它支援下列主要功能:

  • 每個檔案) 多個輸入資料流程 (輸入
  • 疏鬆和密集輸入
  • 可變長度序列

CNTK CTF) (文字格式

輸入檔中的每個行都包含一或多個輸入的範例。 由於 (明確或隱含地) 每個線條也會附加至序列,因此它會定義一或多個< 序列、輸入、範例 >關聯。 每個輸入行都必須格式化如下:

[Sequence_Id](Sample or Comment)+

其中

Sample=|Input_Name (Value )*

Comment=|# some content

  • 每一行都是以序列識別碼開頭,並包含一或多個範例 (,換句話說,每一行都是未排序的範例集合) 。
  • 序號是數位。 可以省略,在此情況下,行號會當做序列識別碼使用。
  • 每個範例實際上是由輸入名稱組成的索引鍵/值組,而對應的值向量 (對應至較高維度,則會在網路本身) 完成。
  • 每個範例的開頭都是管線符號 (|) 後面接著輸入名稱, (沒有空格) ,後面接著空白字元分隔符號,然後是值清單。
  • 每個值都是疏鬆輸入的數位或索引前置編號。
  • 索引標籤和空格都可以交替作為分隔符號使用。
  • 批註會以管道開頭,後面緊接著雜湊符號: |# ,後面接著批註的實際內容 (本文) 。 本文可以包含任何字元,不過主體內的管道符號必須藉由將雜湊符號附加至本文, (請參閱下列範例) 。 批註本文會繼續執行,直到行尾或下一個未逸出管道為止,無論哪一個都先出現。

簡單範例

此範例是以一組最少的參數和格式選項為基礎。

若要在CNTK組態的讀取器區段中,使用 CTF 讀取器將 設定 readerTypeCNTKTextFormatReader 為 :

...
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 個樣本。 省略第二行和後續行的序列前置詞具有相同的效果。 因此,上述範例資料集會定義 識別碼100200333400500 的五個序列。

將讀取器區段中的參數設定 skipSequenceIdstrue ,會強制讀取器忽略資料集中的所有明確序列識別碼,並將個別的行視為個別序列。 此外,省略資料集中第一行的序列識別碼有相同的效果-- 會忽略所有後續的序列識別碼、視為個別序列的行,如下列範例所示:

|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 指定輸入值的浮點精確度 (doublefloat) 。 選擇性,預設為 float

reader 區段

參數 描述
readerType 指定其中一個支援的CNTK讀取器,以載入 (例如 CNTKTextFormatReader) 。 必要
file 包含輸入資料集的檔案路徑, (Windows或 Linux 樣式) 。 必要
randomize 指定輸入是否應該 (隨機化, false) true選擇性,預設為 true
randomizationSeed 初始隨機化種子值 (在輸入資料重新隨機化) 時遞增每個掃掠。 選擇性,預設為 0
randomizationWindow 指定隨機化視窗 ( (正整數) 的大小,亦即隨機化範圍) 。 此參數會影響資料集需要一次存放在記憶體中的數量。 選擇性的,視 sampleBasedRandomizationWindow 值而定,預設為範例中整個資料集的大小 (亦即,輸入會隨機分散到整個資料集) ,或 4GB (的磁碟空間,例如 128 當區塊大小等於 32MB) 時。 當 為 falserandomize ,會忽略此參數。
sampleBasedRandomizationWindow 如果 true 為 ,則隨機化視窗的大小會解譯為特定數目的樣本,否則為數個區塊。 選擇性,預設為 false 。 與 randomizationWindow 類似,當 為 falserandomize ,會忽略此參數。
skipSequenceIds 如果 true 為 ,則讀取器會忽略輸入檔中的序列識別碼,將每個個別行解譯為大小為 1 的獨立序列, (請參閱序列識別碼) 一節選擇性,預設為 false
maxErrors 應該引發例外狀況的輸入錯誤數目。 選擇性,預設為 0 ,這表示第一個格式不正確的值會觸發例外狀況。
traceLevel 輸出詳細資訊層級。 0 - 只顯示錯誤; 1 - 顯示錯誤和警告; 2 - 顯示所有輸出。 選擇性,預設為 1
chunkSizeInBytes 單一讀取作業中要從磁片讀取的連續位元組數目。 選擇性,預設為 33554432 (32MB) 。
keepDataInMemory 如果 true 為 ,則會在記憶體中快取整個資料集。 選擇性,預設為 false
frameMode true 表示讀取器使用針對僅包含單一範例) 之框架 (序列優化的封裝方法。 選擇性,預設為 false
cacheIndex 指定在前置處理階段期間建置的中繼資料是否應該寫出到磁片,並在有可用 (truefalse 從磁片載入 ,) 。 選擇性,預設為 false 。 如需詳細資訊,請參閱下面的一節。 CNTK 2.1 版的新功能。
索引快取

注意

CNTK 2.1 版的新功能。

索引快取可大幅 (2-3x) 減少啟動時間,特別是在處理大型輸入檔案時。 cacheIndex將 旗標設定為 true 會向讀取器發出訊號,以將索引中繼資料寫入磁片 (與輸入檔相同的目錄,) 如果快取檔案無法使用,或快取檔案過時 (早于輸入檔) 。 撰寫是最好的工作,而且會在個別的執行緒上執行,以免影響讀取器效能。 如果快取檔案存在且為最新狀態,讀取器將不再流覽輸入檔以建置索引,而是會從快取檔案載入索引。 請注意,某些讀取器組態參數會對索引編制 (產生直接的影響,例如,不同的 值 frameMode 可能會導致具有不同序列數目的索引) 。 基於這個理由,讀取器可能會忽略快取檔案,其設定不同于產生快取的組態。 若要查看快取的完整優點,後續重新執行時不應修改組態。

input 子區段

input 結合一些個別輸入,每個輸入都有適當標記的組態子區段。 以下所述的所有參數都是與特定輸入相關聯的 輸入名稱 子區段所特有。

參數 描述
alias 用來識別資料集中輸入的替代簡短名稱 (字串) 。 選擇性
format 指定 (的 dense 輸入類型, sparse) 。 必要
dim 維度 (輸入值的正整數) ,也就是密集輸入樣本中的輸入 (值數目、輸入) 的索引範圍上限。 必要
definesMBSize 旗標 (預設為 false) ,指出是否應該在此特定資料流程的樣本中計算迷你批次大小 選擇性

您會在CNTK存放庫中找到完整的網路定義對應的資料集範例。 您也可以在該處找到使用 CNTKTextFormat 讀取器的 端對端測試