BrainScript CNTK 텍스트 서식 읽기 권한자

이 페이지에서는 BrainScript의 관점에서 CNTKTextFormatReader를 문서화하지만 Python 사용자는 이 문서를 읽어도 학습할 수 있습니다. 개념, 매개 변수 및 패턴은 모두 동일합니다.

CNTKTextFormatReader(나중에 CTF 판독기)는 아래 사양에 따라 형식이 지정된 입력 텍스트 데이터를 사용하도록 설계되었습니다. 다음과 같은 주요 기능을 지원합니다.

  • 파일당 여러 입력 스트림(입력)
  • 스파스 및 조밀한 입력 모두
  • 가변 길이 시퀀스

CNTK 텍스트 형식(CTF)

입력 파일의 각 줄에는 하나 이상의 입력에 대한 하나의 샘플이 포함되어 있습니다. 모든 줄이 시퀀스에 연결되기 때문에(명시적 또는 암시적으로) 하나 이상의 <시퀀스, 입력, 샘플> 관계를 정의합니다. 각 입력 줄의 형식은 다음과 같이 지정해야 합니다.

[Sequence_Id](Sample or Comment)+

where

Sample=|Input_Name (Value )*

Comment=|# some content

  • 각 줄은 시퀀스 ID로 시작하고 하나 이상의 샘플을 포함합니다(즉, 각 줄은 순서가 지정되지 않은 샘플 컬렉션).
  • 시퀀스 ID는 숫자입니다. 생략할 수 있습니다. 이 경우 줄 번호가 시퀀스 ID로 사용됩니다.
  • 각 샘플은 실제로 입력 이름과 해당 값 벡터로 구성된 키-값 쌍입니다(더 높은 차원에 매핑은 네트워크 자체의 일부로 수행됨).
  • 각 샘플은 파이프 기호(|)와 입력 이름(공백 없음), 공백 구분 기호, 값 목록으로 시작합니다.
  • 각 값은 스파스 입력에 대한 숫자 또는 인덱스 접두사 숫자입니다.
  • 탭과 공백을 구분 기호로 서로 교환하여 사용할 수 있습니다.
  • 주석은 파이프 바로 뒤에 해시 기호 |#로 시작한 다음, 주석의 실제로 콘텐츠(본문)로 시작합니다. 본문에는 모든 문자가 포함될 수 있지만 해시 기호를 추가하여 본문 내의 파이프 기호를 이스케이프해야 합니다(아래 예제 참조). 주석의 본문은 줄의 끝 또는 다음 이스케이프되지 않은 파이프까지 계속됩니다.

간단한 예

이 예제는 매개 변수 및 형식 옵션의 최소 집합을 기반으로 합니다.

CTF 판독기를 CNTKTextFormatReader 사용하려면 CNTK 구성의 판독기 섹션에서 다음을 설정합니다readerType.

...
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- 입력 이름(ABC 위 예제)으로 식별되는 입력을 정의하는 하위 섹션입니다. 각 입력 내에서 다음 필수 매개 변수를 지정해야 합니다.
    • 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 는 각 입력 샘플의 시작을 식별합니다. 이 요소는 필수 요소이며 그 뒤에 특파원 값 벡터가 잇습니다.
  • 조밀한 벡터는 부동 소수점 값의 목록일 뿐입니다. 스파스 벡터는 튜플 목록 index:value 입니다.
  • 탭과 공백은 모두 입력 벡터 내의 값 구분 기호와 입력 구분 기호(입력 간)로 허용됩니다.
  • 각 개별 줄은 길이 1의 "시퀀스"를 구성합니다("실제" 가변 길이 시퀀스는 아래 확장 예제에 설명되어 있습니다).
  • 각 입력 식별자는 한 줄에 한 번만 표시할 수 있습니다(줄 요구 사항 당 입력당 하나의 샘플 로 변환됨).
  • 한 줄 내의 입력 샘플 순서는 중요하지 않습니다(개념적으로 각 줄은 키-값 쌍의 순서가 지정되지 않은 컬렉션임).
  • 잘 구성된 각 선은 "줄 바꿈" \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판독기 구성 섹션에서 각각 "Some_very_long_input_name" 및 "Some_other_also_very_long_input_name"에 매핑되는 별칭 a 을 사용합니다.

시퀀스 ID

이미 언급했듯이 입력 파일의 각 개별 줄은 각 입력에 대한 단일 샘플을 포함하는 시퀀스를 나타냅니다. 그러나 줄에 음수가 아닌 숫자가 접두사로 지정되면 해당 시퀀스 ID로 이 숫자가 사용됩니다. 동일한 시퀀스 ID를 공유하는 모든 후속 줄이 병합되어 동일한 시퀀스의 일부가 됩니다. 따라서 N줄에 대해 동일한 숫자 접두사 반복을 사용하면 각 입력에 1과 N 샘플이 포함된 다중 샘플 시퀀스를 빌드할 수 있습니다. 두 번째 줄과 다음 줄에 시퀀스 접두사 생략도 같은 효과가 있습니다. 따라서 위의 예제 데이터 세트는 ID, 4003332005005개의 시퀀스를 정의합니다.100

판독기 섹션의 매개 변수를 설정 skipSequenceIds 하면 true판독기에서 데이터 세트의 모든 명시적 시퀀스 ID를 무시하도록 하고 개별 줄을 개별 시퀀스로 처리합니다. 또한 데이터 세트의 첫 번째 줄에서 시퀀스 ID를 생략하면 동일한 효과가 있습니다. 이 예제와 같이 모든 후속 시퀀스 ID는 무시되고 줄은 개별 시퀀스로 처리됩니다.

|a 1 2 3 |b 100 200
100 |a 4 5 6 |b 101 201
200 |b 102983 14532 |a 7 8 9

시퀀스를 사용할 때 고려해야 할 몇 가지 최종 사항은 다음과 같습니다.

  • 시퀀스 ID는 고유해야 합니다.
  • ID 접두사는 연속된 줄에 대해서만 반복할 수 있습니다.
  • 줄의 시퀀스 길이(즉, 동일한 ID 접두사를 공유하는 줄 수)는 이 시퀀스의 샘플에서 최대 입력 길이(입력의 샘플 수)를 초과해서는 안 됩니다.

예를 들어 다음 데이터 세트가 잘못되었습니다.

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의 고유한 "시퀀스"이므로 시퀀스 ID가 필요하지 않습니다.
|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
  • 시퀀스에 대한 시퀀스: 원본 시퀀스를 대상 시퀀스에 매핑합니다. 두 시퀀스는 세로로 정렬되고 가장 쉬운 경우 다른 순서로 인쇄됩니다. 전체 "시퀀스 ID"가 동일하여 조인됩니다(이 경우 "작업 단위 ID"가 됩니다).

참고

현재 줄 수는 가장 긴 시퀀스의 길이를 초과해서는 안됩니다. 즉, 시퀀스를 가로로 정렬해야 합니다. 이는 나중에 해제될 구현 세부 정보입니다.

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: "시퀀스"는 쿼리를 나타내며, 모든 샘플은 손으로 레이블이 지정된 등급의 문서를 나타냅니다. 이 경우 "시퀀스"는 (학습-순위 손실 함수의 컨텍스트에서) 순서가 없는 다중 집합일 뿐입니다.
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
...

구성 매개 변수

매개 변수 Description
precision 입력 값의 부동 소수점 정밀도(double 또는 float)를 지정합니다. 선택 사항, 기본값: .float

reader 섹션

매개 변수 Description
readerType 로드할 지원되는 CNTK 판독기 중 하나를 지정합니다(예: CNTKTextFormatReader). 필수.
file 입력 데이터 세트(Windows 또는 Linux 스타일)를 포함하는 파일의 경로입니다. 필수.
randomize 입력을 임의로 지정할지 여부를 지정합니다(true, false). 선택 사항, 기본값: .true
randomizationSeed 초기 임의화 시드 값(입력 데이터가 다시 임의화될 때 모든 스윕 증분). 선택 사항, 기본값: .0
randomizationWindow 임의화 창의 크기(양수)(예: 임의화 범위)를 지정합니다. 이 매개 변수는 한 번에 메모리에 상주해야 하는 데이터 세트의 양에 영향을 줍니다. 선택 사항으로, 값에 sampleBasedRandomizationWindow 따라 기본값은 샘플에서 전체 데이터 세트의 크기(즉, 입력이 전체 데이터 세트에서 임의로 지정됨) 또는 청크 크기가 32MB인 경우 4GB의 디스크 공간(즉, 128 청크 크기가 32MB인 경우)입니다. 이 매개 변수는 무시됩니다 randomizefalse.
sampleBasedRandomizationWindow 임의화 창의 크기가 특정 수의 샘플로 해석되는 경우 true, 그렇지 않으면 여러 청크로 해석됩니다. 선택 사항, 기본값: .false 마찬가지로 randomizationWindow, 이 매개 변수는 무시됩니다 randomizefalse.
skipSequenceIds 이 경우 true판독기는 입력 파일에서 시퀀스 ID를 무시하고 각 개별 줄을 크기 1의 독립적인 시퀀스로 해석합니다(시퀀스 ID의 섹션 참조). 선택 사항, 기본값: .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-3배). 플래그를 cacheIndextrue 설정하면 캐시 파일을 사용할 수 없거나 부실한 경우(입력 파일보다 오래된) 인덱싱 메타 데이터를 디스크(입력 파일과 동일한 디렉터리)에 쓰도록 판독기에게 알릴 수 있습니다. 쓰기는 최상의 노력이며 판독기 성능에 영향을 미치지 않도록 별도의 스레드에서 수행됩니다. 캐시 파일이 있고 최신 상태이면 판독기는 더 이상 입력 파일을 건너 읽어 인덱스 빌드를 하지 않고 대신 캐시 파일에서 인덱스 로드합니다. 특정 판독기 구성 매개 변수는 인덱싱에 직접적인 영향을 줍니다(예: 값이 frameMode 다르면 시퀀스 수가 다른 인덱스가 발생할 수 있음). 따라서 캐시를 생성한 것과 다른 구성을 가진 판독기에서 캐시 파일을 무시할 수 있습니다. 캐싱의 모든 이점을 확인하려면 후속 재실행 시 구성을 수정하면 안 됩니다.

input 하위 섹션

input 는 각각 적절한 레이블이 지정된 구성 하위 섹션과 여러 개별 입력을 결합합니다. 아래에 설명된 모든 매개 변수는 특정 입력과 연결된 입력 이름 하위 섹션에 따라 다릅니다.

매개 변수 Description
alias 데이터 세트의 입력을 식별하는 데 사용되는 대체 약식 이름(문자열)입니다. 선택 사항
format 입력 형식(dense, sparse)을 지정합니다. 필수.
dim 입력 값의 차원(양수)(예: 조밀한 입력을 위한 샘플의 입력 값 수, 스파스 입력의 인덱스 범위 상한). 필수.
definesMBSize 이 특정 스트림 선택 사항의 샘플에서 미니배치 크기를 계산해야 하는지 여부를 나타내는 플래그(기본값 false)입니다.

CNTK 리포지토리에서 전체 네트워크 정의해당 데이터 세트 예제를 찾을 수 있습니다. CNTKTextFormat 판독 기를 사용하는 엔드투엔드 테스트 도 있습니다.