BrainScript 및 Python: 읽기 권한자 이해 및 확장
버전 1.5부터 CNTK는 모놀리식 판독기 디자인에서 다른 형식의 입력 데이터를 지정하고 작성할 수 있는 보다 구성 가능한 모델로 이동하고 있습니다.
이전에는 각 판독기마다 다음을 포함하되 제한되지 않는 데이터 읽기의 다양한 측면을 담당했습니다.
- 외부 스토리지에서 메모리 내 표현으로 데이터 역직렬화
- 전체 코퍼스의 임의화
- 입력 시퀀스/샘플의 다양한 변환(예: 이미지 자르기 또는 크기 조정)
- GPU에서 사용할 수 있는 레이아웃을 사용하여 다양한 모드(즉, 프레임, 시퀀스 또는 잘린 BPTT)에 대한 미니배치 만들기
- 미니배치 및 IO 청크 수준에서 프리페치
버전 1.5에서는 위의 기능의 주요 부분을 고려한 후 코어 CNTK로 이동하여 서로 다른 판독기 간에 공유할 수 있습니다. 또한 이 버전에는 새 데이터 형식을 지원하기 위해 확장할 수 있는 두 가지 주요 추상화가 도입되었습니다.
- deserializer - 외부 스토리지에서 메모리 내 시퀀스로 입력의 역직렬화를 담당합니다.
- transform - 입력 시퀀스를 출력 시퀀스로 변환합니다.
다음 섹션에서는 이러한 추상화에 대해 자세히 설명합니다.
Python에서 판독기(미니배치 원본) 구성
이 섹션에서는 Python에서 복합 판독기(즉, MinibatchSource)를 구성하는 방법에 대한 몇 가지 예를 제공합니다.
다음 예제는 AlexNet_ImageNet_Distributed.py에서 조정되었으며 Transforms 섹션의 AlexNet 판독기에 해당하는 Python을 보여 줍니다.
import cntk.io
mean_file = ...
map_file = ...
# model dimensions
image_height = 227
image_width = 227
num_channels = 3 # RGB
num_classes = 1000
transforms = [
ImageDeserializer.crop(crop_type='randomside',
side_ratio=0.88671875,
jitter_type='uniratio'),
ImageDeserializer.scale(width=image_width,
height=image_height,
channels=num_channels,
interpolations='linear'),
ImageDeserializer.mean(mean_file)
]
reader = MinibatchSource(
ImageDeserializer(map_file, StreamDefs(
# first column in map file is referred to as 'image'
features = StreamDef(field='image', transforms=transforms),
# and second as 'label'
labels = StreamDef(field='label', shape=num_classes))))
다음 예제(A2_RunCntk_py3.py에서 조정됨)는 여러 역직렬 변환기를 함께 결합할 수 있는 방법을 보여 줍니다.
n_rois = 100
n_classes = 17
rois_dim = 4 * n_rois
label_dim = n_classes * n_rois
map_file = ...
roi_file = ...
label_file = ...
# read images
scale = ImageDeserializer.scale(width=1000,
height=1000,
channels=3,
scale_mode="pad",
pad_value=114,
interpolations='linear')
image_source = ImageDeserializer(map_file)
image_source.ignore_labels()
image_source.map_features('features', [scale])
# read rois and labels
roi_source = CTFDeserializer(roi_file)
roi_source.map_input('rois', dim=rois_dim, format="dense")
label_source = CTFDeserializer(label_file)
label_source.map_input('roiLabels', dim=label_dim, format="dense")
# define a composite reader
reader = MinibatchSource([image_source, roi_source, label_source])
...
# define mapping from reader streams to network inputs
input_map = {
image_input: reader.streams.features,
roi_input: reader.streams.rois,
label_input: reader.streams.roiLabels
}
BrainScript
디 시리얼 라이저
엔드투엔드 LSTM/FullUtterance 테스트(여기서 전체 구성)에서 HTKMLFReader에 대한 다음 구성 조각을 살펴보겠습니다.
...
# Old reader config. For illustration only.
reader = [
readerType = "HTKMLFReader"
readMethod = "blockRandomize"
nbruttsineachrecurrentiter = 32
randomize = "auto"
verbosity = 0
features = [
dim = 363
type = "real"
scpFile = "$DataDir$/glob_0000.scp"
]
labels = [
mlfFile = "$DataDir$/glob_0000.mlf"
labelMappingFile = "$DataDir$/state.list"
labelDim = 132
labelType = "category"
]
]
이 구성 조각은 이름과 "features"
"labels"
함께 두 개의 데이터 스트림을 생성하는 판독기를 선언합니다. 다음 두 가지 형식의 파일을 입력합니다.
- HTK parlance에서 파일로
scp
알려진 기능 파일 목록("스크립트" 파일) - 파일("마스터 레이블 파일")로
mlf
알려진 레이블 파일
위의 구성 조각에는 역직렬화 방법 scp
또는 mlf
형식을 정의하는 명시적 엔터티가 없습니다.
모든 항목은 HTKMLFReader 구성에 캡슐화됩니다.
따라서 다른 데이터 형식의 다른 입력 스트림을 함께 scp
mlf
노출해야 하는 경우 HTKMLFReader 를 변경하고 지원을 추가해야 합니다.
구성성을 높이고 재사용하기 위해 동일한 입력에 대한 새 구성은 역직렬 변환기 및 생성되는 입력 스트림을 명시적으로 정의합니다.
reader = [
verbosity = 0
randomize = true
# A list of deserializers the reader uses.
deserializers = (
[
# Type of deserializer, in this case the one that knows
# how to deserialize HTK feature files.
type = "HTKFeatureDeserializer"
# Module (.dll or .so) where this deserializer is implemented
module = "HTKDeserializers"
# Description of input streams the deserializer provides,
# can be one or many, depending on a particular
# deserializer implementation
# For HTKFeatureDeserializer, just one stream can be described.
input = [
# Description of input stream to feed the Input node named "features"
features = [
dim = 363
scpFile = "$DataDir$/glob_0000.scp"
]
]
]:
[
# Type of deserializer, in this case the one
# that knows how to deserialize mlf files.
type = "HTKMLFDeserializer"
module = "HTKDeserializers"
# Description of input streams the deserializer provides,
# For HTKMLFDeserializer, just one stream can be described.
input = [
# Description of input stream to feed the Input node named "labels"
labels = [
dim = 132
mlfFile = "$DataDir$/glob_0000.mlf"
labelMappingFile = "$DataDir$/state.list"
# whether phone boundary information should be encoded
# set to true in CTC-type training
phoneBoundaries=false
]
]
]
)
]
및 htk
역직렬 변환기에서 생성된 mlf
시퀀스는 논리 키(음성 발화를 고유하게 식별하고 파일 모두 scp
mlf
에 있는 문자열)를 기반으로 함께 결합됩니다.
다른 형식의 다른 스트림이 필요한 경우 구성에 해당 역직렬 변환기를 추가할 수 있습니다(현재 HTK 기능 및 HTK MLF 역직렬 변환기에서는 각각 둘 이상의 입력 스트림을 노출할 수 없음).
참고
현재 이전 및 새 판독기 구성이 모두 지원됩니다. 판독기 구성에서 "deserializers" 키를 사용하는 경우 판독기 형식은 암시적으로 "CompositeDataReader"로 설정됩니다. CompositeDataReader 모듈을 Windows Cntk.Composite.dll
에 로드할 수 있도록 하려면 CNTK 실행 파일과 동일한 디렉터리에 있어야 합니다. Linux Cntk.Composite.so
의 lib
경우 CNTK 실행 파일이 포함된 폴더에 bin
나란히 배치된 폴더에 있어야 합니다.
현재 CNTK는 아래 역직렬 변환기를 지원합니다.
역직렬 변환기 유형 | 모듈 | 설명 |
---|---|---|
HTKFeatureDeserializer | HTKDeserializers | HTK 기능 파일에 대한 역직렬 변환기 |
HTKMLFDeserializer | HTKDeserializers | HTK MLF 파일에 대한 역직렬 변환기 |
ImageDeserializer | ImageReader | 일반 파일 또는 zip 보관으로 인코딩된 이미지의 역직렬 변환기입니다. |
Base64ImageDeserializer | ImageReader | 매핑 파일에서 base64 문자열로 인코딩된 이미지의 역직렬 변환기입니다. |
CNTKTextFormatDeserializer | CNTKTextFormatReader | CNTK 텍스트 형식 파일에 대한 역직렬 변환기 |
CNTKBinaryFormatDeserializer | CNTKBinaryReader | CNTK 이진 형식 파일에 대한 역직렬 변환기 |
구성 매개 변수에 대한 전체 설명은 아래 표를 참조하세요.
변형
변환은 시퀀스를 입력으로 사용하고, 시퀀스에서 샘플의 일부 변환을 수행하고, 출력 시퀀스를 반환하는 간단한 추상화입니다. 변환의 일반적인 예는 자르기, 크기 조정 또는 트랜스포지션과 같은 이미지의 다양한 변환입니다. 변환은 입력 단위로 구성할 수 있습니다.
변환을 입력에 적용하는 방법을 살펴보겠습니다(구성은 Tests/EndToEndTests/Image/AlexNet 테스트에서 수행됨).
deserializers = ([
type = "ImageDeserializer"
module = "ImageReader"
# Map file which maps images to labels
file = "$ConfigDir$/train_map.txt"
# Description of input streams
input = [
# Description of input stream to feed the Input node named "features"
features = [
transforms = (
[
type = "Crop"
# Possible values: Center, RandomSide, RandomArea, Multiview10. Default: Center
cropType = "RandomSide"
# Crop scale side ratio.
sideRatio = 0.875
# Crop scale ratio jitter type
jitterType = "UniRatio"
]:[
type = "Scale"
width = 224
height = 224
channels = 3
# Interpolation to use when scaling image to width x height size.
interpolations = "linear"
]:[
type = "Mean"
# Stores mean values for each pixel in OpenCV matrix XML format.
meanFile = "$ConfigDir$/ImageNet1K_mean.xml"
]:[
# Changes the image layout from HWC to CHW
type = "Transpose"
]
)
]
# Description of input stream to feed the Input node named "labels"
labels = [
labelDim = 1000
]
]
]
])
이 구성에서는 입력 스트림 features
에 4개의 변환이 적용됩니다.
처음에 이미지 데이터 역직렬 변환기는 HWC 표현에서 단일 이미지로 구성된 시퀀스를 생성합니다.
그런 다음 정렬된 변환 목록이 이미지에 적용됩니다. 먼저 자르기 변환, 배율 및 평균이 그 뒤를 잇습니다.
마지막 변환은 이미지 레이아웃을 HWC에서 CHW로 변경하는 Transpose 입니다.
현재 다음 변환이 구현됩니다. 자세한 설명은 ImageReader를 참조하세요.
변환 형식 | 모듈 |
---|---|
Crop | ImageReader |
확장 | ImageReader |
색 | ImageReader |
평균 | ImageReader |
바꾸기 | ImageReader |
새 판독기 구성 형식 설명
여러 데이터 역직렬 변환기를 구성하는 판독기 구성 섹션은 다음과 같습니다.
reader = [
randomize = true|false
verbosity = 0|1|2
...
deserializers = (
[<deserializerConfiguration1>]:
[<deserializerConfiguration2>]:
...
[<deserializerConfigurationN>]
)
]
각 역직렬 변환기 구성은 다음과 같이 지정됩니다.
[
module = "<readerModuleName>" # Name of the external module (.dll or .so) where this particular deserializer is implemented
type = "<deserializerType>" # The type of the deserializer
# There could be more deserializer-specific options in this section
# Date deserializer input - describes a set of streams this deserializer produces.
# It can be one (as in HTK) or many (as in CNTKTextFormat)
input = [
# Replace 'InputNameN' by the name of the corresponding input node in the network.
InputName1 = [<inputConfiguration>]
InputName2 = [<inputConfiguration>]
...
]
]
입력 구성에는 입력 관련 옵션과 필요에 따라 입력에 적용해야 하는 순서가 지정된 변환 목록이 포함됩니다.
[
# Per-input data deserializer-specific options
# Optionally a pipeline of transformations, to be implemented by data deserializer's reader module:
transforms = (
[<transformationConfiguration1>]:
[<transformationConfiguration2>]:
...
[<transformationConfigurationN>]
)
]
변환 구성은 변환 유형 및 변환 관련 옵션을 식별합니다.
[
type = "<transformName>"
# Transform-specific options
]
구성 옵션
일반 판독기 구성
매개 변수 | Description |
---|---|
verbosity |
Verbosity 수준(0 , 1 , 2 ), 다양한 구성 요소(Randomizer, Deserializer, Bundler 등)의 진단 출력을 제어합니다. 선택 사항, 기본값: .0 |
randomize |
입력을 임의로 지정할지 여부를 지정합니다( true , false ). 임의화 메서드는 HTKMLFReader의 blockRandomize와 동일합니다. 선택 사항, 기본값: .true |
randomizationSeed |
초기 임의화 시드 값(입력 데이터가 다시 임의화될 때 모든 스윕 증분). 선택 사항, 기본값: .0 |
randomizationWindow |
임의화 창의 크기(양수)(예: 임의화 범위)를 지정합니다. 이 매개 변수는 한 번에 메모리에 상주해야 하는 데이터 세트의 양에 영향을 줍니다. 선택 사항으로, 기본값은 전체 데이터 세트 의 크기(값에 sampleBasedRandomizationWindow 따라 샘플 또는 청크 단위)로 설정됩니다. 그러나 역직렬 변환기 CNTKTextFormatDeserializer sampleBasedRandomizationWindow 중 하나가 명시적으로 설정 true randomizationWindow 되지 않은 경우 기본적으로 설정 128 됩니다(청크당 약 4GB의 디스크 공간). 이 매개 변수는 다음과 같은 경우 randomize 무시됩니다 false . |
sampleBasedRandomizationWindow |
임 true 의화 창의 크기가 특정 개수의 샘플로 해석되고 그렇지 않으면 여러 청크로 해석됩니다. 선택 사항으로, 역직렬 변환기 목록에 없는 경우와 그렇지 않은 경우 CNTKTextFormatDeserializer 를 기본값 true 으로 false 지정합니다. 마찬가지로 randomizationWindow 이 매개 변수는 무시됩니다 randomize false . |
truncationLength |
BPTT(양의 정수)에 대한 샘플의 잘림 길이를 지정합니다. 필요한 경우에만 truncated 필요합니다. true 그렇지 않으면 무시됩니다. |
multiThreadedDeserialization |
역직렬 변환기(true , false )에서 미니배치 시퀀스를 수집할 때 여러 스레드를 사용해야 하는지를 지정합니다. 선택 사항입니다. |
frameMode |
데이터를 임의로 지정하고 프레임 또는 시퀀스 수준에서 반환해야 하는지 여부를 지정합니다. 입력 true 시퀀스가 프레임으로 분할되는 경우 선택 사항입니다. 둘 다 frameMode 동시에 truncated 설정할 true 수 없습니다. |
truncated |
이 경우 true 시간(BPTT)을 통해 잘린 백 전파를 사용하도록 설정합니다. 선택 사항입니다. 둘 다 frameMode 동시에 truncated 설정할 true 수 없습니다. |
useNumericSequenceKeys |
시퀀스 키는 서로 다른 역직렬 변환기 간의 상관 관계를 지정하는 데 사용됩니다. 일부 역직렬 변환기(예: HTK 및 MLF)의 경우 시퀀스 키는 임의의 문자열입니다. 이를 저장하려면 큰 코퍼스에 많은 메모리가 필요합니다. 시퀀스 키가 숫자라고 확신하는 경우 이 매개 변수를 true로 설정하세요. 이 경우 모든 문자열 키가 메모리 압력을 줄이는 정수로 변환됩니다. 선택 사항, 기본값 false . |
hashSequenceKeys |
위에서 설명한 메모리상의 이유로 이 매개 변수를 true로 설정하여 문자열 키를 해시할 수도 있습니다. 문자열 시퀀스 키(HTK, MLF)를 지원하는 역직렬 변환기에서만 사용하세요. 선택 사항, 기본값 false . |
cacheIndex |
전처리 단계에서 빌드된 메타 데이터를 디스크에 기록하고 사용 가능한 경우 디스크에서 로드할지 여부를 지정합니다(true 예 false : ). 선택 사항입니다. 기본값은 .입니다 false . 자세한 내용은 아래 섹션을 참조하세요. CNTK 버전 2.1의 새로운 기능 |
인덱스 캐싱
참고
CNTK 버전 2.1의 새로운 기능
인덱스 캐싱을 사용하면 특히 큰 입력 파일로 작업할 때 시작 시간을 크게 줄일 수 있습니다(2-3배). 플래그를 cacheIndex
true
설정하면 캐시 파일을 사용할 수 없거나 부실한 경우(입력 파일보다 오래된) 인덱싱 메타 데이터를 디스크(입력 파일과 동일한 디렉터리)에 쓰도록 판독기에게 알릴 수 있습니다. 쓰기는 최상의 노력이며 판독기 성능에 영향을 미치지 않도록 별도의 스레드에서 수행됩니다. 캐시 파일이 있고 최신 상태이면 판독기는 더 이상 입력 파일을 탈지하여 인덱스 빌드를 하지 않고 캐시 파일에서 인덱스로 로드합니다. 특정 판독기 구성 매개 변수는 인덱싱에 직접적인 영향을 줍니다(예를 들어 값이 frameMode
다르면 시퀀스 수가 다른 인덱스가 발생할 수 있음). 따라서 캐시를 생성한 것과 다른 구성을 가진 판독기에서 캐시 파일을 무시할 수 있습니다. 캐싱의 모든 이점을 확인하려면 후속 재실행 시 구성을 수정해서는 안 됩니다.
cacheIndex
는 ImageDeserializer 및 CNTKBinaryFormatDeserializer에 영향을 주지 않습니다. 전자는 입력 데이터를 인덱싱하지 않고 나중에 형식 자체에 포함된 인덱스 정보를 포함하기 때문에 발생합니다.
일반 역직렬 변환기 구성
매개 변수 | Description |
---|---|
module |
데이터 역직렬 변환기를 구현하는 판독기 모듈 이름을 지정합니다. 필수. |
type |
지정된 판독기 모듈에서 노출하는 데이터 역직렬 변환기 이름을 지정합니다. 필수. |
일반 변환 구성
매개 변수 | Description |
---|---|
type |
데이터 역직렬 변환기를 구현하는 판독기 모듈에서 노출하는 변환 이름을 지정합니다. 필수. |
HTKFeatureDeserializer 옵션
매개 변수 | Description |
---|---|
scpFile |
처리할 SCP 파일의 경로 목록입니다. 파일은 HTK 호환 파일이어야 하며 "보관" 형식으로 지정해야 합니다. 아카이브 사용에 대한 자세한 내용은 HTKMLF 판독기에서 설명합니다. 필수. |
dim |
원하는 컨텍스트 창을 사용하여 전체 기능 벡터 차원을 지정하는 정수입니다. 1필요 |
contextWindow |
양의 정수 쌍 또는 단일 양의 정수로 지정할 수 있습니다(이 경우 동일한 숫자가 두 번 반복되는 쌍으로 해석됨). 샘플에서 컨텍스트 창의 왼쪽 및 오른쪽 크기(쌍의 첫 번째 및 두 번째 정수)를 지정합니다. 선택 사항입니다. 기본값은 .입니다 1 . |
prefixPathInSCP |
SCP 파일 내에 지정된 경로에 적용할 접두사 문자열입니다. 선택 사항입니다. |
1 예를 들어 72차원 기능(24차원 필터뱅크 기능과 델타 및 델타-델타 계수)이 있고 네트워크가 11프레임을 컨텍스트 창으로 처리하도록 설계된 경우 지정된 차원은 792여야 합니다.
HTKMLFDeserializer 옵션
매개 변수 | Description |
---|---|
mlfFile |
파일에 지정된 모든 발화의 레이블을 포함하는 HTK 스타일 mlf 파일의 scp 경로입니다. 지정하지 않은 경우 mlfFileList 필수입니다. |
mlfFileList |
파일에 지정된 scp 모든 발화의 레이블을 포함하는 HTK 스타일 mlf 파일에 대한 경로 배열입니다. 지정하지 않은 경우 mlfFile 필수입니다. |
dim |
레이블 집합의 총 카디널리티(양의 정수)입니다. 필수. |
labelMappingFile |
파일에 표시되는 모든 레이블을 나열하는 파일의 mlf 경로이며 한 줄당 하나씩 표시됩니다. 필수. |
labelDim은 dim의 동의어로 사용할 수 있습니다.
CNTKTextFormatDeserializer 옵션
CNTKTextFormatReader와 함께 사용할 수 있는 동일한 옵션
ImageDeserializer 옵션
file
: 각 줄에 논리 시퀀스 키, 이미지 파일(예: JPEG, PNG 등) 및 0 기반 레이블 간의 탭으로 구분된 매핑이 포함된 간단한 텍스트 파일입니다.
자세한 내용은 ImageReader를 참조하세요.
Base64ImageDeserializer 옵션
이 역직렬 변환기는 ImageDeserializer와 함께 사용할 수 있는 동일한 옵션을 지원합니다. 유일한 차이점은 매핑 파일의 형식입니다.
file
: 각 줄에 논리 시퀀스 키(선택 사항, 생략 가능), 0 기반 범주 레이블 및 base 64로 인코딩된 이미지 파일(예: JPEG, PNG 등) 간에 탭으로 구분된 매핑이 포함된 간단한 텍스트 파일입니다.
구성 및 테스트의 예
CNTK 리포지토리에서 전체 네트워크 정의 및 해당 데이터 집합 예제를 찾을 수 있습니다. 역직렬 변환기를 사용하는 단위 및 엔드 투 엔드 테스트도 있습니다.
- https://github.com/Microsoft/CNTK/tree/release/latest/Tests/EndToEndTests/Speech/HTKDeserializers/LSTM/FullUtterance
- https://github.com/Microsoft/CNTK/tree/release/latest/Tests/EndToEndTests/Image/AlexNet
- https://github.com/Microsoft/CNTK/tree/release/latest/Tests/UnitTests/ReaderTests/Config/ImageAndTextReaderSimple_Config.cntk
- https://github.com/Microsoft/CNTK/tree/release/latest/Tests/UnitTests/ReaderTests/Config/CNTKTextFormatReader/dense.cntk