見出し画像

Simple Transformers 入門 (9) - マルチモーダル分類

Simple Transformers」で「マルチモーダル分類」を行う方法をまとめました。

1. マルチモーダル分類

「マルチモーダル分類」は、テキストデータと画像データを融合します。これは、「Supervised Multimodal Bitransformers for Classifying Images and Text」で紹介されています。

サポートモデルは、次のとおりです。

・BERT

2. データ形式

使用できる入力形式はいくつかあります。 入力形式は、MM-IMDb形式に触発されています。複雑なデータセットを処理する際の利便性と柔軟性のために、データ前処理のいくつかのオプションが追加されていることに注意してください。

◎ ディレクトリベース
データの各サブセット(例:trainとtest)は、独自のディレクトリにある必要があります。ディレクトリへのパスは、train_model()またはeval_model()のいずれかに直接指定できます。

各データサンプルには、テキスト部分とそれに関連付けられた画像(および学習および評価データ用のラベル)が必要です。各サンプルのテキストは、個別のJSONファイルに含める必要があります。JSONファイルには、テキスト自体に加えて他のフィールドが含まれている場合がありますが、それらは無視されます。各サンプルに関連付けられている画像は同じディレクトリにあり、テキストと画像の両方がファイル拡張子(例:000001.jsonと000001.jpg)を除いて同じ識別子を持っている必要があります。

◎ ディレクトリとファイルのリスト
全てのデータ(学習データとテストデータの両方を含む)は同じディレクトリにある必要があります。このディレクトリへのパスは、train_model()とeval_model()の両方に指定する必要があります。2番目の引数files_listは、ディレクトリから取得するファイルを指定します。files_listは、Pythonリスト、またはファイルのリストを含むJSONファイルへのパスにすることができます。

各データサンプルには、テキスト部分とそれに関連付けられた画像(および学習および評価データ用のラベル)が必要です。各サンプルのテキストは、個別のJSONファイルに含める必要があります。JSONファイルには、テキスト自体に加えて他のフィールドが含まれている場合がありますが、それらは無視されます。各サンプルに関連付けられている画像は同じディレクトリにあり、テキストと画像の両方がファイル拡張子(例:000001.jsonと000001.jpg)を除いて同じ識別子を持っている必要があります。

◎ PandasDataFrame
PandasDataFrameでデータを指定することもできます。この形式を使用する場合は、image_path引数を指定する必要があり、画像を含むディレクトリへのパスの文字列である必要があります。以下に詳述するように、DataFrameには少なくとも3つの列が含まれている必要があります。

・text : (str) - ンプルに関連付けられたテキスト。
・images : (str) - image_pathディレクトリからの画像ファイルへの相対パス。
・labels : (str) - サンプルに関連付けられたラベル(またはマルチラベルタスクのラベルのリスト)。

3. JSONファイルの列名・行名にカスタム名を使用

デフォルトでは、Simple Transformersは列名・行名のテキスト、画像、およびラベルを検索します。ただし、これらの名前の代わりに使用する独自の名前を定義できます。この動作は、args辞書の3つの属性text_label、labels_label、およびimages_labelを使用して制御されます。

モデルの作成時に、args辞書の対応する属性にカスタム名を割り当てることにより、カスタム名を設定できます。

引数text_label、labels_label、およびimages_labelに名前を渡すことにより、学習時や評価時に(predict()ではなく)これらの値を変更することもできます。メソッド呼び出しが終了した後も、変更が持続することに注意してください。つまり、モデル自体のargs辞書が変更されます。

4. 画像ファイルとテキストファイルのファイル種別拡張子を指定

デフォルトでは、Simple Transformersは、すべてのパスにファイル種別拡張子(例:.jsonまたは.jpg)も含まれると想定します。または、args辞書のimage_type_extension属性とdata_type_extension属性(それぞれ画像ファイル拡張子とテキストファイル拡張子)を使用して拡張子を指定することもできます。

これは、モデルを作成するとき、またはtrain_model()またはeval_model()を実行するときにも実行できます。これらのメソッドを使用すると、変更はargs辞書に保持されます。

image_type_extensionは、predict()を使用するときに指定できますが、変更は保持されません。

5. ラベル形式

マルチモーダル分類では、ラベルは常に文字列として与えられます。モデルの作成時にlistをlabel_list引数に渡すことにより、ラベルのリストを指定できます。label_listが指定されている場合、num_labelsは必要ありません。

label_listが指定されていない場合は、num_labelsが必要であり、ラベルは「0」から「<num_labels>」までの文字列である必要があります。

6. モデルの作成

MultiModalClassificationModelを作成します。

model = MultiModalClassificationModel("bert", "bert-base-uncased")

利用可能な引数は、次のとおりです。

・model_type : モデル種別(bert、xlnet、xlm、roberta、distilbert、albert)。
・model_name : モデル名。
・multi_label : (optional) - マルチラベルタスクの場合はTrue。
・label_list : (optional) - データセット内のすべてのラベル(str)のリスト。
・num_labels : (optional) - データセット内のラベルまたはクラス数。
・pos_weight : (optional) - 損失計算のために各ラベルに割り当てる重みを含むnum_labelsの長さのリスト。
・args :(optional) - パラメータ引数。
・use_cuda : (optional) - Trueの場合はGPUを使用。
・cuda_device : (optional) - 使用するGPU。
・**kwargs : (optional) - オプション引数。

7. モデルの学習

train_model()を使用して学習します。 auto_weights機能を使用して、不均衡なデータセットのバランスをとることができます。

利用可能な引数は、次のとおりです。

・data : テキストファイル(JSON)と画像ファイルまたはPandasDataFrameを含むデータディレクトリへのパス。
 DataFrameを指定する場合は、列[text, labels, images]を含める必要がある。
・files_list : (optional) list or str - 指定した場合、このリストで指定されたファイルのみがデータディレクトリから取得される。
・image_path : (optional) - DataFrameを入力として使用する場合は指定する必要がある。画像を含むディレクトリへのパス。
・text_label : (optional) - デフォルトのtextの代わりに検索する列名。
・labels_label : (optional) - デフォルトのlabelsの代わりに検索する列名。
・images_label : (optional) - デフォルトのimagesの代わりに検索する列名。
・image_type_extension : (optional) - 指定するとimagesの各値の末尾に追加される。
・data_type_extension : (optional) - 指定するとfiles_listの各値の末尾に追加される。
・auto_weights : (optional) - Trueの場合、重みはクラスのバランスを取るために使用される。
・output_dir : モデルファイルを保存するディレクトリ。指定しない場合、self.args ['output_dir']が使用される。
・show_running_loss : (optional) - Falseで、ランニングロスがコンソールに出力されないようにする。
・args : (optional) - 引数パラメータ。
・eval_data : (optional) - evaluate_during_trainingが有効になっている場合に評価が実行されるDataFrame。Evaluation_during_trainingが有効になっている場合に必要。
・**kwargs : 追加のメトリック。

8. モデルの評価

eval_model()を使用して評価します。モデルディレクトリへのパスをmodel_nameとして指定することにより、保存されたモデルをロードできます。保存されたモデルをロードするときは、元のモデルを作成するときと同じ引数を指定する必要があることに注意してください。

model = MultiModalClassificationModel("bert", "outputs")
results, _ = model.eval_model("data/dataset/", "data/dev.json")

利用可能な引数は、次のとおりです。

・data : テキストファイル(JSON)と画像ファイルまたはPandasDataFrameを含むデータディレクトリへのパス。
DataFrameを指定する場合は、列[text, labels, images]を含める必要がある。
・files_list : (optional) - 指定した場合、このリストで指定されたファイルのみがデータディレクトリから取得される。
・image_path : (optional) - DataFrameを入力として使用する場合は指定する必要がある。画像を含むディレクトリへのパス。
・text_label : (optional) - デフォルトのtextの代わりに検索する列名。
・labels_label : (optional) - デフォルトのlabelsの代わりに検索する列名。
・images_label : (optional) - デフォルトのimagesの代わりに検索する列名。
・image_type_extension : (optional) - 指定すると、imagesの各値の末尾に追加される。
・data_type_extension : (optional) - 指定すると、files_listの各値の末尾に追加される。
・output_dir : モデルファイルを保存するディレクトリ。指定しない場合、self.args['output_dir']が使用される。
・verbose :verboseの場合、評価が完了すると結果がコンソールに出力される。
・silent : サイレントの場合、tqdmプログレスバーは非表示になる。
・**kwargs : 追加のメトリック。

9. モデルの予測

予測を行うには、predict()を使用します。モデルディレクトリへのパスをmodel_nameとして指定することにより、保存されたモデルをロードできます。保存されたモデルをロードするときは、元のモデルを作成するときと同じ引数を指定する必要があることに注意してください。

model = MultiModalClassificationModel("bert", "outputs")
model.predict(
    {
        "text": [
            "A lawyer is forced to defend a guilty judge, while defending other innocent clients, and trying to find punishment for the guilty and provide justice for the innocent."
        ],
        "labels": ["Crime"],
        "images": ["0078718"]
    },
    image_path="data/dataset",
    image_type_extension=".jpeg"
)


この記事が気に入ったらサポートをしてみませんか?