の解説です。
一般に、訓練するデータの数とネットワークを大きくすると性能は上がり続けます。
しかし、訓練するデータは足りず、ネットワークを大きくするには計算資源が足りません。訓練するデータを増やすために、元データを使いまわせたら(data augmentation)、ということを考えていきます。
斜めにする、一部切り抜き、裏返す、色を変えてみる・・・などさまざまな処理をすることでとりあえずデータを増やすことができます。性能が下がるのでは?と思いますが、実際やってみると、汎化性能も上昇するのでとりあえず一度データが足りていてもやってみるのもありかもしれません。
訓練データの読み込み
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,
)
'../input/car-or-truck/train':
訓練用画像データが格納されているディレクトリのパスを指定
labels='inferred':
ラベルをディレクトリ名から指定。例えば、train ディレクトリ内のサブディレクトリ名(例えば car と truck)が、そのままクラスラベルとして使用されます。
label_mode='binary':
ラベルを二値の形式でエンコードするように指定。
interpolation='nearest':
最近傍補間:最も近いピクセルの値を使って新しいピクセルの値を決定する。
shuffle=True:
データセットを読み込む前にシャッフル。
データを増やそうとしている部分
# Preprocessing
preprocessing.RandomFlip('horizontal'), # flip left-to-right
preprocessing.RandomContrast(0.5), # contrast change by up to 50%
preprocessing.RandomFlip('horizontal')
訓練中にランダムな確率で画像を水平方向に反転。
preprocessing.RandomContrast(0.5)
訓練中、コントラストをランダムに ±50% の範囲で変更。つまり、元のコントラストの 0.5 倍から 1.5 倍の間の値にする。
まとめ
上の2つで、データを色々いじります。訓練データを増やす部分もネットワークに組み込むのが少し違和感があるかもしれませんが、元となるデータをいじるより自由度が増え、データを使いやすいです。
訓練に使われた層は推論時にskipされます。