こしあん
2020-05-26

tf.data.Datasetでdictなデータと仲良くする方法

Pocket
LINEで送る
Delicious にシェア

741{icon} {views}



TensorFlow2.0でdict構造のデータから、tf.data.Datasetを作る方法を見ていきます。バッチの軸の結合処理を一切書かずに、dict構造を保ったままバッチ化してくれる便利な方法です。

サンプルデータ

こんなデータをdict構造を保ったままtf.data.Datasetで回したいのです。JSONでよくある例です。

# サンプルデータ
sample_data = [
    {
        "name": "綾波",
        "hp": [290, 1498],
        "power": [12, 57],
        "torpedo": [98, 463]
    },
    {
        "name": "ラフィー",
        "hp": [319, 1650],
        "power": [19, 88],
        "torpedo": [56, 266]
    },
    {
        "name": "ジャベリン",
        "hp": [255, 1318],
        "power": [15, 70],
        "torpedo": [71, 334]
    },
    {
        "name": "Z23",
        "hp": [345, 1786],
        "power": [22, 104],
        "torpedo": [61, 289]
    }
]

なぜdict構造を保ちたいのかというと、パラメーターが多数になったときに、tupleだとどれがどれだかわからなくなるからです(順番がややこしい)。dict構造ならkey-valueが紐付いているため混乱が少なくなります。

ここでは、名前を無視して、名前、火力、雷装の値だけを取り出すものとします。

コード

もっとスマートな方法はあるかもしれませんが、tf.data.Dataset.from_generatorを使うとできます。ただし、このジェネレーターは出力の型とshapeを指定する必要があり、公式ドキュメントだとあくまでtupleの例しか書いていなくdictの例はありませんでした。ただし、dict構造を保ったままでも実装可能です。

import tensorflow as tf

def generator():
    for x in sample_data:
        items = {}
        for k in ["hp", "power", "torpedo"]:
            items[k] = x[k]
        yield items  # dictで返す

def main():
    data = tf.data.Dataset.from_generator(generator,
        {"hp": tf.float32, "power": tf.float32, "torpedo": tf.float32},
        {"hp": (2,), "power": (2,), "torpedo": (2,)}
        ).shuffle(4).batch(2)

    for x in data:
        print("---")
        print(x)

if __name__ == "__main__":
    main()

上の「generator」という関数を、「tf.data.Dataset.from_generator」で読ませます。ただし、ここでジェネレーターの返り値はdictです。

返り値がdictの場合、型とshapeの指定もdictでします。上の例がそうです。

結果は次のようになります。バッチサイズ2で2バッチ読み出されます。

---
{'hp': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 319., 1650.],
       [ 255., 1318.]], dtype=float32)>, 'power': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[19., 88.],
       [15., 70.]], dtype=float32)>, 'torpedo': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 56., 266.],
       [ 71., 334.]], dtype=float32)>}
---
{'hp': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 290., 1498.],
       [ 345., 1786.]], dtype=float32)>, 'power': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 12.,  57.],
       [ 22., 104.]], dtype=float32)>, 'torpedo': <tf.Tensor: shape=(2, 2), dtype=float32, numpy=
array([[ 98., 463.],
       [ 61., 289.]], dtype=float32)>}

このように、dict構造を保ったままバッチ化ができました。ニューラルネットワークからアクセスしたいときはキーでアクセスすればOKでです。

バッチの軸の結合は一切書かずにdict構造を保ったまま変換してくれるのが便利ですね。



Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内

技術書コーナー

【新刊】インフィニティNumPy――配列の初期化から、ゲームの戦闘、静止画や動画作成までの221問

「本当の実装力を身につける」ための221本ノック――
機械学習(ML)で避けて通れない数値計算ライブラリ・NumPyを、自在に活用できるようになろう。「できる」ための体系的な理解を目指します。基礎から丁寧に解説し、ディープラーニング(DL)の難しいモデルで遭遇する、NumPyの黒魔術もカバー。初心者から経験者・上級者まで楽しめる一冊です。問題を解き終わったとき、MLやDLなどの発展分野にスムーズに入っていけるでしょう。

本書の大きな特徴として、Pythonの本でありがちな「NumPyとML・DLの結合を外した」点があります。NumPyを理解するのに、MLまで理解するのは負担が大きいです。本書ではあえてこれらの内容を書いていません。行列やテンソルの理解に役立つ「従来の画像処理」をNumPyベースで深く解説・実装していきます。

しかし、問題の多くは、DLの実装で頻出の関数・処理を重点的に取り上げています。経験者なら思わず「あー」となるでしょう。関数丸暗記では自分で実装できません。「覚える関数は最小限、できる内容は無限大」の世界をぜひ体験してみてください。画像編集ソフトの処理をNumPyベースで実装する楽しさがわかるでしょう。※紙の本は電子版の特典つき

モザイク除去から学ぶ 最先端のディープラーニング

「誰もが夢見るモザイク除去」を起点として、機械学習・ディープラーニングの基本をはじめ、GAN(敵対的生成ネットワーク)の基本や発展型、ICCV, CVPR, ECCVといった国際学会の最新論文をカバーしていく本です。
ディープラーニングの研究は発展が目覚ましく、特にGANの発展型は市販の本でほとんどカバーされていない内容です。英語の原著論文を著者がコードに落とし込み、実装を踏まえながら丁寧に解説していきます。
また、本コードは全てTensorFlow2.0(Keras)に対応し、Googleの開発した新しい機械学習向け計算デバイス・TPU(Tensor Processing Unit)をフル活用しています。Google Colaboratoryを用いた環境構築不要の演習問題もあるため、読者自ら手を動かしながら理解を深めていくことができます。

AI、機械学習、ディープラーニングの最新事情、奥深いGANの世界を知りたい方にとってぜひ手にとっていただきたい一冊となっています。持ち運びに便利な電子書籍のDLコードが付属しています。

「おもしろ同人誌バザールオンライン」で紹介されました!(14:03~) https://youtu.be/gaXkTj7T79Y?t=843

まとめURL:https://github.com/koshian2/MosaicDeeplearningBook
A4 全195ページ、カラー12ページ / 2020年3月発行

Shikoan's ML Blog -Vol.1/2-

累計100万PV超の人気ブログが待望の電子化! このブログが電子書籍になって読みやすくなりました!

・1章完結のオムニバス形式
・機械学習の基本からマニアックなネタまで
・どこから読んでもOK
・何巻から読んでもOK

・短いものは2ページ、長いものは20ページ超のものも…
・通勤・通学の短い時間でもすぐ読める!
・読むのに便利な「しおり」機能つき

・全巻はA5サイズでたっぷりの「200ページオーバー」
・1冊にたっぷり30本収録。1本あたり18.3円の圧倒的コストパフォーマンス!
・文庫本感覚でお楽しみください

北海道の駅巡りコーナー

日高本線 車なし全駅巡り

ローカル線や秘境駅、マニアックな駅に興味のある方におすすめ! 2021年に大半区間が廃線になる、北海道の日高本線の全区間・全29駅(苫小牧~様似)を記録した本です。マイカーを使わずに、公共交通機関(バス)と徒歩のみで全駅訪問を行いました。日高本線が延伸する計画のあった、襟裳岬まで様似から足を伸ばしています。代行バスと路線バスの織り成す極限の時刻表ゲームと、絶海の太平洋と馬に囲まれた日高路、日高の隠れたグルメを是非たっぷり堪能してください。A4・フルカラー・192ページのたっぷりのボリュームで、あなたも旅行気分を漫喫できること待ったなし!

見どころ:日高本線被災区間(大狩部、慶能舞川橋梁、清畠~豊郷) / 牧場に囲まれた絵笛駅 / 窓口のあっただるま駅・荻伏駅 / 汐見の戦争遺跡のトーチカ / 新冠温泉、三石温泉 / 襟裳岬

A4 全192ページフルカラー / 2020年11月発行


Pocket
Delicious にシェア

Add a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です