はじめに
「数分で深層学習モデルを構築するのか? トレーニングに何時間もかかるよ! 十分なマシンもないのに。” 私は、自分のマシンで深層学習モデルを構築することを敬遠する、意欲的なデータ科学者からこれを数え切れないほど聞いてきました。
深層学習データセットで作業するのに、Google や他の大手ハイテク企業で働く必要はありません! Google のサーバーを貸し出す必要はなく、自分のニューラル ネットワークをゼロから数分で構築することは十分に可能です。 Fast.ai の学生は Imagenet データセットで 18 分でモデルを設計しました。この記事では、同様のものを紹介します。 さらに、かなり印象的な精度スコアを達成するために、非常にシンプルな深層学習アーキテクチャを使用します。
この記事で見る Python コードは、画像分類モデル構築のベンチマークとして考慮することができます。 コンセプトをよく理解したら、コードで遊んで、コンペティションに参加して、リーダーボードに登ってください!
深層学習が初めてで、コンピュータービジョンの分野に魅了されている方は (そうでない方はいませんか?)、「深層学習を用いたコンピュータービジョン」コースをチェックしてみてください。 この素晴らしい分野への包括的な入門書であり、近い将来、巨大な雇用市場になることは必至であるため、あなたを準備させます。
画像分類を適用するプロジェクト
E-Commerce における収益全体の 25% 以上が、アパレル & アクセサリーに起因しているのだそうです。 特に、ブランドによって提供されるカテゴリに一貫性がない場合、画像だけからこれらのアパレルを分類することが大きな問題になります。
Fashion MNISTは、非常によく知られた機械学習ハローワールド – MNISTデータセットの代用品で、「数字を識別する」練習問題でチェックアウトすることができます。 数字の代わりに、Tシャツ、ズボン、バッグなど、衣服の種類が表示されます。 この問題で使用されたデータセットは、Zalando Researchによって作成されました。
練習問題
目次
- 画像分類とは何かとその使用例
- 画像データの構造を設定する
- モデル構築のブレークダウン プロセス
- 問題文の設定とデータの理解
- 画像分類モデル構築のステップ
- もう一つの挑戦
画像分類とは何か?
下の画像を考えてみましょう。
あなたはすぐにそれが(しゃれた)車だとわかったでしょう。 一歩下がって、この結論に至った経緯を分析してみましょう。画像を見せられたので、それが属するクラス(この例では、車)を分類したのです。 一言で言えば、これが画像の分類です。
1つの画像を分類できるカテゴリは、潜在的にn個あります。 手作業で画像をチェックし、分類するのは非常に面倒な作業です。 1万枚、10万枚といった膨大な数の画像を前にすると、この作業は不可能に近くなります。 このプロセス全体を自動化し、対応するクラスごとに画像をすばやくラベル付けできたら、どれほど便利でしょうか。
自動運転車は、画像分類が実世界でどのように使用されているかを理解するための素晴らしい例です。 自律走行を可能にするために、道路上の車、人、移動物体など、さまざまな物体を認識する画像分類モデルを構築することができます。 この記事の後半で、さらにいくつかのユースケースを紹介しますが、私たちの周りにはまだまだたくさんのアプリケーションがあります。 記事の下のコメント欄を使って、どのような潜在的な使用例があるかを教えてください!
さて、私たちの主題を理解したところで、画像分類モデルがどのように構築され、その前提条件は何であり、それをどのように Python で実装できるかを掘り下げていきましょう。 2 つのフォルダーが必要で、1 つはトレーニング セット、もう 1 つはテスト セットです。 トレーニングセットには、.csvファイルと画像フォルダがあります。
- .csvファイルにはすべてのトレーニング画像の名前とそれに対応する真のラベル
- 画像フォルダにはすべてのトレーニング画像
テストセット内の0csvファイルとトレーニングセット内の0csvファイルは別物です。 このテストセットの.csvファイルには、すべてのテスト画像の名前が含まれていますが、対応するラベルはありません。 なぜかわかりますか? 我々のモデルはトレーニングセットに存在する画像で学習され、ラベルの予測はテストセットの画像で行われます。
データが上記の形式でない場合、それに応じて変換する必要があります(さもなければ、予測はおかしく、かなり役に立ちません)。 このプロセスは大きく 4 段階に分けることができます。 各段階の実行には一定の時間が必要です。
- Loading and pre-processing Data – 30% time
- Defining Model architecture – 10% time
- Training the model – 50% time
- パフォーマンスの評価 – 10% time
上記の各段階をもう少し詳しく説明していきましょう。 すべてのモデルが一回で構築されるわけではないので、このセクションは非常に重要です。 各反復の後に戻って、ステップを微調整し、再度実行する必要があります。 基礎となる概念をしっかりと理解することは、プロセス全体を加速する上で大きな役割を果たします。 データの読み込みと前処理
Data is gold as far as an deep learning models are concerned.データは、ディープラーニングモデルに関する限り、金です。 トレーニングセットに十分な量の画像があれば、画像分類モデルがうまく機能する可能性ははるかに高くなります。 また、使用するアーキテクチャ/フレームワークによって、データの形状は異なります。
したがって、重要なデータの前処理ステップ (どのプロジェクトにおいても永遠に重要なステップ) があります。 画像データで前処理がどのように機能するかについてもっと理解するために、「Python での画像処理の基礎」に目を通すことを強くお勧めします。 私たちのモデルが未知のデータでどのように動作するかを見るために(そして、テストセットに公開する前に)、私たちは検証セットを作成する必要があります。 これは、学習セット データを分割することで行われます。
要するに、学習データでモデルを学習し、検証データでモデルを検証するのです。 検証セットでのモデルのパフォーマンスに満足したら、それをテストデータでの予測に使用することができます。
Stage 2: モデルのアーキテクチャの定義
これは、深層学習モデル構築プロセスにおけるもう 1 つの重要なステップです。 モデルがどのように見えるかを定義する必要があり、それには次のような質問に答える必要があります:
- 畳み込み層をいくつにするか?
- 各層の活性化関数はどうするか?
- 各層にいくつ隠しユニットを持つか? これらは基本的にモデルのハイパーパラメータであり、予測がどれだけ良くなるかを決定する上で非常に重要な役割を果たします。 素晴らしい質問です。 良いアイデアは、既存の研究/調査に基づいて、これらの値を選択することです。 もう 1 つの方法は、最適な値が見つかるまで値を試し続けることですが、これはかなり時間のかかるプロセスです。
Stage 3: モデルのトレーニング
モデルのトレーニングには、次のものが必要です:
- Training images and their corresponding true labels
- Validation images and their corresponding true labels (we use these labels only to validate the model, not during the training phase)
またこのステップでは、エピック数 (エポックの数) を定義します。 まずは10エポック分モデルを走らせる(エポック数は後で変更可能)。
このステップに要する時間。
そして、予測を行う時間だ!
ステージ 4: モデルのパフォーマンスを見積もる
最後に、テスト データ (画像) をロードし、ここでも前処理ステップを実行する。
このステップに必要な時間: ~ 1 分
Setting the Problem Statement and Understanding the Data
私たちは、画像分類を理解するために本当にクールな課題をピックアップしています。 私たちは、衣服 (シャツ、ズボン、靴、靴下など) に応じて、与えられた画像のセットを分類できるモデルを構築する必要があります。
この課題は「Identify the Apparels」と呼ばれ、私たちの DataHack プラットフォームにある練習問題のうちの 1 つです。 7163>
私たちは合計 70,000 の画像(28 x 28 次元)を持っており、そのうち 60,000 はトレーニング セットから、10,000 はテスト セットからとなっています。 学習用画像は衣服の種類によってあらかじめラベル付けされており、全部で10クラスある。 テスト画像はもちろんラベル付けされていない。
我々はGoogle Colab上でモデルを構築します。Google Colabは我々のモデルを学習するために無料のGPUを提供してくれるからです。 いよいよ実装の段階です。
- Google Colabのセットアップ
- ライブラリのインポート
- データのロードと前処理 – (3分)
- 検証セットの作成モデル構造の定義 – (1分)
- モデルのトレーニング – (5分)
- 予測を行う – (1分)
各ステップを詳しく見ていきましょう。
ステップ1:Google Colabのセットアップ
データをGoogle Driveのリンクからインポートするので、Google Colabノートブックに数行のコードを追加する必要があります。 新しいPython 3ノートブックを作成し、次のコードブロックを記述します:
!pip install PyDrive
これでPyDriveがインストールされます。
import osfrom pydrive.auth import GoogleAuthfrom pydrive.drive import GoogleDrivefrom google.colab import authfrom oauth2client.client import GoogleCredentials
次に、Google Driveにアクセスするためのdrive変数を作成します:
auth.authenticate_user()gauth = GoogleAuth()gauth.credentials = GoogleCredentials.get_application_default()drive = GoogleDrive(gauth)
データセットをダウンロードするために、Google DriveにアップロードしたファイルのIDを使用します:
download = drive.CreateFile({'id': '1BZOv422XJvxFUnGh-0xVeSvgFgqVY45q'})
上記のコードの「id」をあなたのファイルのIDに置き換えてみてください。
download.GetContentFile('train_LbELtWX.zip')!unzip train_LbELtWX.zip
ノートブックを起動するたびに、これらのコードブロックを実行する必要があります。
Step 2 : モデルの構築段階で必要となるライブラリをインポートします。
import kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.utils import to_categoricalfrom keras.preprocessing import imageimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom keras.utils import to_categoricalfrom tqdm import tqdm
ステップ 3: 以前に説明したプリプロセスのステップを思い出します。
train = pd.read_csv('train.csv')
次に、すべての学習画像を読み込み、リストに格納し、最後にそのリストをnumpyの配列に変換します。
# We have grayscale images, so while loading the images we will keep grayscale=True, if you have RGB images, you should set grayscale as Falsetrain_image = for i in tqdm(range(train.shape)): img = image.load_img('train/'+train.astype('str')+'.png', target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 train_image.append(img)X = np.array(train_image)
多クラス分類問題(10クラス)なので、対象変数をワンホットエンコードします。
y=train.valuesy = to_categorical(y)
ステップ4:学習データから検証セットを作成する
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
ステップ5:モデル構造を定義する。
2つの畳み込み層、1つの密な隠れ層、出力層からなるシンプルなアーキテクチャを作成します。
model = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))
次に、作成したモデルをコンパイルします。
model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=)
ステップ6:モデルをトレーニングします。
このステップでは、トレーニングセットの画像でモデルを学習し、ご想像のとおり、検証セットを使用してモデルを検証します。
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
ステップ7:予測を行う!
最初は、トレーニングデータを扱うときに行ったステップを踏襲します。 テスト画像を読み込み、model.predict_classes()関数を使用してクラスを予測します。
download = drive.CreateFile({'id': '1KuyWGFEpj7Fr2DgBsW8qsWvjqEzfoJBY'})download.GetContentFile('test_ScVgIM0.zip')!unzip test_ScVgIM0.zip
テストファイルを読み込みます:
test = pd.read_csv('test.csv')
次に、すべてのテスト画像を読み込んで保存します:
test_image = for i in tqdm(range(test.shape)): img = image.load_img('test/'+test.astype('str')+'.png', target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 test_image.append(img)test = np.array(test_image)
# making predictionsprediction = model.predict_classes(test)
また、投稿ファイルを作成して DataHack プラットフォームページにアップロードします (leaderboard で結果がどうなるか見るため)。
download = drive.CreateFile({'id': '1z4QXy7WravpSj-S4Cs9Fk8ZNaX-qh5HF'})download.GetContentFile('sample_submission_I5njJSF.csv')
# creating submission filesample = pd.read_csv('sample_submission_I5njJSF.csv')sample = predictionsample.to_csv('sample_cnn.csv', header=True, index=False)
このsample_cnn.csvファイルをダウンロードし、コンテストページでアップロードして結果を生成し、リーダーボードでのランキングをチェックします。 これは、画像分類の問題を始めるためのベンチマーク ソリューションを提供します!
モデルのパフォーマンスをさらに向上させるために、ハイパーパラメータのチューニングや正則化のテクニックを試すことができます。 この詳細については、「ゼロから畳み込みニューラルネットワークを学ぶ包括的なチュートリアル」という記事を参照してください。 このセクションでは、「数字を識別する」練習問題を解いていきます。 データセットをダウンロードしてください。 先に進む前に、自力で解いてみてください。 解くためのツールはすでに持っているのですから、あとはそれを応用するだけです。 7163>
この課題では、与えられた画像内の数字を識別する必要があります。 合計70,000枚の画像があります。49,000枚のラベル付き画像がトレーニングセットで、残りの21,000枚がテストセットです(テスト画像はラベル無しです)。 これらのラベルのない画像のクラスを識別/予測する必要があります。
準備はできましたか? 素晴らしい! 新しい Python 3 ノートブックを作成し、次のコードを実行します:
# Setting up Colab!pip install PyDrive
import osfrom pydrive.auth import GoogleAuthfrom pydrive.drive import GoogleDrivefrom google.colab import authfrom oauth2client.client import GoogleCredentials
auth.authenticate_user()gauth = GoogleAuth()gauth.credentials = GoogleCredentials.get_application_default()drive = GoogleDrive(gauth)
# Replace the id and filename in the below codesdownload = drive.CreateFile({'id': '1ZCzHDAfwgLdQke_GNnHp_4OheRRtNPs-'})download.GetContentFile('Train_UQcUa52.zip')!unzip Train_UQcUa52.zip
# Importing librariesimport kerasfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Flattenfrom keras.layers import Conv2D, MaxPooling2Dfrom keras.utils import to_categoricalfrom keras.preprocessing import imageimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_splitfrom keras.utils import to_categoricalfrom tqdm import tqdm
train = pd.read_csv('train.csv')
# Reading the training imagestrain_image = for i in tqdm(range(train.shape)): img = image.load_img('Images/train/'+train, target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 train_image.append(img)X = np.array(train_image)
# Creating the target variabley=train.valuesy = to_categorical(y)
# Creating validation setX_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42, test_size=0.2)
# Define the model structuremodel = Sequential()model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=(28,28,1)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.25))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax'))
# Compile the modelmodel.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=)
# Training the modelmodel.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))
download = drive.CreateFile({'id': '1zHJR6yiI06ao-UAh_LXZQRIOzBO3sNDq'})download.GetContentFile('Test_fCbTej3.csv')
test_file = pd.read_csv('Test_fCbTej3.csv')
test_image = for i in tqdm(range(test_file.shape)): img = image.load_img('Images/test/'+test_file, target_size=(28,28,1), grayscale=True) img = image.img_to_array(img) img = img/255 test_image.append(img)test = np.array(test_image)
prediction = model.predict_classes(test)
download = drive.CreateFile({'id': '1nRz5bD7ReGrdinpdFcHVIEyjqtPGPyHx'})download.GetContentFile('Sample_Submission_lxuyBuB.csv')
sample = pd.read_csv('Sample_Submission_lxuyBuB.csv')sample = test_filesample = predictionsample.to_csv('sample.csv', header=True, index=False)
練習問題ページにこのファイルを送信してかなり適切な精度数値を取得することができます。 これは良いスタートですが、常に改善の余地があります。 ハイパーパラメータ値で遊んでみて、私たちの基本モデルを改善できるかどうか見てみましょう。
エンディングノート
深層学習モデルの訓練に何時間も何日も必要だと言ったのは誰だ? 私の目的は、かなりまともなディープラーニングモデルを二倍の速さで考え出せることを紹介することでした。 同じような課題をピックアップして、あなたの側からもコーディングしてみるべきです。 やってみることで学ぶということは、何事にも代えがたいことです!
一流のデータ科学者やアナリストは、ハッカソンが始まる前からこれらのコードを用意しています。 彼らは、詳細な分析に入る前に、これらのコードを使用して初期の提出物を作成します。 いったんベンチマークとなるソリューションができると、さまざまなテクニックを使ってモデルの改良を開始します。