Related Articles
Filter by Category
Pytorchで画像分類の精度を高める
今回、画像分類で精度を高めるために複数データの入力できる学習モデルを作成した。その経緯から始めて実際のモデリングまでを書くことにする。 前提 今回は洋服の図面を読み込み、それがなんの種類かを判別するCNNを作成した。 図 […]
OpenCVで画像から輪郭を上手く抽出する
pythonのOpenCVで輪郭を上手く抽出することができなかったが、いくつかの改善点により上手く行った経緯をここに書き残しておく。 改善前 これは50×50のスカートの画像である。単にfindcontourし […]
Jupyter NotebookでもBlackでコードフォーマット
Jupyter NotebookでもBlackでコードフォーマット コードの可読性を上げて保守性を高めたり、コードの属人化を防いで生産性を向上させるためのルール(コーディング規約)に則った開発を行うために、ファントムでは […]
PythonのRequestsを使ってSlackに通知
PythonのRequestsを使ってSlackに通知 フォームから送られた内容やプログラムの処理結果や途中結果をSlackに通知する方法です。 以下のコードのBOT USER TOKENとCHANNEL NAMEを任意 […]
2022年度 採用についてのお知らせ
2022年度 採用についてのお知らせ 概要2022年度の採用募集を開始します。(フルタイム、副業問わずビデオ会議等で意見交換からでもOKです。) 募集職種・インフラエンジニア・ウェブアプリケーションエンジニア・機械学習エ […]
Pythonのf文字列を使った書式パターン
Pythonのf文字列を使った書式パターン この記事で紹介したf文字列を使った文字列の操作ですが、文字列に変数を埋め込む際に書式を指定できます。0埋めして文字数を揃えたり、カンマで桁を区切ることも可能です。 カンマで桁区 […]
Pythonのf文字列を使った文字列の操作
Pythonのf文字列を使った文字列の操作 Pythonのf文字列は{1}や{a}のように変数を{}(波括弧)で囲うことで、文字列の中に変数を挿入できるので直感的な記述ができるようになります。従来のように複数の変数や文字 […]
Pythonのargparseでコマンドライン引数をパース
Pythonのargparseでコマンドライン引数をパース argparseモジュールを使って、Pythonを実行する際にコマンドライン引数を指定してプログラム内に情報を渡す方法です。 引数によって処理を変えたり、別々の […]
Announcement about Internships for 2022
Announcement about Internships for 2022 日本語のページ OverviewWe’re now accepting applications for full remote […]
2022年度 インターンシップについてのお知らせ
2022年度 インターンシップについてのお知らせ For English page 概要2022年度のインターンシップの募集を開始します。 募集職種・インフラエンジニア・ウェブアプリケーションエンジニア・機械学習エンジニ […]
最新情報をお届けするメルマガ始めます
最新情報をお届けするメルマガ始めます 本ブログも開始から3年ほどが経過しこれまでに多くの方にアクセスしていただきました。なかにはブログ経由でスタッフや学生インターンとして採用にいたったり、新規プロジェクト、新規案件をまか […]
ERROR: ResolutionImpossible
ERROR: ResolutionImpossible docker-composeコマンドでビルドした際にERROR: ResolutionImpossibleというエラーが発生しました。このエラーは複数の原因があるよ […]
PyCharm&DockerでもBlackでコードフォーマット
PyCharm&DockerでもBlackでコードフォーマット venvなどで環境構築されたプロジェクトであれば、PyCharmのFile Wacherというプラグインでファイルの保存時にBlackによるコードの […]
Pythonでソートが効かないリストを文字列を操作してソートさせる
Pythonでソートが効かないリストを文字列を操作してソートさせる [‘01234_B.jpg?X=n…’,‘12340_A.jpg?X=n…’,& […]
PythonでXserverからメール送信
PythonでXserverからメール送信 レンタルサーバーで処理が終わった時や進捗を確認したいときにPythonでメールを送る方法です。今回はXserverでPythonを実行していますが、他のレンタルサーバーでもホス […]
UnicodeEncodeError: ‘ascii’ codec can’t encode
UnicodeEncodeError: ‘ascii’ codec can’t encode Pythonのprint() 関数で文字列を出力する時に以下の様なUnicodeEncod […]
2021年に最も読まれた記事ランキング
2021年に最も読まれた記事ランキング 早いもので今年も残すところあとわずかとなりました。今年のまとめとして2021年に最も読まれたブログをランキング形式で発表します。 第5位 第4位 第3位 第2位 第1位 1位、2位 […]
dockerignoreで転送に時間がかかるファイルを除外
dockerignoreで転送に時間がかかるファイルを除外 数GBを超えるSQLiteやメディアデータを含むプロジェクトをDocker Composeで起動する際に、ファイルの転送に時間がかかってしまいビルドがなかなか終 […]
Docker Composeで起動したコンテナ内に入る
Docker Composeで起動したコンテナ内に入る Docker Composeで起動したコンテナ内に入って処理やコマンドを実行する方法です。 コンテナ内に入るコマンド docker-compose up -dでコン […]
今回はPytorchで入力するデータセットを作成するためのDataloaderについて解説する。
Datasetについて
Datasetとは入力するデータをすべて保存しておくためのclassである。 Datasetは非常に便利なので、是非使い方をマスターしてほしい。
Dataloaderの最小構成はこうである。
class DataSet_A(Dataset):
def __init__(self):
super().__init__()
pass
def __len__(self):
return self.len
def __getitem__(self, index):
return x,t
Datasetで前処理をすべて行うべきである。 例えば画像分類であれば、前処理として
- 画像ファイルの読み込み
- 画像ファイルの加工 サイズをあわせる グレースケールにする等
- numpyやtensorへの変換
- 正解ラベルの作成
などの処理が必要になるだろう。 これらをDatasetに記述してゆく。
initに書くべきこと
initに書くべきことは確定している情報だ。 例えば画像ファイルのresizeする規格の情報や、画像フォルダのパスなどを書くのがよいだろう。
lenに書くべきこと
lenに書くべきことは全体のデータセットのうち、どこまでを使うかだ。 基本はすべてのデータを使いたいのでself.lenを返すようにしているが、例えばデータのうち最初の1000個だけを使いたい場合は1000を返せばよい。
getitemに書くべきこと
getitemに書くべきことは実際の前処理だ。 getitemの引数index番目の入力データと正解データをgetitemによって出力している。 ここで、学習用のデータセットを作る場合と予測用のデータセットを作る場合で処理を共通化するために、Datasetには前処理用の関数も用意しておくべきだろう。
それらを踏まえると画像認識用のclassは次のようになる。
class DataSet_A(Dataset):
def __init__(self):
super().__init__()
self.image_size = (200,200)
# フォルダに入ってる画像パスをすべて取得する
self.image_paths = glob.glob("/Dir/to/path/")
def __len__(self):
return self.len
def __getitem__(self, index):
# index番目の画像パスを取得
image_path = self.image_paths[index]
# 画像をOpenCVで読み込み
image = cv2.imread(image_path,1)
#画像の前処理
image = self.reshape_image(image)
#正解ラベル
label = 0
return image,label
def reshape_image(self, image)
#画像を加工する
image = cv2.resize(image,dsize = self.image_size)
...
return image
これで前処理とデータセットの作成は完成である。 特筆すべきは、reshape_image関数だ。 getitemに前処理を全部書いてもいいのだが、このように分けておくことで予測するときに画像の前処理をDataset_A.reshape_image(image)とすることで完了できる利点がある。
Dataloaderについて
Dataloaderとは、作成したDatasetを複数個にまとめてバッチ化するclassのことだ。 コードを書く時は次のようにするだけでよい。
train_dataloader = DataLoader(train_dataset, batch_size=16, shuffle=True)
ここまできたら後は学習するだけである。
株式会社ファントムへのお問い合わせ
群馬県でPythonを使ったAIやソフトウェアを開発している株式会社ファントムが運営しています。
最新情報をお届けします!
メーリングリストに登録するとファントムの最新情報をお届けします
お客様のメールアドレスを共有することはありません