ホーム » HuggingFace Transformers » HuggingFace Transformers 4.17 : Tutorials : 前処理

HuggingFace Transformers 4.17 : Tutorials : 前処理

HuggingFace Transformers 4.17 : Tutorials : 前処理 (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/12/2022 (v4.17.0)

* 本ページは、HuggingFace Transformers の以下のドキュメントを翻訳した上で適宜、補足説明したものです:

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

クラスキャット 人工知能 研究開発支援サービス

クラスキャット は人工知能・テレワークに関する各種サービスを提供しています。お気軽にご相談ください :

◆ 人工知能とビジネスをテーマに WEB セミナーを定期的に開催しています。スケジュール
  • お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。

お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。

  • 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
  • sales-info@classcat.com  ;  Web: www.classcat.com  ;   ClassCatJP

 

 

HuggingFace Transformers : Tutorials : 前処理

貴方のデータをモデルで利用できる前に、データはモデルに対して受け取り可能な形式に処理される必要があります。モデルは生のテキスト, 画像や音声は理解できません。これらの入力は数値に変換されてテンソルに構築される必要があります。このチュートリアルでは、以下を行ないます :

  • トークナイザーでテキストデータを前処理する。
  • 特徴抽出器で画像や音声データを前処理する。
  • プロセッサでマルチモーダル・タスクのためのデータを前処理する。

 

NLP

テキストデータを処理する主要ツールは トークナイザー です。トークナイザーはルールのセットに従ってテキストをトークンに分割することから始めます。トークンは数値に変換されます、これはモデルへの入力としてテンソルを構築するために使用されます。モデルにより必要とされる任意の追加の入力もまたトークナイザーにより追加されます。

Note: 事前訓練モデルを使用する計画があれば、関連する事前訓練済みトークナイザーを使用することは重要です。これは、テキストが事前訓練済みコーパスと同じ方法で分割されて、訓練の間に同じ対応するトークン-to-インデックス (通常は語彙として参照) を使用することを保証します。

AutoTokenizer クラスで事前訓練済みトークナイザーをロードすることから素早く始めます。これはモデルが事前訓練されたときに使用された語彙をダウンロードします。

 

トークン化

AutoTokenizer.from_pretrained() で事前訓練済みトークナイザーをロードします :

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")

そしてセンテンスをトークナイザーに渡します :

encoded_input = tokenizer("Do not meddle in the affairs of wizards, for they are subtle and quick to anger.")
print(encoded_input)
{'input_ids': [101, 2079, 2025, 19960, 10362, 1999, 1996, 3821, 1997, 16657, 1010, 2005, 2027, 2024, 11259, 1998, 4248, 2000, 4963, 1012, 102], 
 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}

トークナイザーは 3 つの重要な項目を持つ辞書を返します :

  • input_ids はセンテンスの各トークンに対応するインデックスです。

  • attention_mask はトークンが注意されるべきか否かを示します。

  • token_type_ids は複数のシークエンスがあるとき、トークンがどのシークエンスに属すかを示します。

元の入力を返すために input_ids をデコードできます :

tokenizer.decode(encoded_input["input_ids"])
'[CLS] Do not meddle in the affairs of wizards, for they are subtle and quick to anger. [SEP]'

見れるように、トークナイザーはセンテンスに 2 つの特殊トークン – CLS と SEP (classifier と separator) – を追加しました。総てのモデルが特殊トークンを必要とはしませんが、必要な場合には、トークナイザーはそれらを自動的に追加します。

処理したい幾つかのセンテンスがある場合には、(複数の) センテンスをリストとしてトークナイザーに渡します :

batch_sentences = [
    "But what about second breakfast?",
    "Don't think he knows about second breakfast, Pip.",
    "What about elevensies?",
]
encoded_inputs = tokenizer(batch_sentences)
print(encoded_inputs)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102], 
               [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102], 
               [101, 1327, 1164, 5450, 23434, 136, 102]], 
 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0]], 
 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1], 
                    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
                    [1, 1, 1, 1, 1, 1, 1]]}

 

パッド

これは重要なトピックを提示します。センテンスのバッチを処理するとき、それらは常に同じ長さとは限りません。これは問題です、何故ならばテンソル、モデルへの入力、は均一の shape を持つことを必要とするからです。パディングは、少ないトークンを持つセンテンスに特殊なパディング・トークンを追加することによりテンソルが矩形であることを保証するストラテジーです。

最長のシークエンスに一致するようにバッチの短いシークエンスをパッドするためには padding パラメータを True に設定します :

batch_sentences = [
    "But what about second breakfast?",
    "Don't think he knows about second breakfast, Pip.",
    "What about elevensies?",
]
encoded_input = tokenizer(batch_sentences, padding=True)
print(encoded_input)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0], 
               [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102], 
               [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]], 
 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 
 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], 
                    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
                    [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}

トークナイザーは最初と 3 番目のセンテンスをパッドしたことに気付いてください、それらは短いからです!

 

Truncation

対極的に、シークエンスがモデルが処理するには長すぎる場合も時々あるかもしれません。この場合、シークエンスを短い長さに切り詰める必要があります。

シークエンスをモデルが受け取れる最大長に切り詰めるには truncation パラメータを True に設定します :

batch_sentences = [
    "But what about second breakfast?",
    "Don't think he knows about second breakfast, Pip.",
    "What about elevensies?",
]
encoded_input = tokenizer(batch_sentences, padding=True, truncation=True)
print(encoded_input)
{'input_ids': [[101, 1252, 1184, 1164, 1248, 6462, 136, 102, 0, 0, 0, 0, 0, 0, 0], 
               [101, 1790, 112, 189, 1341, 1119, 3520, 1164, 1248, 6462, 117, 21902, 1643, 119, 102], 
               [101, 1327, 1164, 5450, 23434, 136, 102, 0, 0, 0, 0, 0, 0, 0, 0]], 
 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 
 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0], 
                    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], 
                    [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]]}

 

テンソルの構築

最後に、トークナイザーにモデルに供給される実際のテンソルを返すことを望みます。

return_tensors に PyTorch のために pt、あるいは TensorFlow のために tf を設定します :

PyTorch
batch_sentences = [
    "But what about second breakfast?",
    "Don't think he knows about second breakfast, Pip.",
    "What about elevensies?",
]
encoded_input = tokenizer(batch, padding=True, truncation=True, return_tensors="pt")
print(encoded_input)
{'input_ids': tensor([[  101,   153,  7719, 21490,  1122,  1114,  9582,  1623,   102],
                      [  101,  5226,  1122,  9649,  1199,  2610,  1236,   102,     0]]), 
 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0, 0, 0, 0, 0]]), 
 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1],
                           [1, 1, 1, 1, 1, 1, 1, 1, 0]])}
TensorFlow
batch_sentences = [
    "But what about second breakfast?",
    "Don't think he knows about second breakfast, Pip.",
    "What about elevensies?",
]
encoded_input = tokenizer(batch, padding=True, truncation=True, return_tensors="tf")
print(encoded_input)
{'input_ids': , 
 'token_type_ids': , 
 'attention_mask': }

 

音声

音声入力はテキスト入力とは異なって前処理されますが、最終目標は同じままです : モデルが理解できる数値シークエンスを作成することです。特徴抽出器 は生の画像や音声データから特徴を抽出してそれらをテンソルに変換するという明確な目的のために設計されています。始める前に、実験するために以下で音声データセットをロードするために Datasets をインストールしてください :

pip install datasets

SUPERB ベンチマークからキーワードスポッティング・タスクをロードします (データセットをロードする方法の詳細は データセット・チュートリアル 参照) :

from datasets import load_dataset, Audio

dataset = load_dataset("superb", "ks")

入力を見るために音声カラムの最初の要素にアクセスします。音声カラムを呼び出すと音声ファイルを自動的にロードしてリサンプリングします :

dataset["train"][0]["audio"]
{'array': array([ 0.        ,  0.        ,  0.        , ..., -0.00592041,
        -0.00405884, -0.00253296], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/05734a36d88019a09725c20cc024e1c4e7982e37d7d55c0c1ca1742ea1cdd47f/_background_noise_/doing_the_dishes.wav',
 'sampling_rate': 16000}

これは 3 つの項目を返します :

  • array は 1D 配列としてロードされて – そして潜在的にリサンプリングされた – 発話信号です。

  • path は音声ファイルの位置をポイントします。

  • sampling_rate は発話信号の幾つのデータポイントが毎秒測定されたかを示します。

 

リサンプリング

このチュートリアルについては、Wav2Vec2 モデルを使用します。モデルカードから分かるように、Wav2Vec2 は 16kHz でサンプリングされた発話音声で事前訓練されました。貴方の音声データのサンプリングレートがモデルを事前訓練するために使用されたデータセットのサンプリングレートに一致していることは重要です。もしデータのサンプリングレートが同じでないなら、音声データをリサンプリングする必要があります。

例えば、LJ Speech データセットをロードします、これは 22050Hz のサンプリングレートを持ちます。このデータセットで Wav2Vec2 モデルを使用するためには、サンプリングレートを 16kHz にダウンサンプリングします :

lj_speech = load_dataset("lj_speech", split="train")
lj_speech[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
         7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
 'sampling_rate': 22050}

 

  1. サンプリングレートを 16kHz にダウンサンプリングするために データセットの cast_column を使用します :
    lj_speech = lj_speech.cast_column("audio", Audio(sampling_rate=16_000))
    

  2. 音声ファイルをロードします :
    lj_speech[0]["audio"]
    
    {'array': array([-0.00064146, -0.00074657, -0.00068768, ...,  0.00068341,
             0.00014045,  0.        ], dtype=float32),
     'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
     'sampling_rate': 16000}
    

見て分かるように、sampling_rate は 16kHz にダウンサンプリングされました。リサンプリングがどのように動作するかを知ったので、SUPERB データセットによる前の例に戻りましょう!

 

特徴抽出器

次のステップは入力を正規化してパッドするために特徴抽出器をロードします。テキストデータをパッドするとき、短いシークエンスに 0 が追加されます。同じアイデアを音声データにも適用して、音声特徴抽出器は配列に 0 – 無音 (= silence) として解釈されます – を追加します。

AutoFeatureExtractor.from_pretrained() で特徴抽出器をロードします :

from transformers import AutoFeatureExtractor

feature_extractor = AutoFeatureExtractor.from_pretrained("facebook/wav2vec2-base")

音声配列を特徴抽出器に渡します。発生するかもしれない寡黙なエラーをより良くデバッグするために特徴抽出器に sampling_rate 引数を追加することも勧めます :

audio_input = [dataset["train"][0]["audio"]["array"]]
feature_extractor(audio_input, sampling_rate=16000)
{'input_values': [array([ 0.00045439,  0.00045439,  0.00045439, ..., -0.1578519 , -0.10807519, -0.06727459], dtype=float32)]}

 

パディングと truncate

トークナイザーのように、バッチの可変なシークエンスを処理するためにパディングと切り詰め (= truncattion) を適用できます。これら 2 つの音声サンプルのシークエンス長を見てみましょう :

dataset["train"][0]["audio"]["array"].shape
(1522930,)
dataset["train"][1]["audio"]["array"].shape
(988891,)

見て分かるように、最初のサンプルは 2 番目のサンプルよりも長いシークエンスを持ちます。データセットを前処理する関数を作成しましょう。最大サンプル長を指定すると、特徴抽出器はそれに一致するようにシークエンスをパッドするか切り詰めます :

def preprocess_function(examples):
    audio_arrays = [x["array"] for x in examples["audio"]]
    inputs = feature_extractor(
        audio_arrays,
        sampling_rate=16000,
        padding=True,
        max_length=1000000,
        truncation=True,
    )
    return inputs

データセットの最初の幾つかのサンプルに関数を適用します :

processed_dataset = preprocess_function(dataset["train"][:5])

そして処理されたサンプル長をもう一度見てみましょう :

processed_dataset["input_values"][0].shape
(1000000,)
processed_dataset["input_values"][1].shape
(1000000,)

最初の 2 つのサンプルの長さは今では指定した最大長に一致しています。

 

ビジョン

特徴抽出器はまたビジョンタスクのために画像を処理するためにも使用されます。再度、ゴールは raw 画像を入力としてテンソルのバッチに変換することです。

このチュートリアルのために food101 データセットをロードしましょう。データセットは非常に大きいので、訓練分割から小さいサンプルだけをロードするために データセットの split パラメータを使用します :

from datasets import load_dataset

dataset = load_dataset("food101", split="train[:100]")

次に、 データセットの Image 特徴で画像を見てみましょう :

dataset[0]["image"]

 

特徴抽出器

AutoFeatureExtractor.from_pretrained() で特徴抽出器をロードします :

from transformers import AutoFeatureExtractor

feature_extractor = AutoFeatureExtractor.from_pretrained("google/vit-base-patch16-224")

 

データ増強

ビジョンタスクについては、前処理も一部として画像にある種のデータ増強を追加することは一般的です。好みのライブラリで増強を追加できますが、このチュートリアルでは、torchvision の transforms モジュールを使用します。

  1. 画像を正規化して幾つかの transforms – RandomResizedCropColorJitter – をまとめて連鎖するために Compose を使用します :
    from torchvision.transforms import Compose, Normalize, RandomResizedCrop, ColorJitter, ToTensor
    
    normalize = Normalize(mean=feature_extractor.image_mean, std=feature_extractor.image_std)
    _transforms = Compose(
        [RandomResizedCrop(feature_extractor.size), ColorJitter(brightness=0.5, hue=0.5), ToTensor(), normalize]
    )
    

  2. モデルはその入力として pixel_values を受け取ります。値は特徴抽出器により生成されます。transforms から pixel_values を生成する関数を作成します :
    def transforms(examples):
        examples["pixel_values"] = [_transforms(image.convert("RGB")) for image in examples["image"]]
        return examples
    

  3. それから transforms を on-the-fly に適用するために データセットの set_transform を使用します :
    dataset.set_transform(transforms)
    

  4. そして画像にアクセスするとき、特徴抽出器がモデル入力に pixel_values を追加したことに気付くでしょう :
    dataset[0]["image"]
    
    {'image': ,
     'label': 6,
     'pixel_values': tensor([[[ 0.0353,  0.0745,  0.1216,  ..., -0.9922, -0.9922, -0.9922],
              [-0.0196,  0.0667,  0.1294,  ..., -0.9765, -0.9843, -0.9922],
              [ 0.0196,  0.0824,  0.1137,  ..., -0.9765, -0.9686, -0.8667],
              ...,
              [ 0.0275,  0.0745,  0.0510,  ..., -0.1137, -0.1216, -0.0824],
              [ 0.0667,  0.0824,  0.0667,  ..., -0.0588, -0.0745, -0.0980],
              [ 0.0353,  0.0353,  0.0431,  ..., -0.0039, -0.0039, -0.0588]],
     
             [[ 0.2078,  0.2471,  0.2863,  ..., -0.9451, -0.9373, -0.9451],
              [ 0.1608,  0.2471,  0.3098,  ..., -0.9373, -0.9451, -0.9373],
              [ 0.2078,  0.2706,  0.3020,  ..., -0.9608, -0.9373, -0.8275],
              ...,
              [-0.0353,  0.0118, -0.0039,  ..., -0.2392, -0.2471, -0.2078],
              [ 0.0196,  0.0353,  0.0196,  ..., -0.1843, -0.2000, -0.2235],
              [-0.0118, -0.0039, -0.0039,  ..., -0.0980, -0.0980, -0.1529]],
     
             [[ 0.3961,  0.4431,  0.4980,  ..., -0.9216, -0.9137, -0.9216],
              [ 0.3569,  0.4510,  0.5216,  ..., -0.9059, -0.9137, -0.9137],
              [ 0.4118,  0.4745,  0.5216,  ..., -0.9137, -0.8902, -0.7804],
              ...,
              [-0.2314, -0.1922, -0.2078,  ..., -0.4196, -0.4275, -0.3882],
              [-0.1843, -0.1686, -0.2000,  ..., -0.3647, -0.3804, -0.4039],
              [-0.1922, -0.1922, -0.1922,  ..., -0.2941, -0.2863, -0.3412]]])}
    

ここに画像が前処理した後どのように見えるかがあります。適用された transforms からちょうど想定されるように、画像はランダムにクロップされてそのカラー特性は異なっています。

import numpy as np
import matplotlib.pyplot as plt

img = dataset[0]["pixel_values"]
plt.imshow(img.permute(1, 2, 0))

 

マルチモーダル

マルチモーダル・タスクについては、ここまでに学習した総てを組合せて、自動発話認識タスク (ASR, automatic speech recognition) にスキルを適用していきます。これは以下を必要とすることを意味します :

  • 音声データを前処理する特徴抽出器。
  • テキストを処理するトークナイザー

LJ Speech データセットに戻りましょう :

from datasets import load_dataset

lj_speech = load_dataset("lj_speech", split="train")
lj_speech[0]
 {'audio': {'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
           7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
   'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
   'sampling_rate': 22050},
  'file': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
  'id': 'LJ001-0001',
  'normalized_text': 'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition',
  'text': 'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'}

主として audio と text カラムに関心がありますので、他のカラムは削除します :

lj_speech = lj_speech.map(remove_columns=["file", "id", "normalized_text"])
lj_speech[0]
{'audio': {'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
          7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
  'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
  'sampling_rate': 22050},
 'text': 'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'}

そして audio と text カラムを見ましょう :

lj_speech[0]["audio"]
{'array': array([-7.3242188e-04, -7.6293945e-04, -6.4086914e-04, ...,
         7.3242188e-04,  2.1362305e-04,  6.1035156e-05], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
 'sampling_rate': 22050}
lj_speech[0]["text"]
'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'

音声データ処理の前のセクションを思い出してください、モデルを事前訓練するために使用されたデータセットのサンプリングレートに一致するように音声データのサンプリングレートで常にリサンプリングするべきです :

lj_speech = lj_speech.cast_column("audio", Audio(sampling_rate=16_000))
lj_speech[0]['audio']
{'array': array([-0.00064146, -0.00074657, -0.00068768, ...,  0.00068341,
         0.00014045,  0.        ], dtype=float32),
 'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
 'sampling_rate': 16000}

 

プロセッサ

プロセッサは特徴抽出器とトークナイザーを組合せています。AutoProcessor.from_pretrained でプロセッサをロードします :

from transformers import AutoProcessor

processor = AutoProcessor.from_pretrained("facebook/wav2vec2-base-960h")
  1. 音声データを input_values に処理して、テキストを labels にトークン化する関数を作成します。これらはモデルへの入力です :
    def prepare_dataset(example):
        audio = example["audio"]
    
        example["input_values"] = processor(audio["array"], sampling_rate=16000)
    
        with processor.as_target_processor():
            example["labels"] = processor(example["text"]).input_ids
        return example
    

  2. prepare_dataset をサンプルに適用します :
    prepare_dataset(lj_speech[0])
    
    {'audio': {'array': array([-0.00064146, -0.00074657, -0.00068768, ...,  0.00068341,
              0.00014045,  0.        ], dtype=float32),
      'path': '/root/.cache/huggingface/datasets/downloads/extracted/917ece08c95cf0c4115e45294e3cd0dee724a1165b7fc11798369308a465bd26/LJSpeech-1.1/wavs/LJ001-0001.wav',
      'sampling_rate': 16000},
     'input_values': {'input_values': [array([-6.7253257e-03, -7.8238761e-03, -7.2083874e-03, ...,
             7.1215569e-03,  1.4468388e-03, -2.1073874e-05], dtype=float32)]},
     'labels': [23, 3, 3, 3, 3, 3, 3, ..., 3, 3, 3, 3, 3],
     'text': 'Printing, in the only sense with which we are at present concerned, differs from most if not from all the arts and crafts represented in the Exhibition'}
    

    プロセッサは input_values と labels を追加したことに注意してください。sampling rate もまた 16kHz に正しくダウンサンプリングされています。

Awesome, you should now be able to preprocess data for any modality and even combine different modalities! In the next tutorial, learn how to fine-tune a model on your newly preprocessed data.

 

Everything you always wanted to know about padding and truncation

(訳注: 原文 参照)

 

以上



ClassCat® Chatbot

人工知能開発支援
クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com

カテゴリー