fastai 2.5 : クイックスタート

fastai 2.5 : クイックスタート (翻訳/解説)

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

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

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

 

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

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

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

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

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

 

 

fastai 2.5 : クイックスタート

from fastai.vision.all import *
from fastai.text.all import *
from fastai.collab import *
from fastai.tabular.all import *

fastai のアプリケーションは総て同じ基本的なステップとコードを使用します :

  • 適切な DataLoader を作成する。
  • Learner を作成する。
  • fit メソッドを呼び出す。
  • 予測を作成して結果を見る。

このクイックスタートでは、広範囲な様々なアプリケーションとデータセットでこれらのステップを示します。貴方が見るように、各ケースのコードは、非常に異なるモデルとデータが使用されるにもかかわらず、極めて類似しています。

 

コンピュータビジョン分類

下のコードは以下のことを行ないます :

  1. 異なる 37 種から猫と犬の 7,349 画像を含む Oxford-IIIT Pet データセット と呼ばれるデータセットは fast.ai データセット・コレクションから使用している GPU サーバにダウンロードされてから抽出されます。

  2. コンペティション優勝モデルを使用した、130 万枚の画像で既に訓練された訓練済みのモデルがインターネットからダウンロードされます。

  3. 犬と猫を認識するために特にカスタマイズされたモデルを作成するために、事前訓練済みモデルが転移学習における最新の進歩を使用して再調整されます。

最初の 2 ステップは一度実行される必要があるだけです。それを再度実行する場合、データセットとモデルを再度ダウンロードするのではなく既にダウンロードされたそれらを使用します。

path = untar_data(URLs.PETS)/'images'

def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(224))

learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)
epoch	train_loss	valid_loss	error_rate	time
0	0.173790	0.018827	0.005413	00:12
epoch	train_loss	valid_loss	error_rate	time
0	0.064295	0.013404	0.005413	00:14

predict メソッドを使用してモデルで推論を行なうことができます :

img = PILImage.create('images/cat.jpg')
img

is_cat,_,probs = learn.predict(img)
print(f"Is this a cat?: {is_cat}.")
print(f"Probability it's a cat: {probs[1].item():.6f}")
Is this a cat?: True.
Probability it's a cat: 0.999722

 

コンピュータビジョンのセグメンテーション

ここでは、Camvid データセット のサブセットを使用して、fastai でセグメンテーションモデルをどのように訓練できるかを説明します。

path = untar_data(URLs.CAMVID_TINY)
dls = SegmentationDataLoaders.from_label_func(
    path, bs=8, fnames = get_image_files(path/"images"),
    label_func = lambda o: path/'labels'/f'{o.stem}_P{o.suffix}',
    codes = np.loadtxt(path/'codes.txt', dtype=str)
)

learn = unet_learner(dls, resnet34)
learn.fine_tune(8)
epoch	train_loss	valid_loss	time
0	2.882460	2.096923	00:03
epoch	train_loss	valid_loss	time
0	1.602270	1.543582	00:02
1	1.417732	1.225782	00:02
2	1.307454	1.071090	00:02
3	1.170338	0.884501	00:02
4	1.047036	0.799820	00:02
5	0.947965	0.754801	00:02
6	0.868178	0.728161	00:02
7	0.804939	0.720942	00:02

モデルに画像の各ピクセルを色分けするように要求することにより、それがタスクをどのくらい上手く達成したかを可視化できます。

learn.show_results(max_n=6, figsize=(7,8))

あるいは、SegmentationInterpretation クラスを使用して検証損失に最も寄与した k インスタンスをプロットすることができます。

interp = SegmentationInterpretation.from_learner(learn)
interp.plot_top_losses(k=2)

 

自然言語処理

ここに、5 年前に世界に存在したどれよりも上手く、映画レビューのセンチメントを分類できるモデルを訓練するために必要なコードの総てがあります。

dls = TextDataLoaders.from_folder(untar_data(URLs.IMDB), valid='test')
learn = text_classifier_learner(dls, AWD_LSTM, drop_mult=0.5, metrics=accuracy)
learn.fine_tune(2, 1e-2)
epoch	train_loss	valid_loss	accuracy	time
0	0.594912	0.407416	0.823640	01:35
epoch	train_loss	valid_loss	accuracy	time
0	0.268259	0.316242	0.876000	03:03
1	0.184861	0.246242	0.898080	03:10
2	0.136392	0.220086	0.918200	03:16
3	0.106423	0.191092	0.931360	03:15

コンピュータビジョンと同様に、予測は predict で成されます :

learn.predict("I really liked that movie!")
('pos', tensor(1), tensor([0.0041, 0.9959]))

 

表形式 (= Tabular)

普通の表形式データからモデルを構築することは前のモデルと同じ基本的なステップを使用して成されます。ここに、社会経済的な背景に基づいて、ある人が高所得者であるか否かを予測するモデルを訓練するために必要なコードがあります :

path = untar_data(URLs.ADULT_SAMPLE)

dls = TabularDataLoaders.from_csv(path/'adult.csv', path=path, y_names="salary",
    cat_names = ['workclass', 'education', 'marital-status', 'occupation',
                 'relationship', 'race'],
    cont_names = ['age', 'fnlwgt', 'education-num'],
    procs = [Categorify, FillMissing, Normalize])

learn = tabular_learner(dls, metrics=accuracy)
learn.fit_one_cycle(2)
epoch	train_loss	valid_loss	accuracy	time
0	0.372298	0.359698	0.829392	00:06
1	0.357530	0.349440	0.837377	00:06

 

レコメンデーション・システム

レコメンデーション・システムは、特に e コマースで非常に重要です。Amazon や Netflix のような企業はユーザが好むかもしれない製品や映画をハードに勧めています。ここに、MovieLens データセット を使用して、過去の視聴習慣に基づいて人々が好むかもしれない映画を予測するモデルを訓練する方法があります :

path = untar_data(URLs.ML_SAMPLE)
dls = CollabDataLoaders.from_csv(path/'ratings.csv')
learn = collab_learner(dls, y_range=(0.5,5.5))
learn.fine_tune(6)
epoch	train_loss	valid_loss	time
0	1.497551	1.435720	00:00

epoch	train_loss	valid_loss	time
0	1.332337	1.351769	00:00
1	1.180177	1.046801	00:00
2	0.913091	0.799319	00:00
3	0.749806	0.731218	00:00
4	0.686577	0.715372	00:00
5	0.665683	0.713309	00:00

ユーザと映画 ID, 実際のレーティング, そして予測の幾つかのサンプルを見るために前に見たものと同じ show_results 呼び出しを利用できます :

learn.show_results()
	userId	movieId	rating	rating_pred
0	5.0	3.0	2.0	3.985477
1	1.0	62.0	4.0	3.629225
2	91.0	81.0	1.0	3.476280
3	48.0	26.0	2.0	4.043919
4	75.0	54.0	3.0	4.023057
5	42.0	22.0	3.0	3.509050
6	40.0	59.0	4.0	3.686552
7	63.0	77.0	3.0	2.862713
8	32.0	61.0	4.0	4.356578
 

以上