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

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

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 :
    Keras 入門&最新(?)ライブラリー紹介
    中井悦司

    View Slide

  2. Etsuji Nakai
    Solutions Architect, Google Cloud
    $ who am i

    View Slide

  3. Contents
    ● Tensorflow 2 & Keras 入門
    ● Tensorflow Probability 入門
    ● Quantum Tensorflow 入門

    View Slide

  4. Tensorflow 2 & Keras 入門

    View Slide

  5. 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 を用いる場合を除いて)これらの違いは意識す
    る必要はありません。

    View Slide

  6. 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 によるデータ
    読み出しを並列実行

    View Slide

  7. 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 と
    して標準提供

    View Slide

  8. 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 メソッドで
    レイヤーを追加していく

    View Slide

  9. 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
    _________________________________________________________________
    モデルを通常の関数の
    ように組み合わせていき、
    最後に入出力層を指定する

    View Slide

  10. 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
    このレイヤーで行う計算処理を
    通常の関数として実装する

    View Slide

  11. Keras API を用いたモデル定義と学習処理の例
    11
    ● 青点で示したデータをニューラルネットワークによる回帰モデルでフィッティングした結果
    ※ ここでは、ニューラルネットワークモデルに適さないデータを意図的に用いています。   
    この後で登場する確率モデル(ガウス過程)を用いるとより適切なフィッティングが     
    実現されます。

    View Slide

  12. 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()

    View Slide

  13. Tensorflow Probability 入門

    View Slide

  14. Tensorflow Probability とは?
    14
    https://www.tensorflow.org/probability

    View Slide

  15. 15

    View Slide

  16. 「確率分布」を計算対象とするライブラリー
    16
    ● Tensorflow が計算対象とする tf オブジェクトとして、「確率分布」のクラスを追加
    ● 確率分布に対する数値計算処理を Tensorflow の実行エンジンを用いて高速に実行
    ※ 確率分布:ある観測量 X がどのような値をとるかを確率的に示したもの
    ● これを利用すると、特定の予測値ではなく、その背後にある「確率分布」そのものを予測するモデルが
    構築できます
    ポアソン分布 正規分布

    View Slide

  17. 特定の値を予測する(普通の)モデル
    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 軸の値によって
    データの分散が異なる

    View Slide

  18. 確率分布を予測するモデル
    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

    View Slide

  19. 19
    普通に平均と分散を
    予測するモデルを作れば
    いいだけじゃん

    View Slide

  20. ガウス過程:確率的に「関数」を出力するモデル
    20
    ● 「ガウス過程」は、このような確率分布の1つで、滑らかに変化する関数を予測す
    る際に用いられる ⇨ パラメーター値(カーネル関数)により、変化の振れ幅や頻
    度が変わるので、トレーニングデータを用いてパラメーターチューニングする
    ● ・・・と言った処理をまとめて行うライブラリが Tensorflow Probability には予め
    用意されています
    くじを引くと関数 y=f(x)
    が1つ出てくる
    ● たとえば、先ほどのデータを「一年間の気温変化のデータを過去50年分集めたもの」と仮定して、
    「来年以降の気温変化 y = f(x) を予測するモデル」を作る場合を考えると・・・
    ● 夏の気温は、「日々の変動が激しい」のではなく、「年ごとの変動が激しい」(冷夏だったり、暑夏
    だったり)と考えるのが自然なので、x ごとに独立した確率分布で値を出力するのではなく、一年間の
    データを(滑らかに変化する関数として)まとめて出力するモデルが必要
    ● つまり、一連の(相関を持った)値がまとめて得られる確率分布、言い換えると、「(滑らかに変化す
    る)関数 y = f(x) を確率的に出力する分布」が必要

    View Slide

  21. ガウス過程による欠損値の推定
    21
    ● ガウス過程を用いると関数全体の変化
    に基づいて、欠損部分の変化が予測で
    きていることが分かります ニューラルネットワーク
    による予測
    「関数の分布」を予測し
    た後に、いくつかのサン
    プルを取得した結果
    https://github.com/enakai00/tfp_examples/blob/main/Gaussian_Process_Regression.ipynb

    View Slide

  22. Quantum Tensorflow 入門

    View Slide

  23. Quantum Processor の開発
    23
    https://japan.googleblog.com/2019/10/quantum-supremacy-using-programmable.html

    View Slide

  24. 量子回路 = 量子ビットの制御手順
    24
    量子ビットの
    状態を測定
    H
    H
    1ビットの足し算を
    同時に実行する量子回路

    View Slide

  25. デジタル論理回路との比較
    25
    Time (sequence)
    Space (layout)
    デジタル論理回路
    ● 出力結果は決定的
    ● NAND ゲートの組み合わせ
    であらゆる演算が構成可能
    量子回路
    ● 測定結果は確率的
    ● 1 qubit rotation と
    2 qubit CNOT であらゆる
    演算が構成可能
    H
    H

    View Slide

  26. これまでの量子コンピューターの使い方
    26
    Cirq
    量子コンピューター
    API コール 実行結果
    量子回路を記述して、
    量子コンピューターで実行する
    Python ライブラリー
    人間が量子回路を考えて
    Cirq で実装する
    ● 量子回路は、人間が考えて実装する
    ● 量子コンピューターの実行結果は確率的に得られるので、多数の結果を収集して、統計的に答えを出す

    View Slide

  27. Quantum Tensorflow とは?
    27
    https://www.tensorflow.org/quantum

    View Slide

  28. 28

    View Slide

  29. Quantum Tensorflow が提供する機能
    29
    ● Tensorflow の ML モデルによる計算処理と Cirq による量子計算処理を組み合わせて実行する機能を提供
    ● 利用例:量子回路に含まれるパラメーター値を ML モデルで最適化
    Cirq
    量子コンピューター
    API コール 実行結果
    ML モデル
    パラメーター設定値 実行結果
    実行結果をトレーニングデータとして
    量子回路に含まれるパラメーターの
    最適値を ML モデルで計算する

    View Slide

  30. Hello World 的なサンプル
    30
    ● 量子プロセッサのハードウェアに製造過程で生じたズレがあるという想定
    ● ズレを補正して、量子ビットを特定の状態(例えば |0>)に初期化する量子回路を設計したい
    ● 補正用量子回路に含まれるパラメーターの値を Tensorflow のモデルでチューニングする
    https://www.tensorflow.org/quantum/tutorials/hello_many_worlds
    Tensorflow の ML モデル
    Cirq で記述した量子回路
    量子回路の出力値と期待する
    結果の差を誤差関数とする
    量子回路のパラメータ値
    を ML モデルで計算

    View Slide

  31. 量子回路そのものを機械学習モデルとして利用するアイデア
    31
    ● 画像データが「犬であるか」「犬でないか」を判別する分類モデル、作ったことありますよね???
    ● 「多数のパラメーターを含む(適当に複雑な)ニューラルネットワークを用意して、正解率が上がるよ
    うにパラメーターをチューニングする」というのが機械学習の基本でした
    ● 同様に、ある量子デバイスから得られた量子データ(量子ビットとして記録されたデータ)が「○○で
    るか」「○○でないか」を判別する量子回路を作りたくなるかも知れません
    ● 「多数のパラメーターを含む(適当に複雑な)量子回路を用意して、正解率が上がるようにパラメー
    ターをチューニングする」ことで、これが実現できる(かも知れません)
    ● Quantum Tensorflow を用いるとこれを実現するコードが簡単に書けます
    ※ パラメーターのチューニングそのもの(勾配降下法の計算)は、普通に古典コンピューターで    
    行います。トレーニングデータに対する予測結果を得る部分を量子コンピューターで行います

    View Slide

  32. 量子畳み込みニューラルネットワーク
    32
    ● Cirq で記述した量子回路をレイヤーに含む「量子機械学習モデル」を Tensorflow で記述して、学習処
    理を実行する
    https://www.tensorflow.org/quantum/tutorials/qcnn
    トレーニング用の量子データを
    生成する量子回路
    量子データの種類を判別する量子回路
    (ここに含まれるパラメーターを
    チューニングする)
    正解ラベル
    量子回路の出力値と
    正解ラベルの差

    View Slide

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

    View Slide

  34. 34
    量子回路の微分なんて
    できないじゃん。Gradient
    どうやって計算すんの?

    View Slide

  35. 35
    https://www.tensorflow.org/quantum/tutorials/gradients
    量子回路の勾配計算
    チュートリアルを
    ご参照ください

    View Slide

  36. View Slide