29
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PythonAdvent Calendar 2021

Day 19

ディープラーニングの際に個人的によく使うpythonコードまとめ

Last updated at Posted at 2021-12-19

この記事はPython Advent Calendar 2021 カレンダー1の19日目の記事です。よろしくお願いします。

TensorflowやPytorchなどのディープラーニングフレームワークを使用するときに目的に合わせてよく使うコード例をまとめてみようという記事になります。参考になれば幸いです。

目次

1.画像のパスのリストを作成
2.ハイパーパラメータをまとめたconfigファイルを作成
3.pythonファイルで引数を取る

環境

M1 Mac
python: 3.8.12

1.画像のパスのリストを作成したい

あるディレクトリ内の画像のパスをリスト化することで、for文で一気にファイル名を変更したり、削除や移動、画像への色々な処理などを行えます。

import glob

# trainディレクトリ内の画像パスをリスト化
# 「*」にすることでtrainディレクトリ以下の全てのファイルを指定できる
img_path_list = glob.glob('./train/*')

画像のパス名を0001.png, 0002.pngといったように順番関係のあるものにしている場合は上記コードだけだと順番がバラバラになってしまうので注意です。

# リスト.sort()でファイル名を見て昇順ソート
img_path_list.sort()

例えば以下のように書くことでディレクトリ内の画像をnddarray化してリサイズすることが可能です。

import cv2

for path in img_path_list:
    img = cv2.imread(path)
    img = cv2.resize(128, 128)

「画像のパスをリスト化する」作業はディープラーニングをやってる中でよく使います。

2.モデルの設定(学習率、画像サイズなど)をまとめたい

ディープラーニングや機械学習ではJupyter notebook・Jupyter labなどのnotebook形式で実行される方が多いと思いますが、各セルでoptimizerの設定や、モデルの定義、データの読み込みなどを書いて実行していきがちですよね。

特にコンペだと何回も何回もハイパラを変更して実行することになるので、変更箇所はすぐにわかるようにしたい、すぐにアクセスできるようにしたい。

と言うことで辞書形式で設定値をまとめておくと楽です。

easydictというライブラリを使います。
下記コマンドでインストール。

pip install easydict # pip

conda install -c conda-forge easydict # conda

以下cfg.pyというpythonファイルに各種設定をまとめる例になります。

cfg.py
from easydict import EasyDict as edict

# 空の辞書を作成
Cfg = edict()

# Cfg.キー名 = 値 の形式で設定値を書いていく
Cfg.batch_size = 32
Cfg.optimizer = 'adam'
Cfg.loss = 'categorical_crossentropy'
Cfg.learning_rate = 0.001
Cfg.height = 256
Cfg.width = 256
Cfg.checkpoint_dir = './checkpoints/'
Cfg.Cutmix = True

こんな感じで必要な設定項目をまとめたら

from cfg import Cfg

config = Cfg

# Cfg.キー名で各値にアクセスできる
Cfg.batch_size
# -> 32

こうしておくと変更する場所が一箇所で済むので非常に楽です。
特に論文モデルの公式実装ではこうしたconfigファイルが書かれていることが多いです。

3.pythonファイルで引数を取りたい

普段、機械学習やディープラーニングを実行する環境がnotebook形式だと、いざ実務などで実行スクリプトを書くとなったときに困ってしまうと思います(自分がそうでした)。

argparseライブラリを使って引数指定をしてみましょう

以下推論時の画像サイズ及び画像パスを引数に指定した推論実行ファイルinfer.pyの例です。

infer.py
import argparse

# 他に必要なものインポート
# ---------------------------
# 引数の設定
parcer = argparse.ArgumentParser(description='推論実行ファイル')
parser.add_argument('img_path', type=str, help='画像のパス') # 「--」無しだと必須の引数
parser.add_argument('--img_height', type=int, help='画像の高さ', default=256) # 「--」付きだとオプション引数
parser.add_argument('--img_width', type=int, help='画像の幅', default=256)

# 引数の値をまとめて取得
args = parser.parse_args()

# 引数の値を取り出して変数に代入
img_path = args.img_path
height = args.img_height
width = args.img_width

# 推論実行関数
def infer(img_path, height, width):
   # 省略

# ---------------------

if __name__ == '__main__':
    infer(img_path, height, width)

こうしたスクリプトを書いてコンソール上で以下のように入力すると

python infer.py './train/img_001.png' 128 128

'./train/img_001.png'という画像を縦128, 横128のサイズで推論を実行することができます。

まとめ

実務に携わるようになって使うようになったもの、勉強したものをまとめました。
他にもマルチスレッド処理など、まだまだpythonの知識が足りないので勉強していきます。

29
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?