tfrecord形式のデータを使ってみる
はじめに
データは命
AI 開発を行う上では、データは非常に重要です。
どれくらい賢い AI を作れるかは、どのようなデータを使うか次第、と言っても過言ではありません。
そんな重要なデータの形式についての話です。
tfrecord 形式って?
tfrecord 形式(テンソルフローレコードけいしき)とは、TensorFlow が推奨する特別なデータ保存形式です。
tfrecord 形式
たとえば、たくさんの画像をいくつかのラベルに分類するモデルを作成する場合を考えましょう。その際、学習データや評価データは、画像の形式で保存されていると思います。
この時、実際に学習する際は、もちろん画像形式のデータをこのまま読み込んで使うことができます。
一方で、TensorFlow が推奨しているのは、一度 tfrecord と呼ばれる形式に変換する方法です。
画像形式を tfrecord 形式に変換することにより、いいことがたくさんあります。
tfrecord 形式のいいところ
tfrecord 形式に変換すると、次のようなメリットがあります。
- データの管理が楽になる
- 複数のファイルをひとつにまとめることができるので、データの整理が簡単になります。
- 処理が速くなる
- バイナリ形式で保存されるため、データの読み込みが高速です。これによって、学習時のデータ読み込みと計算を同時に行えます。
- メモリの使い方が効率的
- 大きなデータでもメモリを効率よく使えます。また、データを少しずつ読み込めるので、メモリ不足を防ぐこともできます。
- 容量を節約できる
- データがバイナリ形式で保存されるため、ファイルサイズを小さくできる
実際に変換したり読み込んだりしてみる
変換
ここでは簡単な例を使って、tfrecord 形式に変換したり、そのデータを読み込んだりしてみます。
今回は詳細なコードの説明は省きます。
ただ、コードは github にあげてあるので、気になる方はぜひ見てみてください。
2 つのことをしてみます。
- mnist のデータを tfrecord 形式で保存、そのデータを読み込む
- 画像のデータを tfrecord 形式で保存、そのデータを読み込む
1. mnist を tfrecord 形式で扱ってみる
まずは mnist データを tfrecord 形式で保存します。
python3 mnist_handler.py --data_dir /app/data --operation save
これにより、data ディレクトリに tfrecord 形式のデータが保存されました。
この中には、60,000 枚の学習データと、10,000 枚のテストデータがつまっています。
data
├── mnist_test.tfrecord
└── mnist_train.tfrecord
さて次に、実際にこのデータが読み込めるかを確認してみます。
python3 mnist_handler.py --data_dir /app/data --operation load
結果、下記のように学習データとテストデータの詳細を読み込むことができました。
各ラベルの枚数も正しく保存できています。
INFO | tfrecord_logger:main:26 | プログラムを開始します
INFO | tfrecord_logger:load_tfrecord_and_display:42 | /app/data/mnist_train.tfrecordを読み込んで情報を表示します
INFO | tfrecord_logger:load_tfrecord_and_display:46 | データ数: 60000
INFO | tfrecord_logger:load_tfrecord_and_display:47 | ラベルの分布: {0: 5923, 1: 6742, 2: 5958, 3: 6131, 4: 5842, 5: 5421, 6: 5918, 7: 6265, 8: 5851, 9: 5949}
INFO | tfrecord_logger:load_tfrecord_and_display:42 | /app/data/mnist_test.tfrecordを読み込んで情報を表示します
INFO | tfrecord_logger:load_tfrecord_and_display:46 | データ数: 10000
INFO | tfrecord_logger:load_tfrecord_and_display:47 | ラベルの分布: {0: 980, 1: 1135, 2: 1032, 3: 1010, 4: 982, 5: 892, 6: 958, 7: 1028, 8: 974, 9: 1009}
INFO | tfrecord_logger:main:40 | プログラムが正常に終了しました
このように、mnist のデータを tfrecord 形式に変換してファイルとして保存、そしてそのデータをロードすることができました。
60,000 枚や 10,000 枚のデータを管理するのは割と大変です。
しかしこのように、2 つのファイルとして保存することにより、比較的らくにデータを管理することができます。
便利。
詳細コード
2. 画像データ を tfrecord 形式で扱ってみる
次に、自作したデータを tfrecord 形式で保存してみます。
今回は画像データを下記のように保存して、それを tfrecord 形式に変換してみます。
images/
├── 0/ # ラベル名(数字)のディレクトリ
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ...
├── 1/
│ ├── image1.jpg
│ ├── image2.jpg
│ └── ...
└── ...
0 や 1 といったディレクトリ名が、ラベル名にあたります。
たとえば、0 に犬の画像をまとめていれておき、1 に猫の画像をまとめて入れておく、といったように保存してください。
今回は、サンプルとして、適当な画像を 5 枚ずつ入れておきました。
images
├── 0
│ ├── image_1.jpg
│ ├── image_2.jpg
│ ├── image_3.jpg
│ ├── image_4.jpg
│ └── image_5.jpg
└── 1
├── image_1.jpg
├── image_2.jpg
├── image_3.jpg
├── image_4.jpg
└── image_5.jpg
さて、この画像データを tfrecord 形式に変換してみます。
実行コマンドは下記の通り。
python3 /app/scripts/image_handler.py \
--data_dir /app/data \
--image_dir /app/images \
--operation save \
--output_filename images.tfrecord
これにより、data ディレクトリに tfrecord 形式のデータとして保存できました。
data
└── images.tfrecord
先ほどと同じく、この tfrecord 形式のデータをロードしてみましょう。
python3 /app/scripts/image_handler.py \
--data_dir /app/data \
--operation load \
--output_filename images.tfrecord
結果、下記のようにデータの情報を読み取ることができました。
INFO | tfrecord_logger:main:60 | プログラムを開始します
INFO | tfrecord_logger:load_tfrecord_and_display:42 | /app/data/images.tfrecordを読み込んで情報を表示します
INFO | tfrecord_logger:load_tfrecord_and_display:46 | データ数: 10
INFO | tfrecord_logger:load_tfrecord_and_display:47 | ラベルの分布: {0: 5, 1: 5}
INFO | tfrecord_logger:main:79 | プログラムが正常に終了しました
詳細コード
皆さんの理解が一歩でも進んだのなら嬉しいです。
フォロー ♻️、いいね 👍、サポート 🐱 お願いします。とっても嬉しいです。
機械学習をもっと詳しく
Python の基礎を本にまとめています。併せてご覧いただけるととても嬉しいです ↓
DeepLearning の基礎を本にまとめています。手に取って頂けるととても喜びます ↓ねこアレルギーの AI
YouTube で機械学習について発信しています。お時間ある方は覗いていただけると喜びます。
Created by NekoAllergy
Discussion