SIGNATE Quest 衛星画像の分類
このQuestを選んだ理由
学部の研究でも画像を扱った経験があるのでやりきれそう
難易度★★★★☆に惹かれた
新たな学び
探索的分析
ミッション1と2で丁寧に教えてくれる。
flatten()での1次元化に関してもっと解説があれば嬉しい。研究でかなり苦しんだ点である。
探索的分析のまとめ(ミッション3にて)
不均衡データである:モデルがうまく学習することができるのか
今回の衛星画像データはチャンネルを7つもつ:通常の画像処理ライブラリは1チャンネルの白黒画像や3チャンネルのRGB画像を前提としているので特別な処理が必要となる
分布に偏りがある:正規化手法の選択に影響する
正規化の処理
研究ではすでに正規化されたデータを使用させていただいていたため自分でやるのは初めて・・
今回は2段階の処理をする
①すべての値を無理やり範囲内に収める
範囲の最大値より大きい値は最大値、小さい値は最小値に変換される
np.clip(data, min, max)
②0~1に正規化する
x-min/max-min
データの分割
train_test_split()関数
引数stratifyに正解ラベルのデータを指定することで、学習データと検証データをラベルの偏りがなく分割することができる。正解ラベルを前提に「層化」してくれるので分布を維持しながら分割できる。
torchvision.transformsモジュール
transforms.Compose()
インスタンス化して使う。中に書いた各前処理を行う。
正規化処理の関数 normalize() とまったく同じ処理を組み込むには?・・・クラスNormalizeを作成、def __call__(self, image):内に関数のnormalize()の処理を書く。
transform = transforms.Compose([
Normalize(),
transforms.ToTensor(),
])
モデルの学習時と検証時に異なる前処理をする
Pytorch
クラス Datasetクラス
trainとvalで異なる前処理をするため、読み込みと前処理クラス作成
DataLoaderはその動作を管理する
train用、val用DataLoaderインスタンスを辞書に格納する
preresnet
最初の層
(conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
受け取るチャンネル数=3
出力するチャンネル数=16
受け取るチャンネル数を7で再定義
net.conv1 = nn.Conv2d(7, 16, )kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False
最後の層
(fc): Linear(in_features=64, out_features=100, bias=True)
100分類ではなく2値分類で再定義
net.fc = nn.Linear(in_features=64, out_features=2, bias=True)
IoU(Intersection over Union)
不均衡データの二値分類タスクにおいて適切な評価指標。
その他、F値、recall、precision