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

ディープラーニング入門

 ディープラーニング入門

2026年度 TopSE「機械学習概論」コースの一部として使用した講義資料です。
https://www.topse.jp/ja/curriculum-lectures.html

Avatar for Etsuji Nakai

Etsuji Nakai

August 09, 2026

More Decks by Etsuji Nakai

Other Decks in Technology

Transcript

  1. Introduction to Machine Learning Theory for Software Engineers 機械学習概論 ディープラーニング入門

    Etsuji Nakai ver6.2 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved.
  2. 目次 ▪ 第1部 予備知識 - TensorFlow(low-level API)のコードの書き方 - TensorFlow(Keras API)のコードの書き方

    - ロジスティック回帰と最尤推定法 ▪ 第2部 畳み込みニューラルネットワーク入門 - 線形多項分類器 - 多層ニューラルネットワークによる特徴抽出 - 畳み込みフィルターによる画像の特徴抽出 - 畳み込みフィルターの動的な学習 - 少し高度な話題 2 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 2
  3. サンプルコードの入手について ▪ 新しく開いたノートブック上で次のコマンドを実行すると、本講義のサンプル ノートブックがダウンロードできます。 - 次のコマンドを実行すると、ユーザー認証が行われて、Colab の実行環境に該当ユー ザーの Google Drive

    がマウントされます。 from google.colab import drive drive.mount('/content/gdrive') - 次のコマンドを実行すると、サンプルノートブックが Google Drive に保存されます。 %%bash git clone https://github.com/enakai00/colab_tfbook.git cd 'colab_tfbook' git checkout keras3 cp -a ../colab_tfbook '/content/gdrive/My Drive/Colab Notebooks/' ▪ GitHub でコードを確認する際は、下記の URL(keras3 ブランチ)を参照して ください。 - https://github.com/enakai00/colab_tfbook/tree/keras3 4 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 4
  4. ノートブック実行時の注意点 ▪ ノートブックの先頭部分に GPU ランタイムを使用するかどうかが記載されて います。 - run with CPU

    (no GPU) runtime. - run with GPU runtime. ▪ :GPU ランタイムを使用しません。 :GPU ランタイムを使用します。 GPU ランタイムは使用時間制限があるため、長時間使用を続けると、一定期間(半日 程度)GPU ランタイムが使用できなくなります。 ▪ これを避けるために、GPU ランタイムを使用するノートブックは、実行が終わったらす ぐに、「ランタイム」メニューの「ランタイムを接続解除して削除」で、ランタイムを 停止することをお勧めします。 6 Copyright (C) 2026 National Institute of Informatics, All rights reserved.
  5. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter01/1. Least squares method with

    low-level API.ipynb 8 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 8
  6. 例題:最小二乗法による気温予測 ▪ トレーニングデータ:昨年1月〜12月の平均気温 ▪ 問題:今年の1月〜12月の平均気温を予測するモデルを作成 ▪ 方針:過去データにフィットする多項式を決定して、予測モデルとする。 バイアス ウェイト ▪

    最小二乗法 - 次の「二乗誤差」を最小にするように パラメーター(ウェイトとバイアス) を決定する。 9 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 9
  7. 勾配降下法と学習率 ① ③ ① ③ ② パラメーターが収束 ③ パラメーターが発散 ②

    ① 勾配降下法では、勾配ベクトルの反対 方向にパラメーターを繰り返し修正す ることで、誤差関数を最小にします。 ▪ この際、学習率 ε の値により、パラ メーターの変化の様子が変わります。 ▪ 11 2025/05/18 ② ③ ① ② Copyright (C) 2026 National Institute of Informatics, All rights reserved. 11
  8. TensorFlow のプログラミングモデル ▪ TensorFlow で扱うデータは、すべて「多次元リスト」で表現します。 - 多くの場合、2次元リスト(すなわち「行列」)を使用します。そのため、与えられ た関係式(数式)を行列形式で表現すると、自然に TensorFlow のコードに変換する

    ことができます。 ▪ 例として、下記のモデル(数式)を TensorFlow のコードで記述してみます。 - この時、次の3種類の違いを意識して、コードを書くことに注意してください。 • トレーニングデータを保存した変数 • チューニング対象のパラメーター(Variable) • これらを組み合わせた計算式 12 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 12
  9. TensorFlowのプログラミングモデル ▪ ▪ 予測値を計算する4次多項式を次のように、行列形式で表します。 ただし、 には、トレーニングデータ るので、一般にはさまざまな値が入ります。 を代入す - TensorFlow

    で学習処理を行う際は、複数のデータをまとめて代入して計算します。 について - そこで、 すると、次の関係式が成り立ちます。 の値を縦に並べた行列を用意 13 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 13
  10. TensorFlow(low-level API)による記述例 ▪ この関係を TensorFlow のコードで表現すると次になります。 トレーニングセットのデータを まとめて保存した変数 最適化対象のパラメーターは Variable

    として定義 (ここでは初期値を0に設定) train_x = np.array(...) w = tf.Variable(tf.zeros([5, 1])) y = lambda x, w: tf.matmul(x, w) 後ほど train_x を代入 14 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 14
  11. 誤差関数とトレーニングアルゴリズムの指定 ▪ トレーニングセットを用いた学習処理を実施するには、誤差関数を定義し て、勾配降下法を適用する関数が必要です。 train_t = np.array(...) loss = lambda

    x, w, t: tf.reduce_sum(tf.square(y(x, w) - t)) optimizer = tf.keras.optimizers.Adam() @tf.function 勾配降下法による def train_step(x, w, t): パラメーターの修正を with tf.GradientTape() as tape: 1回だけ実施する関数 loss_val = loss(x, w, t) grads = tape.gradient(loss_val, [w]) optimizer.apply_gradients(zip(grads, [w])) return loss_val 15 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 15
  12. 勾配降下法の繰り返し適用 ▪ この後は、勾配降下法を繰り返し適用して、パラメーターの最適化を行いま す。 i = 0 勾配降下法による最適化を実施 for _

    in range(100000): i += 1 loss_val = train_step(train_x, w, train_t) if i % 10000 == 0: print (f'Step: {i}, Loss: {loss_val}') 誤差関数の値を定期的に 表示して、学習の進捗を確認 Step: 10000, Loss: 31.0147705078125 Step: 20000, Loss: 29.293682098388672 Step: 30000, Loss: 28.025081634521484 Step: 40000, Loss: 26.85442543029785 Step: 50000, Loss: 31.778268814086914 Step: 60000, Loss: 24.765493392944336 Step: 70000, Loss: 23.83963394165039 Step: 80000, Loss: 22.977985382080078 Step: 90000, Loss: 22.173564910888672 Step: 100000, Loss: 21.43476104736328 実際の出力例 16 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 16
  13. Keras によるモデルの定義例 ▪ Low-level API によるモデルの記述を Keras で書き直すと次のようになります。 - Low-level

    API w = tf.Variable(tf.zeros([5, 1])) y = lambda x, w: tf.matmul(x, w) - Keras model = models.Sequential(name='regression_model') model.add(layers.Input(shape=(4,), name='input')) model.add(layers.Dense(1, name='polynomial')) 19 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 19
  14. Keras によるモデルの定義例 ▪ 各パートの意味は次のようになります。 - Layers.Input:入力レイヤーを用意します。 - shape=(4,) : 入力データは

    • という形式の1次元リストです。 一般には多次元リストになるの (24,24,3) のようにタプルで指定します。 - layers.Dense : 「1次関数+活性化関数」の計算式を表すノードを用意します。 • 計算式に含まれるウェイトは、自動的に Variables として用意されます。 • この例では活性化関数は用いていません。 - 1 : ノードを1つだけ使用します。 model = models.Sequential(name='regression_model') model.add(layers.Input(shape=(4,), name='input')) model.add(layers.Dense(1, name='polynomial')) 20 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 20
  15. 誤差関数とトレーニングアルゴリズムの指定 ▪ Low-level API による誤差関数とトレーニングアルゴリズムの指定を Keras で 書き直すと次のようになります。 - Low-level

    API loss = lambda x, w, t: tf.reduce_sum(tf.square(y(x, w) - t)) optimizer = tf.keras.optimizers.Adam() @tf.function def train_step(x, w, t): ... - Keras model.compile(optimizer='adam', loss='mse') トレーニングアルゴリズムに Adam Optimizer を使用 誤差関数に平均二乗誤差 (Mean Squares Error)を使用 21 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 21
  16. Keras による学習処理 ▪ コンパイル済みのモデルについて、fit メソッドを呼び出すと、トレーニン グループが実行されます。 - トレーニングデータは、batch_size で指定したサイズのバッチに自動で分割され ます(バッチトレーニングの詳細は後で説明)。

    - 全データセットを用いる処理を1エポックとして、エポック数でトレーニングの長さ を指定します。 - トレーニングの情報(誤差関数の変化など)を含むオブジェクトが返り値として得ら れます。 history = model.fit(train_x, train_t, batch_size=12, epochs=10) この例ではバッチサイズとトレーニング データ数は一致しており、実際には、 バッチトレーニングになっていません。 モデルに入力する トレーニングデータ 正解ラベル 22 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 22
  17. 線形判別法の例題 ▪ 学習に使用するデータ(トレーニングセット) - (x, y) 平面上の N 個のデータポイント トレーニングセットと

    判別直線の例 - データポイントは、2タイプに分かれて おり、 ▪ にラベル付けされている。 解くべき問題 - 2タイプのデータを分割する直線を求める。 - きれいに分割できない場合は、何らかの意味 で「最善」の分割を与える。 •:t = 1 ×:t = 0 25 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 25
  18. ロジスティック回帰の考え方 ▪ ▪ ▪ •:t = 1 ×:t = 0

    ロジスティック回帰では、分割線を 次式で与えます。 パラメータ を決定するた めに「最尤推定」を用います。 つまり、あるデータが得られる「確 率」を決めて、トレーニングセット が得られる確率を最大にします。 y x 26 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 26
  19. ロジスティック関数による確率 ▪ ▪ ▪ 点 (x, y) で新たに取得したデータが「t = 1」

    である確率を P(x, y) とします。 •:t = 1 ×:t = 0 右図において分割線から右上に進むと P は大 きくなり、左下に進むと P は小さくなると考 えられます。 そこでこの確率を次式で定義します。 :ロジスティック関数 (シグモイド関数) - σ(a) は、右図のように 0 から 1 になめらかに増 加する関数です。 の分割線上では、確率はちょうど 27 0.5 になります。 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 27
  20. ロジスティック回帰における尤度関数 ▪ 前ページで定義した確率 を元にして、トレーニングセット が得られる確率を計算してみます。 - 点 から のデータが得られた場合、それが起きる確率は: -

    点 から のデータが得られた場合、それが起きる確率は: - これら2つは、(技巧的ですが)次のように1つの式にまとめられます。 ▪ 従って、トレーニングセットが得られる確率(尤度関数)は次式になります。 28 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 28
  21. 勾配降下法によるパラメーターの最適化 ▪ 次式で誤算関数 E を定義すると、「確率 P 最大 ⇔ 誤差関数 E

    最小」が成り 立ちます。 - 上記の誤差関数を「クロスエントロピー」(より正確には「バイナリー・クロスエ ントロピー」)と呼びます。 x 最大 ⇔ y 最大 ※ 対数関数の性質 29 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 29
  22. Keras による実装例 ▪ この予測モデル(1次関数+シグモイド関数)を Keras で実装すると、次の ようになります。 - activation には、1次関数の後に適用する活性化関数を指定します。

    model = models.Sequential(name='logistic_regression_model') model.add(layers.Input(shape=(2,), name='input')) model.add(layers.Dense(1, activation='sigmoid', name='sigmoid')) 活性化関数 30 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 30
  23. Keras による実装例 ▪ 最適化アルゴリズムと誤差関数の指定は、次のようになります。 - loss : パラメーターの最適化に使用する誤差関数。 - metrics

    : エポックごとにモデルの性能を評価する指標。この例では、予測の正解 率(Accuracy)を指定。 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc']) 31 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 31
  24. 練習問題 ▪ Neural Network Playground を用いて、勾配降下法による学習の様子を観察 してください。 - 特にノイズ(Noise)の大きなデータに対して、学習率(Learning Rate)を大きく

    設定するとどうなるでしょうか? ▪ Neural Network Playground - https://goo.gl/nYYRjR 32 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 32
  25. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter02/4. MNIST softmax estimation.ipynb ▪

    また、次のノートブックを参照して、MNIST データセットの利用方法を確認 しておいてください。 - Chapter02/3. MNIST dataset sample.ipynb 34 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 34
  26. 誤差関数の計算 ▪ n 番目のデータ の正解ラベルは、次の「One-hot 表現」で与えられます。 - 正解を k として、k

    番目の要素 ▪ のみが 1 になっています。 今のモデルでこのデータが得られる確率は れる確率は次式になります。 なので、全データが得ら 正解 k の所のみ1になる ▪ 39 次式で誤算関数 E を定義すると、「確率 P 最大 ⇔ 誤差関数 E 最小」が成り 立ちます。 - この誤差関数を「カテゴリカル・クロスエントロピー」と呼びます。 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 39
  27. テストデータによるモデルの評価 ▪ 最適化アルゴリズム、誤差関数、評価指標の指定は、次のようになります。 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) ▪ トレーニングデータとは別の「テストデータ」を指定すると、評価指標の計 算は、テストデータに対して行われます。 -

    トレーニングデータに対する評価指標を見ていると、トレーニングデータには高い 正解率を示すにもかかわらず、その他のデータには正解率があがらない「過学習 (オーバーフィッティング)」の発生を見落とす危険性があります。 history = model.fit(train_images, train_labels, validation_data=(test_images, test_labels), batch_size=128, epochs=10) テストデータの指定 40 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 40
  28. バッチトレーニングによる確率的勾配降下法の適用 ▪ バッチトレーニングには、次の ようなメリットがあります。 - 1回の最適化処理に必要なメモ リー容量がおさえられます。 - 最小値に向かってランダムに最 適化が進むため、極小値にはま

    り込む可能性が低くなります。 最小値 画像データ 128個分のデータ …… …… ・・・ …… …… ・・・ ラベルデータ 1回目の修正 2回目の修正 最小値 極小値 最小値 すべてのデータを使用した バッチトレーニングによる 勾配降下法 確率的勾配降下法 41 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 41
  29. 練習問題 ▪ 次のノートブックの内容を変更して、「学習率」によるトレーニング結果の違いを確認 してください。 - Chapter02/4. MNIST softmax estimation.ipynb -

    勾配降下法のアルゴリズムは、[MSE-04] で指定されています。AdamOptimizer は、学習率(勾配ベクトルの逆方向にどの程度パラメーターを修正するか)を自動 調整するという特徴があります。 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) - このセルの内容を次のように変更すると、学習率を0.01に固定した単純な勾配降下 法が用いられます。この時、実行結果がどのように変わるか確認してください。 from keras import optimizers sgd = optimizers.SGD(lr=0.01) model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['acc']) 44 - 学習率を0.005、0.001などに変更した場合はどうでしょ うか? [MSE-05] でトレーニングを実行する際に、エポッ ク数を増やすなどの変更も試してください。 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 44
  30. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter03/1. Single layer network example.ipynb

    - Chapter03/2. Double layer network example.ipynb - Chapter03/3. MNIST single layer network.ipynb 46 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 46
  31. シンプルなニューラルネットワークの例 ▪ ▪ 平面上のデータを分類する、下記の線形分類器 をニューラルネットワークに拡張します。 シグモイド関数 最もシンプルな拡張例は次になります。 ハイパボリック タンジェント -

    隠れ層のノードは、1次関数の計算結果を「活性 化関数」で変換した値を出力します。 - 活性化関数には右図のようなものがあります。 ReLU 出力層 47 隠れ層 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 47
  32. シンプルなニューラルネットワークの例 ▪ ハイパボリックタンジェントは、-1 から 1 に急激に変化するので、隠れ層 のノードの出力は、1次関数が決定する直線の両側で、-1 と 1 に分かれる

    と考えられます。 - この例では、 平面は、4つの領域に分類されることになります。 ② ① ③ ④ 48 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 48
  33. (参考)MNIST へのニューラルネットワークの適用 ▪ 隠れ層が1層のニューラルネットワークで MNIST データセットを分類する場 合のモデルの定義例です。 - この例では、活性化関数に ReLU

    を持つ1024個のノードからの出力をソフトマック ス関数を用いた線形多項分類に入力しています。 model = models.Sequential(name='single_layer_network_model') model.add(layers.Input(shape=(28*28,), name='input')) model.add(layers.Dense(1024, activation='relu', name='hidden')) model.add(layers.Dense(10, activation='softmax', name='softmax')) ・ ・ ・ ・ ・ ・ ・ ・ ・ 線形多項分類器 55 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 55
  34. 練習問題 ▪ ▪ Neural Network Playground で、隠れ層やノードの数を変更して、結果がど のように変わるか観察してください。 次のノートブックの内容を変更して、隠れ層のノード数によるトレーニング結果の違い を確認してください。

    - Chapter03/2. MNIST single layer network.ipynb - 隠れ層のノード数は、[MSL-03] の以下の部分で指定されています。ノード数を 128, 512, 4096 などに変更して、結果がどのように変わるか観察してください。 model.add(layers.Dense(1024, activation='relu', name='hidden')) 56 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 56
  35. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter04/1. ORENIST convolutional filter example.ipynb

    - Chapter04/2. ORENIST classification example.ipynb 58 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 58
  36. エッジを抽出する畳み込みフィルター ▪ 右図は縦のエッジを抽出するフィ ルターの例です。 - 横に同じ色が続く部分は、左右の±が キャンセルして0になります。 - 計算した合計が負になる場合は絶対 値を取ります。

    ▪ フィルターのサイズを大きくする と、さらに太い幅でエッジを残し ます。 - 右図は、縦/横、それぞれのエッジ を抽出します。 - フィルターの値が大きいと色が濃く なる効果が入るため、実際には、全 体を23.0で割った値を使用します。 61 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 61
  37. TensorFlowにおけるフィルターの構造 ▪ TensorFlow のコード内で畳み込みフィルターを定義する際は、すべてのフィ ルターをまとめて、下記のサイズの多次元リストに格納します。 • 「縦✕横✕入力レイヤー数✕出力レイヤー数」 - カラー画像の場合、入力レイヤー数は、RGB の3種類になります。今はグレイスケー

    ル画像なので入力レイヤー数は1です。また、1枚の画像から2枚の画像を出力するの で、出力レイヤー数は2です。 縦/横のエッジを抽出する フィルターを定義する関数 def edge_filter(shape=None, dtype=None): filter0 = np.array( [[ 2, 1, 0,-1,-2], [ 3, 2, 0,-2,-3], [ 4, 3, 0,-3,-4], [ 3, 2, 0,-2,-3], [ 2, 1, 0,-1,-2]]) / 23.0 filter1 = np.array( [[ 2, 3, 4, 3, 2], [ 1, 2, 3, 2, 1], [ 0, 0, 0, 0, 0], [-1,-2,-3,-2,-1], [-2,-3,-4,-3,-2]]) / 23.0 それぞれのフィルターを 2次元リストとして用意 すべてのフィルターを格納 する多次元リストを用意 filter_array = np.zeros([5, 5, 1, 2]) filter_array[:, :, 0, 0] = filter0 filter_array[:, :, 0, 1] = filter1 65 該当部分にフィルターの値を格納 return filter_array 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 65
  38. 静的な畳み込みフィルターの適用例 ▪ 次は、事前に定義した畳み込みフィルターを適用するモデルの例です。 model = models.Sequential(name='edge_filter_model') model.add(layers.Input(shape=(28*28,), name='input')) model.add(layers.Reshape((28, 28,

    1), name='reshape')) model.add(layers.Conv2D(2, (5, 5), padding='same', kernel_initializer=edge_filter, use_bias=False, name='conv_filter')) model.add(layers.Lambda(lambda x: abs(x), name='abs')) model.add(layers.Lambda(lambda x: tf.keras.backend.relu(x-0.2), name='cut_off')) model.add(layers.MaxPooling2D((2, 2), name='max_pooling')) - name='reshape' : 入力データを 28×28 のリストに変換 - name='conv_filter' : 畳み込みフィルターを適用 • kernel_initializer : 先に定義したデータを用いてフィルターを初期化 • padding='same' : フィルターがはみ出る部分は0があるものと解釈する - name='abs' : 出力が画像データとして解釈できるように、負の値を正に変換 - name='cut_off' : カットオフを適用(この後で説明) - name='max_pooling' : プーリング層を適用 66 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 66
  39. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter04/3. ORENIST dynamic filter classification.ipynb

    - Chapter04/4. MNIST dynamic filter classification.ipynb - Chapter04/5. MNIST dynamic filter classification result.ipynb - Chapter05/1. MNIST double layer CNN classification.ipynb - Chapter05/2. Handwritten digit recognizer.ipynb 71 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 71
  40. 畳み込みフィルターの最適化 ▪ 一般の画像データの場合、どのようなフィルターが適切なのかは、すぐには分かりませ ん。そこで、フィルターを最適化対象のVariableにすることで、適切なフィルターその ものを学習させてしまいます。 - フィルターの初期値は乱数で設定します。 ▪ ORENIST データセットに対して、2種類のフィルターを動的に学習させた例です。

    - ORENIST データセットはデータ構造が単純なので、最適なフィルターでなくても十分な分類が できてしまいます。この例では、モデルに強い制限を入れることで上記の結果を得ています。 72 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 72
  41. 畳み込みフィルターの最適化 ▪ 前ページのフィルターは、次のモデルで学習しています。 model = models.Sequential(name='ORENIST_classification_model') model.add(layers.Input(shape=(28*28,), name='input')) model.add(layers.Reshape((28, 28,

    1), name='reshape')) model.add(layers.Conv2D(2, (5, 5), padding='same', use_bias=False, name='conv_filter')) model.add(layers.Lambda(lambda x: abs(x), name='abs')) model.add(layers.MaxPooling2D((28, 28), name='max_pooling')) model.add(layers.Flatten(name='flatten')) model.add(layers.Dense(3, activation='softmax', name='softmax')) - このモデルでは、プーリング層で画像サイズを1×1ピクセルまで縮小して、その結果をソフト マックス関数による線形多項分類器で分類しています。 畳み込みフィルター プーリング層 線形多項分類器 入力データ 73 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 73
  42. 動的フィルターによるMNISTデータセットの分類 ▪ 次は、MNIST データセットに16個のフィルターを適用する例になります。 model = models.Sequential(name='CNN_single_layer_model') model.add(layers.Input(shape=(28*28,), name='input')) model.add(layers.Reshape((28,

    28, 1), name='reshape')) model.add(layers.Conv2D(16, (5, 5), padding='same', use_bias=True, activation='relu', name='conv_filter')) model.add(layers.MaxPooling2D((2, 2), name='max_pooling')) model.add(layers.Flatten(name='flatten')) model.add(layers.Dense(1024, activation='relu', name='hidden')) model.add(layers.Dense(10, activation='softmax', name='softmax')) - 今の場合、畳み込みフィルターを適用する目的は、画像の特徴を抽出することであり、適用後の データが画像として解釈できる必要はありません。そのため、絶対値をとる操作は省略していま す。 75 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 75
  43. 畳み込みフィルターの学習例 ▪ 右図は動的に学習したフィルターの例です。 - 左端がフィルターで、右側はフィルターを適用 した画像の例です。 - カットオフの効果により、画像の大部分が白く なっていることがわかります。 ▪

    最上段の文字画像の代わりに、その下にある 16枚の画像を全結合層に入力することで、 より高精度な分類が可能になります。 77 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 77
  44. 畳み込みフィルターを適用するコード ▪ 1層目(畳み込みフィルター32個 + プーリング層)と2層目(畳み込み フィルター64個 + プーリング層)を適用する部分のコードです。 model =

    models.Sequential(name='CNN_double_layer_model') model.add(layers.Input(shape=(28*28,), name='input')) model.add(layers.Reshape((28, 28, 1), name='reshape')) model.add(layers.Conv2D(32, (5, 5), padding='same', use_bias=True, activation='relu', name='conv_filter1')) model.add(layers.MaxPooling2D((2, 2), name='max_pooling1')) model.add(layers.Conv2D(64, (5, 5), padding='same', use_bias=True, activation='relu', name='conv_filter2')) model.add(layers.MaxPooling2D((2, 2), name='max_pooling2')) 81 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 81
  45. 畳み込みフィルターを適用するコード ▪ 畳み込み層からの出力を全結合層(1024ノード)と線形多項分類器(ソフ トマックス関数)に入力するコードです。 model.add(layers.Flatten(name='flatten')) model.add(layers.Dense(1024, activation='relu', name='hidden')) model.add(layers.Dropout(rate=0.5, name='dropout'))

    model.add(layers.Dense(10, activation='softmax', name='softmax')) - 全結合層と線形多項分類器の間にドロップアウト層が入っています。 - ドロップアウト層は、一定の割合で全結合層からの入力を0にします。ここでは、学 習時に50%をドロップすることで、オーバーフィッティングを防止しています。 82 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 82
  46. (参考)アンサンブルモデルの効果 ・ ・ ・ ・ ・ ・ 接続の半分を ランダムにカットして 勾配ベクトルを計算

    仮に上半分と下半分を交互に カットしたとすると、二種類の モデルが交互に学習される layers.Dropout(rate=0.5, name='dropout') 入力 モデル① モデル② アンサンブルモデル 83 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 83
  47. 注意 ▪ このセクションで扱うコードの全体像は、次のノートブックを参照してくだ さい。 - Chapter05/3. CNN interpretation - image

    generation - Chapter05/4. CNN interpretation - sensitive area detection - Chapter05/5. MNIST autoencoder example 86 2025/05/18 Copyright (C) 2026 National Institute of Informatics, All rights reserved. 86