fastai 2.5 : クイックスタート (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 04/06/2022 (v2.5.6)
* 本ページは、fastai の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく 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 メソッドを呼び出す。
- 予測を作成して結果を見る。
このクイックスタートでは、広範囲な様々なアプリケーションとデータセットでこれらのステップを示します。貴方が見るように、各ケースのコードは、非常に異なるモデルとデータが使用されるにもかかわらず、極めて類似しています。
コンピュータビジョン分類
下のコードは以下のことを行ないます :
- 異なる 37 種から猫と犬の 7,349 画像を含む Oxford-IIIT Pet データセット と呼ばれるデータセットは fast.ai データセット・コレクションから使用している GPU サーバにダウンロードされてから抽出されます。
- コンペティション優勝モデルを使用した、130 万枚の画像で既に訓練された訓練済みのモデルがインターネットからダウンロードされます。
- 犬と猫を認識するために特にカスタマイズされたモデルを作成するために、事前訓練済みモデルが転移学習における最新の進歩を使用して再調整されます。
最初の 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
以上