今日も見てみます。初心者なので、追っていくだけで大変です。
https://www.kaggle.com/learn/computer-vision
ほぼコピペですが、、、
https://www.kaggle.com/code/ryanholbrook/the-convolutional-classifier
画像認識で最も優れているニューラルネットワークは、畳み込みニューラルネットワークと呼ばれます(略してconvnetやCNNとも言います)。畳み込みは、convnetの層にそのユニークな構造を与える数学的な操作です。
https://www.kaggle.com/code/ryanholbrook/the-convolutional-classifier
ベースは画像から特徴を抽出するために使用されます。主に畳み込み操作を行う層で構成されていますが、他の種類の層も含まれることがよくあります。ヘッドは画像のクラスを決定するために使用されます。主に密な層で構成されていますが、ドロップアウトのような他の層も含まれることがあります。
https://www.kaggle.com/code/ryanholbrook/the-convolutional-classifier
分類器の訓練
ネットワークの訓練中の目標は、以下の2つのことを学ぶことです:
1. 画像からどの特徴を抽出するか(ベース)。
2. どのクラスがどの特徴と関連しているか(ヘッド)。
現在、convnetsはゼロから訓練されることはほとんどありません。よくあるのは、事前に訓練されたモデルのベースを再利用することです。その事前訓練済みのベースに、未訓練のヘッドを接続します。言い換えれば、1. 特徴を抽出するためにすでに学習されたネットワークの部分を再利用し、その上に新しい層を追加して2. 分類することを学びます。
ヘッドは通常、数少ない密な層のみから構成されるため、比較的少ないデータから非常に正確な分類器を作成することができます。
事前に訓練されたモデルを再利用するこの技術は、転移学習として知られています。この方法は非常に効果的であり、現在のほぼすべての画像分類器がこれを利用しています。
例 - Convnet分類器の訓練
このコースを通じて、私たちは以下の問題を解決しようとする分類器を作成します:これは車の写真ですか、トラックの写真ですか?私たちのデータセットは、約10,000枚のさまざまな自動車の写真で、おおよそ半分は車、半分はトラックです。
ステップ1 - データの読み込み
次の非表示セルは、いくつかのライブラリをインポートし、データパイプラインを設定します。ds_trainという訓練分割と、ds_validという検証分割があります。
# Imports
import os, warnings
import matplotlib.pyplot as plt
from matplotlib import gridspec
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing import image_dataset_from_directory
Reproducability
def set_seed(seed=31415):
np.random.seed(seed)
tf.random.set_seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
os.environ['TF_DETERMINISTIC_OPS'] = '1'
set_seed(31415)
Set Matplotlib defaults
plt.rc('figure', autolayout=True)
plt.rc('axes', labelweight='bold', labelsize='large',
titleweight='bold', titlesize=18, titlepad=10)
plt.rc('image', cmap='magma')
warnings.filterwarnings("ignore") # to clean up output cells
Load training and validation sets
ds_train_ = image_dataset_from_directory(
'../input/car-or-truck/train',
labels='inferred',
label_mode='binary',
image_size=[128, 128],
interpolation='nearest',
batch_size=64,
shuffle=True,
)
ds_valid_ = image_dataset_from_directory(
'../input/car-or-truck/valid',
labels='inferred',
label_mode='binary',
image_size=[128, 128],
interpolation='nearest',
batch_size=64,
shuffle=False,
)
Data Pipeline
def convert_to_float(image, label):
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
return image, label
AUTOTUNE = tf.data.experimental.AUTOTUNE
ds_train = (
ds_train_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
ds_valid = (
ds_valid_
.map(convert_to_float)
.cache()
.prefetch(buffer_size=AUTOTUNE)
)
Found 5117 files belonging to 2 classes.
Found 5051 files belonging to 2 classes.
import matplotlib.pyplot as plt
ステップ2 - 事前訓練済みベースの定義
事前訓練に最も一般的に使用されるデータセットはImageNetで、さまざまな種類の自然な画像の大規模なデータセットです。Kerasのapplicationsモジュールには、ImageNetで事前訓練されたさまざまなモデルが含まれています。私たちが使用する事前訓練済みのモデルはVGG16と呼ばれます。
pretrained_base = tf.keras.models.load_model(
'../input/cv-course-models/cv-course-models/vgg16-pretrained-base',
)
pretrained_base.trainable = False
ステップ3 - ヘッドの接続
次に、分類器のヘッドを接続します。この例では、隠れユニットの層(最初のDense層)を使用し、次にクラス1、トラックの確率スコアに出力を変換する層を使用します。Flatten層は、ベースの二次元の出力を、ヘッドが必要とする一次元の入力に変換します。
from tensorflow import keras
from tensorflow.keras import layers
model = keras.Sequential([
pretrained_base,
layers.Flatten(),
layers.Dense(6, activation='relu'),
layers.Dense(1, activation='sigmoid'),
])
ステップ4 - 訓練
最後に、モデルを訓練しましょう。これは2クラスの問題なので、クロスエントロピーと正確性のバイナリバージョンを使用します。adamオプティマイザは一般的に良好な性能を発揮するので、これを選択します。
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['binary_accuracy'],
)
history = model.fit(
ds_train,
validation_data=ds_valid,
epochs=30,
verbose=0,
)
ニューラルネットワークを訓練する際には、損失とメトリックのプロットを確認するのが常に良いアイディアです。historyオブジェクトには、history.historyという辞書の中にこの情報が含まれています。Pandasを使用してこの辞書をデータフレームに変換し、組み込みのメソッドでプロットすることができます。
import pandas as pd
history_frame = pd.DataFrame(history.history)
history_frame.loc[:, ['loss', 'val_loss']].plot()
history_frame.loc[:, ['binary_accuracy', 'val_binary_accuracy']].plot();
結論
このレッスンでは、convnet分類器の構造について学びました:特徴抽出を行うベースの上に、分類器として機能するヘッドがあります。
ヘッドは、本質的には入門コースで学んだ通常の分類器と同じものです。特徴としては、ベースによって抽出された特徴を使用します。これが畳み込み分類器の基本的なアイディアです:分類器自体に特徴エンジニアリングを行うユニットを接続することができるということです。
これは、深いニューラルネットワークが伝統的な機械学習モデルよりも持っている大きな利点の一つです:適切なネットワーク構造が与えられれば、深いニューラルネットは、問題を解決するために必要な特徴をエンジニアリングする方法を学ぶことができます。
次の数回のレッスンでは、畳み込みベースがどのように特徴抽出を達成するかを見ていきます。その後、これらのアイディアを適用し、独自の分類器を設計する方法を学びます。