Aracılığıyla paylaş


BrainScript CNTK Metin Biçimi Okuyucusu

Bu sayfa, CNTKTextFormatReader'ı BrainScript açısından belgelemektedir, ancak Python kullanıcıları bu belgeyi okuyarak da öğrenebilir; kavramlar, parametreler ve desenler aynıdır.

CNTKTextFormatReader (daha sonra basitçe CTF Okuyucu) aşağıdaki belirtime göre biçimlendirilmiş giriş metin verilerini kullanacak şekilde tasarlanmıştır. Aşağıdaki ana özellikleri destekler:

  • Dosya başına birden çok giriş akışı (giriş)
  • Hem seyrek hem de yoğun girişler
  • Değişken uzunluk dizileri

CNTK Metin Biçimi (CTF)

Giriş dosyasındaki her satır, bir veya daha fazla giriş için bir örnek içerir. Her satır da bir diziye eklendiğinden (açıkça veya örtük olarak) bir veya daha fazla <dizi, giriş, örnek> ilişki tanımlar. Her giriş satırı aşağıdaki gibi biçimlendirilmelidir:

[Sequence_Id](Sample or Comment)+

konum

Sample=|Input_Name (Value )*

Comment=|# some content

  • Her satır bir sıra kimliğiyle başlar ve bir veya daha fazla örnek içerir (başka bir deyişle, her satır sıralanmamış bir örnek koleksiyonudur).
  • Sıra kimliği bir sayıdır. Atlanabilir, bu durumda satır numarası sıra kimliği olarak kullanılır.
  • Her örnek etkili bir şekilde bir giriş adından ve karşılık gelen değer vektörden oluşan bir anahtar-değer çiftidir (daha yüksek boyutlara eşleme, ağın bir parçası olarak gerçekleştirilir).
  • Her örnek, bir kanal simgesi (|) ve ardından giriş adı (boşluk yok) ve ardından bir boşluk sınırlayıcısı ve ardından bir değer listesi ile başlar.
  • Her değer, seyrek girişler için bir sayı veya dizin ön eki eklenmiş bir sayıdır.
  • Hem sekmeler hem de boşluklar, sınırlayıcı olarak birbirinin yerine kullanılabilir.
  • Açıklama, hemen ardından bir kanal ve ardından bir karma simgesiyle başlar: |#, ardından açıklamanın asıl içeriği (gövdesi). Gövde herhangi bir karakter içerebilir, ancak gövdenin içindeki bir boru simgesinin içine karma simgesi eklenerek kaçış yapılması gerekir (aşağıdaki örne bakın). Açıklamanın gövdesi satırın sonuna veya bir sonraki kaçışsız boruya (hangisi önce gelirse) kadar devam eder.

Basit Örnek

Bu örnek, en az sayıda parametre ve biçim seçeneğini temel alır.

CTF Reader'ı kullanmak için CNTK yapılandırmanızın okuyucu bölümünde olarak ayarlayın 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 ...

(Bu parçanın yanı sıra bu belgedeki diğer NDL örnekleri yalnızca reader CNTK yapılandırmasının geri kalanını göz önünde bulundurun; tam örnek Ağlar ve ilgili veri kümelerinin işaretçileri için bu sayfanın sonuna bakın)

CTF Okuyucu aşağıdaki parametre kümesini gerektirir:

  • file - veri kümesini içeren dosyanın yolu.
  • input- giriş adlarıyla tanımlanan girişleri tanımlayan alt bölüm (ABve C yukarıdaki örnekte). Her girişte aşağıdaki gerekli parametreler belirtilmelidir:
    • format - giriş türünü belirtir. veya olmalıdır densesparse
    • dim - giriş değeri vektörünün boyutunu belirtir ( yoğun giriş için bu, her örnekteki değer sayısına doğrudan karşılık gelir; seyrek olarak, bu, olası dizin değerleri aralığındaki üst sınırı temsil eder).

Yukarıdaki okuyucu yapılandırmasına karşılık gelen giriş verileri şöyle görünmelidir:

|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

Giriş biçimi hakkında aşağıdakilere dikkat edin:

  • |Input_Name her giriş örneğinin başlangıcını tanımlar. Bu öğe zorunludur ve bunu karşılık gelen değer vektöru izler.
  • Yoğun vektör yalnızca kayan nokta değerlerinin listesidir; seyrek vektör, tanımlama grubu listesidir index:value .
  • Hem sekmelere hem de boşluklara hem değer sınırlayıcıları ( giriş vektörleri içinde) hem de giriş sınırlayıcıları (girişler arasında) olarak izin verilir.
  • Her ayrı çizgi 1 uzunluğunda bir "dizi" oluşturur ("Gerçek" değişken uzunluklu diziler aşağıdaki genişletilmiş örnekte açıklanmıştır).
  • Her giriş tanımlayıcısı tek bir satırda yalnızca bir kez görüntülenebilir (bu, satır başına giriş başına bir örne dönüşür).
  • Bir satırdaki giriş örneklerinin sırası ÖNEMLI DEĞİlDİr (kavramsal olarak her satır, anahtar-değer çiftlerinden oluşan sıralanmamış bir koleksiyondur)
  • İyi biçimlendirilmiş her çizgi bir "Satır Beslemesi" \n veya "Satır İadesi, Satır Beslemesi" \r\n simgeleriyle bitmelidir.

Genişletilmiş Örnek

Bu örnek, tüm olası yapılandırma parametrelerini içerir ve çeşitli giriş biçimi seçeneklerini gösterir. Bu örnekte kullanılan yapılandırma parametrelerinin tam açıklaması için lütfen aşağıdaki tablolara bakı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 ...

Bileşik okuyucu ile aşağıdakilerden birini istersiniz:

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"}
            }
        })
    }

Buna karşılık gelen giriş dosyası yaklaşık olarak aşağıdaki gibi görünebilir:

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

Yukarıdaki örnekte açıklanan tüm seçenekler yine de burada geçerlidir. Bunun üzerine iki ek özellik daha kullanıma sunulmuştur:

Giriş adı diğer adları

Giriş adları rastgele uzun olabilir ve bu nedenle bunları giriş dosyası boyunca yinelemek alan açısından verimli olmayabilir. Bunu azaltmak için veri kümesi tam giriş adları yerine "diğer adlar" kullanabilir. Ardından diğer adların her giriş alt bölümünde belirtilmesi gerekir. Örneğimizde veri kümesi, okuyucu yapılandırması bölümünde sırasıyla "Some_very_long_input_name" ve "Some_other_also_very_long_input_name" ile eşlenen ve diğer adlarını abkullanır.

Sıralı Kimlikler

Daha önce de belirtildiği gibi, giriş dosyasındaki her ayrı satır, her giriş için tek bir örnek içeren bir diziyi temsil eder. Ancak, bir satıra negatif olmayan bir sayı ön eki eklenirse, sayı karşılık gelen sıra kimliği olarak kullanılır. Aynı sıra kimliğini paylaşan sonraki tüm satırlar, aynı dizinin bir parçası olmak için birleştirilir. Bu nedenle, N çizgileri için aynı sayısal ön ekin yinelenmesi, her girişin 1 ile N arasında örnek içeren çok örnekli bir dizi oluşturmasına olanak tanır. İkinci ve sonraki satırlardaki sıra ön ekinin atlanması aynı etkiye sahiptir. Bu nedenle, yukarıdaki örnek veri kümesi , , 200333400 ve 500kimliklerine 100sahip beş dizi tanımlar.

okuyucu bölümündeki parametresini olarak trueayarlamakskipSequenceIds, okuyucuyu veri kümesindeki tüm açık dizi kimliklerini yoksaymaya ve ayrı satırları tek tek sıralar olarak elemeye zorlar. Ayrıca, veri kümesindeki ilk satırdaki sıra kimliğinin atlanması aynı etkiye sahiptir; sonraki tüm sıra kimlikleri yoksayılır ve satırlar, bu örnekte olduğu gibi tek tek sıralar olarak kabul edilir:

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

Dizileri kullanırken dikkate alınması gereken son birkaç şey:

  • Sıra kimlikleri benzersiz olmalıdır.
  • Kimlik ön ekleri yalnızca ardışık satırlar için yinelenebilir.
  • Satırlardaki sıra uzunluğu (aynı kimlik ön ekini paylaşan satır sayısı), bu dizideki örneklerdeki (girişteki örneklerin sayısı) maksimum giriş uzunluğunu aşmamalıdır.

Örneğin, aşağıdaki veri kümeleri geçersizdir:

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

Birkaç Real-World Örneği

  • Sınıflandırma: Her satır, bir etiket ve özelliklerden oluşan bir örnek içerir. Her satır 1 uzunluğundaki kendi "dizisi" olduğundan, dizi kimliği gerekmez.
|class 23:1 |features 2 3 4 5 6
|class 13:1 |features 1 2 0 2 3
...
  • DSSM: Her satır, seyrek vektörler olarak kodlanmış bir sözcük paketi aracılığıyla ifade edilen bir kaynak hedef belge çifti içerir.
|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
  • Konuşma parçası etiketleme: Her öğeyi karşılık gelen bir etikete eşleyerek sıralar. Sıralar dikey olarak hizalanır (satır başına bir sözcük + etiket).
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
...
  • Sıra sınıflandırması: Tek bir etikete eşlenen diziler. Sıralar dikey olarak hizalanır; "class" etiketi aynı sequenceId'ye sahip herhangi bir satırda oluşabilir.

Not

Şu anda satır sayısı en uzun sıranın uzunluğunu aşmamalıdır. Bu, etiketin tek başına bir satırda görünemeyeceği anlamına gelir. Bu, gelecekte kaldırılacak bir uygulama ayrıntısıdır.

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
  • Sıralı dizi: Bir kaynak diziyi hedef diziye eşleyin. İki dizi dikey olarak hizalanır ve en kolay durumda, yalnızca başka bir diziden sonra yazdırılır. Bunlar aynı genel "sıra kimliğine" sahip olarak birleştirilir (bu durumda bir "iş birimi kimliği" olur).

Not

Şu anda satır sayısı en uzun sıranın uzunluğunu aşmamalıdır. Bu, dizilerin yatay olarak hizalanması gerektiği anlamına gelir. Bu, gelecekte kaldırılacak bir uygulama ayrıntısıdır.

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
...
  • Sıralamaya Learning: "Sıra" bir sorguyu temsil eder ve her örnek, el ile etiketlenmiş derecelendirmeye sahip bir belgeyi temsil eder. Bu durumda "sıra" yalnızca bir sıralamaya sahip olmayan bir çoklu kümedir (öğrenme-derece kaybı işlevi bağlamında).
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
...

Yapılandırma Parametreleri

Parametre Açıklama
precision Giriş değerlerinin kayan nokta duyarlık değerini (double veya float) belirtir. İsteğe bağlı olarak varsayılan olarak floatayarlanır.

reader Bölüm

Parametre Açıklama
readerType Yüklenmesi desteklenen CNTK okuyuculardan birini belirtir (örn. CNTKTextFormatReader). Gerekli.
file Giriş veri kümesini içeren dosyanın yolu (Windows veya Linux stili). Gerekli.
randomize Girişin rastgeletrue (, false) olup olmayacağını belirtir. İsteğe bağlı olarak varsayılan olarak trueayarlanır.
randomizationSeed İlk rastgele dağıtım çekirdek değeri (giriş verileri yeniden rastgele seçildiğinde her süpürme artırılır). İsteğe bağlı olarak varsayılan olarak 0ayarlanır.
randomizationWindow Rastgele belirleme penceresinin boyutunu (pozitif tamsayı) belirtir (örneğin, rastgele aralığı). Bu parametre, veri kümesinin bir kerede bellekte ne kadarının bulunması gerektiğini etkiler. İsteğe bağlı olarak, değere bağlı sampleBasedRandomizationWindow olarak, varsayılan olarak örneklerdeki veri kümesinin tamamının boyutuna (giriş tüm veri kümesinin tamamında rastgele oluşturulur) veya 4 GB disk alanı değerinde öbek (öbek 128 boyutu 32 MB'a eşit olduğunda) olur. olduğunda bu parametre yoksayılır randomizefalse.
sampleBasedRandomizationWindow ise true, rastgele oluşturma penceresinin boyutu belirli sayıda örnek olarak yorumlanır, aksi takdirde bir dizi öbek olarak yorumlanır. İsteğe bağlı olarak varsayılan olarak falseayarlanır. benzer şekilde randomizationWindow, olduğunda bu parametre yoksayılır randomizefalse.
skipSequenceIds ise trueokuyucu giriş dosyasındaki sıralı kimlikleri yoksayar ve her bir ayrı satırı boyut 1'in bağımsız dizisi olarak yorumlar (dizi kimlikleri bölümündeki bölüme bakın). İsteğe bağlı olarak varsayılan olarak falseayarlanır.
maxErrors Bir özel durumun tetiklenmesi gereken giriş hatalarının sayısı. İsteğe bağlı olarak varsayılan olarak 0ayarlanır. Bu, ilk hatalı biçimlendirilmiş değerin bir özel durum tetiklediği anlamına gelir.
traceLevel Çıkış ayrıntı düzeyi. 0 - yalnızca hataları göster; 1 - hataları ve uyarıları göstermek; 2 - tüm çıkışı göster. İsteğe bağlı olarak varsayılan olarak 1ayarlanır.
chunkSizeInBytes Tek bir okuma işleminde diskten okunacak ardışık bayt sayısı. İsteğe bağlı, varsayılan olarak 33554432 (32 MB).
keepDataInMemory ise true, veri kümesinin tamamı bellekte önbelleğe alınır. İsteğe bağlı olarak varsayılan olarak falseayarlanır.
frameMode true okuyucuya çerçeveler için iyileştirilmiş bir paketleme yöntemi (yalnızca tek bir örnek içeren diziler) kullanması için sinyal gönderir. İsteğe bağlı olarak varsayılan olarak falseayarlanır.
cacheIndex Ön işleme aşamasında oluşturulan meta verilerin diske yazılıp varsa diskten yüklenip yüklenmeyeceğini belirtir (true, false). İsteğe bağlı olarak varsayılan olarak falseayarlanır. Diğer ayrıntılar için aşağıdaki bölüme bakın. CNTK sürüm 2.1'de yeni.
Dizin önbelleğe alma

Not

CNTK sürüm 2.1'de yeni.

Dizin önbelleğe alma, özellikle büyük giriş dosyalarıyla çalışırken başlatma sürelerini önemli ölçüde azaltmaya (2-3 kat kat) olanak tanır. bayrağının cacheIndextrue olarak ayarlanması, okuyucuya önbellek dosyası kullanılamıyorsa veya eskiyse (giriş dosyasından daha eski) dizin oluşturma meta verilerini diske (giriş dosyasıyla aynı dizin) yazması için sinyal gönderir. Yazma en iyi çabadır ve okuyucu performansını etkilememek için ayrı bir iş parçacığında gerçekleştirilir. Önbellek dosyası varsa ve güncelse, okuyucu artık dizini oluşturmak için giriş dosyasının kaymasını kaldırmaz, bunun yerine dizini önbellek dosyasından yükler. Bazı okuyucu yapılandırma parametrelerinin dizin oluşturma üzerinde doğrudan bir etkisi olduğunu unutmayın (örneğin, farklı değerleri frameMode farklı dizi sayısına sahip dizinlere neden olabilir). Bu nedenle, önbellek dosyası, önbelleği oluşturandan farklı bir yapılandırmaya sahip bir okuyucu tarafından yoksayılabilir. Önbelleğe almanın tüm avantajını görmek için yapılandırmanın sonraki yeniden çalıştırmalarda değiştirilmemesi gerekir.

input Alt kısım

input her biri uygun şekilde etiketlenmiş bir yapılandırma alt bölümüyle birlikte bir dizi bağımsız girişi birleştirir. Aşağıda açıklanan tüm parametreler, belirli bir girişle ilişkilendirilmiş bir Giriş adı alt bölümüne özeldir.

Parametre Açıklama
alias Veri kümesindeki girişi tanımlamak için kullanılan alternatif bir kısaltma adı (dize). İsteğe bağlı
format Giriş türünü (dense, sparse) belirtir. Gerekli.
dim Giriş değerinin boyutu (pozitif tamsayı) (örneğin, yoğun giriş için bir örnekteki giriş değerlerinin sayısı, seyrek giriş için dizin aralığındaki üst sınır). Gerekli.
definesMBSize Bu belirli akıştan alınan örneklerde minibatch boyutunun sayılıp sayılmayacağını gösteren bayrak (varsayılan false ) İsteğe bağlı.

tam ağ tanımlarını ve ilgili veri kümesi örneklerini CNTK Deposunda bulabilirsiniz. Burada, CNTKTextFormat okuyucusunu kullanan bir Uçtan Uca test de bulacaksınız.