Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TensorFlow 2 : Keras 入門&最新(?)ライブラリー紹介

Etsuji Nakai
October 16, 2020

TensorFlow 2 : Keras 入門&最新(?)ライブラリー紹介

2020/10/16 ver1.0
2020/10/17 ver1.1
2020/11/05 ver1.2 fix typo

Etsuji Nakai

October 16, 2020
Tweet

More Decks by Etsuji Nakai

Other Decks in Technology

Transcript

  1. Tensorflow 2.x の特徴:Eager Execution 5 • Tensorflow では、専用の tf オブジェクトを用いて計算処理を実施する(NumPy

    だと、np.array オブ ジェクトを用いて計算するのと同様) • tf オブジェクトに対する計算方式のデフォルトが Define and Run から Eager Execution に変更 • Define and Run:すべての計算処理を静的な「計算グラフ」として定義した後に計算を行う ◦ if 文などの制御構造(条件分岐)を含む計算処理も「計算グラフ」として定義する必要があるた め、そのような計算処理をしたい場合、コードの書き方が非直感的で難しかった • Eager Execution:NumPy などと同様にコードの実行と同時に計算処理を行う ◦ 制御構造を含む関数内で tf オブジェクトに対する計算処理を動的に実行可能 • ・・・とは言え、Keras を使う場合は、(Sub-classing を用いる場合を除いて)これらの違いは意識す る必要はありません。
  2. Tensorflow 2.x の特徴:Dataset 機能 6 • ストレージなどに格納された学習データに前処理を施してバッチ化する機能 ◦ ファイル読み出し、前処理、シャッフル、繰り返し、バッチ化、プリフェッチをまとめて実行す る

    Generator を定義しておき、トレーニングデータとして利用 # all_image_paths : 画像ファイルのファイルパスのリスト # all_image_labels : 正解ラベルのリスト def load_and_preprocess_image(path): image = tf.io.read_file(path) image = tf.image.decode_jpeg(image, channels=3) image = tf.image.resize(image, [192, 192]) / 255.0 return image image_ds = tf.data.Dataset.from_tensor_slices(all_image_paths).map(load_and_preprocess_image, num_parallel_calls=AUTOTUNE) label_ds = tf.data.Dataset.from_tensor_slices(tf.cast(all_image_labels, tf.int64)) image_label_ds = tf.data.Dataset.zip((image_ds, label_ds)) ds = image_label_ds.shuffle(buffer_size=image_count).repeat().batch(BATCH_SIZE).prefetch(buffer_size=AUTOTUNE) model.fit(ds, epochs=100, steps_per_epoch=image_count/BATCH_SIZE) ファイル読み込み +前処理関数 パスのリストに 読み込み関数適用 シャッフル、繰り返し、 バッチ化、プリフェッチを適用 得られた Generator を トレーニングデータに指定 GPU による学習と CPU によるデータ 読み出しを並列実行
  3. Tensorflow と Keras の関係 7 Keras TensorFlow Distributed Execution Engine

    (C++) CPU GPU TPU C++, Python, R, GO, Java, Swift, ... layers, losses, metrics, optimizers, etc. Estimator APIs High-level APIs for building custom models ML Ingredients Premade Estimators Runs on different hardware Highly efficient C++ implementation Frontend SDKs for full control Dataset Android TensorFlow Core APIs Do anything XLA iOS Raspberry PI ... Keras Models - sequential - functional • Keras:ニューラルネット ワークモデルを Python の コードで定義するための API (言語仕様) • Tensorflow 2.x では、 Keras API を実装したライブ ラリを tensorflow.keras と して標準提供
  4. Keras のプログラミングモデル:Sequential API 8 model = models.Sequential() model.add(layers.Dense(2, activation='relu',input_shape=(2,), name='hidden1'))

    model.add(layers.Dense(2, activation='relu', name='hidden2')) model.add(layers.Dense(1, activation='sigmoid', name='output')) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= hidden1 (Dense) (None, 2) 6 _________________________________________________________________ hidden2 (Dense) (None, 2) 6 _________________________________________________________________ output (Dense) (None, 1) 3 ================================================================= Total params: 15 Trainable params: 15 Non-trainable params: 0 _________________________________________________________________ • 入力から出力までが(枝分かれなどが無い)一直線のシンプルなモデルを定義 隠れ層1 隠れ層2 出力層 入力データ 出力データ 空のモデルを用意して、 add メソッドで レイヤーを追加していく
  5. Keras のプログラミングモデル:Function API 9 • 複数の入出力層を持つモデルを定義したり、複数のモデルを組み合わせる際に使用する 生成モデル 識別モデル 潜在変数 識別結果

    discriminator.trainable = False gan_input = tf.keras.Input(shape=(latent_dim,)) gan_output = discriminator(generator(gan_input)) gan_model = models.Model(gan_input, gan_output) gan_model.summary() ================================================================== Model: "model" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, 64)] 0 _________________________________________________________________ sequential (Sequential) (None, 784) 614145 _________________________________________________________________ sequential_1 (Sequential) (None, 1) 212865 ================================================================= Total params: 827,010 Trainable params: 614,145 Non-trainable params: 212,865 _________________________________________________________________ モデルを通常の関数の ように組み合わせていき、 最後に入出力層を指定する
  6. Keras のプログラミングモデル:Sub-classing 10 • Layer クラスや Model クラスのサブクラスを定義して、条件分岐などを含む振る舞いを直接に 記述する class

    Linear(keras.layers.Layer): def __init__(self, units=32, input_dim=32): super(Linear, self).__init__() w_init = tf.random_normal_initializer() self.w = tf.Variable( initial_value=w_init(shape=(input_dim, units), dtype="float32"), trainable=True, ) b_init = tf.zeros_initializer() self.b = tf.Variable( initial_value=b_init(shape=(units,), dtype="float32"), trainable=True ) def call(self, inputs): return tf.matmul(inputs, self.w) + self.b このレイヤーで行う計算処理を 通常の関数として実装する
  7. Keras API を用いたモデル定義と学習処理の例 12 model = models.Sequential() model.add(layers.Dense(256, activation='relu', input_shape=(1,)))

    model.add(layers.Dense(128, activation='relu')) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(1)) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 256) 512 _________________________________________________________________ dense_1 (Dense) (None, 128) 32896 _________________________________________________________________ dense_2 (Dense) (None, 64) 8256 _________________________________________________________________ dense_3 (Dense) (None, 1) 65 ================================================================= Total params: 41,729 Trainable params: 41,729 Non-trainable params: 0 _________________________________________________________________ model.compile(optimizer='adam', loss='mse') history = model.fit(xs, ys, batch_size=len(xs), epochs=10000, verbose=0) DataFrame({'loss': history.history['loss']}).plot()
  8. 15

  9. 「確率分布」を計算対象とするライブラリー 16 • Tensorflow が計算対象とする tf オブジェクトとして、「確率分布」のクラスを追加 • 確率分布に対する数値計算処理を Tensorflow

    の実行エンジンを用いて高速に実行 ※ 確率分布:ある観測量 X がどのような値をとるかを確率的に示したもの • これを利用すると、特定の予測値ではなく、その背後にある「確率分布」そのものを予測するモデルが 構築できます ポアソン分布 正規分布
  10. 特定の値を予測する(普通の)モデル 17 • 領域によって分散が異なるデータであっても、モデルの出力には分散に関する情報は含まれない model = models.Sequential() model.add(layers.Dense(64, activation='relu', input_shape=(1,)))

    model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(1)) model.summary() ================================================================== Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense (Dense) (None, 64) 128 _________________________________________________________________ dense_1 (Dense) (None, 32) 2080 _________________________________________________________________ dense_2 (Dense) (None, 1) 33 ================================================================= Total params: 2,241 Trainable params: 2,241 Non-trainable params: 0 _________________________________________________________________ 出力層は単一ノード (単一の実数値を出力) x 軸の値によって データの分散が異なる
  11. 確率分布を予測するモデル 18 • x の値ごとに、分散が異なる(独立な)正規分布が隠れていると仮定して、その分布を予測するモデル model = models.Sequential() model.add(layers.Dense(64, activation='relu',

    input_shape=(1,))) model.add(layers.Dense(32, activation='relu')) model.add(layers.Dense(2)) # predict loc and scale model.add(tfp.layers.DistributionLambda( lambda t: tfd.Normal(loc=t[..., :1], scale=tf.math.softplus(t[..., 1:])) )) model.summary() ================================================================== Model: "sequential_1" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= dense_3 (Dense) (None, 64) 128 _________________________________________________________________ dense_4 (Dense) (None, 32) 2080 _________________________________________________________________ dense_5 (Dense) (None, 2) 66 _________________________________________________________________ distribution_lambda (Distrib ((None, 1), (None, 1)) 0 ================================================================= Total params: 2,274 Trainable params: 2,274 Non-trainable params: 0 _________________________________________________________________ 平均と√分散を出力 正規分布の オブジェクトを出力 確率分布そのものが得ら れるので、新しいサンプ ルを取得することも可能 平均と2×√分散をプロット https://github.com/enakai00/tfp_examples/blob/main/DNN_regression_for_means_and_variances.ipynb
  12. ガウス過程:確率的に「関数」を出力するモデル 20 • 「ガウス過程」は、このような確率分布の1つで、滑らかに変化する関数を予測す る際に用いられる ⇨ パラメーター値(カーネル関数)により、変化の振れ幅や頻 度が変わるので、トレーニングデータを用いてパラメーターチューニングする • ・・・と言った処理をまとめて行うライブラリが

    Tensorflow Probability には予め 用意されています くじを引くと関数 y=f(x) が1つ出てくる • たとえば、先ほどのデータを「一年間の気温変化のデータを過去50年分集めたもの」と仮定して、 「来年以降の気温変化 y = f(x) を予測するモデル」を作る場合を考えると・・・ • 夏の気温は、「日々の変動が激しい」のではなく、「年ごとの変動が激しい」(冷夏だったり、暑夏 だったり)と考えるのが自然なので、x ごとに独立した確率分布で値を出力するのではなく、一年間の データを(滑らかに変化する関数として)まとめて出力するモデルが必要 • つまり、一連の(相関を持った)値がまとめて得られる確率分布、言い換えると、「(滑らかに変化す る)関数 y = f(x) を確率的に出力する分布」が必要
  13. デジタル論理回路との比較 25 Time (sequence) Space (layout) デジタル論理回路 • 出力結果は決定的 •

    NAND ゲートの組み合わせ であらゆる演算が構成可能 量子回路 • 測定結果は確率的 • 1 qubit rotation と 2 qubit CNOT であらゆる 演算が構成可能 H H
  14. これまでの量子コンピューターの使い方 26 Cirq 量子コンピューター API コール 実行結果 量子回路を記述して、 量子コンピューターで実行する Python

    ライブラリー 人間が量子回路を考えて Cirq で実装する • 量子回路は、人間が考えて実装する • 量子コンピューターの実行結果は確率的に得られるので、多数の結果を収集して、統計的に答えを出す
  15. 28

  16. Quantum Tensorflow が提供する機能 29 • Tensorflow の ML モデルによる計算処理と Cirq

    による量子計算処理を組み合わせて実行する機能を提供 • 利用例:量子回路に含まれるパラメーター値を ML モデルで最適化 Cirq 量子コンピューター API コール 実行結果 ML モデル パラメーター設定値 実行結果 実行結果をトレーニングデータとして 量子回路に含まれるパラメーターの 最適値を ML モデルで計算する
  17. Hello World 的なサンプル 30 • 量子プロセッサのハードウェアに製造過程で生じたズレがあるという想定 • ズレを補正して、量子ビットを特定の状態(例えば |0>)に初期化する量子回路を設計したい •

    補正用量子回路に含まれるパラメーターの値を Tensorflow のモデルでチューニングする https://www.tensorflow.org/quantum/tutorials/hello_many_worlds Tensorflow の ML モデル Cirq で記述した量子回路 量子回路の出力値と期待する 結果の差を誤差関数とする 量子回路のパラメータ値 を ML モデルで計算
  18. 量子回路そのものを機械学習モデルとして利用するアイデア 31 • 画像データが「犬であるか」「犬でないか」を判別する分類モデル、作ったことありますよね??? • 「多数のパラメーターを含む(適当に複雑な)ニューラルネットワークを用意して、正解率が上がるよ うにパラメーターをチューニングする」というのが機械学習の基本でした • 同様に、ある量子デバイスから得られた量子データ(量子ビットとして記録されたデータ)が「◦◦で るか」「◦◦でないか」を判別する量子回路を作りたくなるかも知れません

    • 「多数のパラメーターを含む(適当に複雑な)量子回路を用意して、正解率が上がるようにパラメー ターをチューニングする」ことで、これが実現できる(かも知れません) • Quantum Tensorflow を用いるとこれを実現するコードが簡単に書けます ※ パラメーターのチューニングそのもの(勾配降下法の計算)は、普通に古典コンピューターで     行います。トレーニングデータに対する予測結果を得る部分を量子コンピューターで行います
  19. 量子畳み込みニューラルネットワーク 32 • Cirq で記述した量子回路をレイヤーに含む「量子機械学習モデル」を Tensorflow で記述して、学習処 理を実行する https://www.tensorflow.org/quantum/tutorials/qcnn トレーニング用の量子データを

    生成する量子回路 量子データの種類を判別する量子回路 (ここに含まれるパラメーターを チューニングする) 正解ラベル 量子回路の出力値と 正解ラベルの差
  20. Quantum Tensorflow によるハイブリッド ML モデル 33 • Quantum Tensorflow では、ML

    モデルの隠れ層に Cirq を介した量子コンピューターによる計算処理を 組み込んだ、古典 - 量子ハイブリッド ML モデルが作成できる API コール 実行結果 (古典)隠れ層 量子隠れ層 (古典)隠れ層 量子コンピューター 入力データ 出力値 勾配降下法による学習処理は 古典コンピューターで実行 Cirq で記述した(チューニング可能な パラメーターを含む)量子回路