Translate

#78 レイヤーの設定

データの前処理が終わり、分析するデータが用意できたところで、今度は、モデルを作っていきます。



Section1で解説したように、多数の層からなるニューラルネットワークの学習のことをディープラーニングと呼び、入力層、隠れ層(中間層)、出力層をレイヤーと呼びます。ディープラーニングのモデルを作るにあたって、まずは、これらのレイヤーを設計、構築することが必要となります。



今回の体験するコードは、下記のスライドのように、①layersモジュールを取り込み、②データを順番に流す処理、③様々な種類を使ったレイヤーの構築を行うものとなります。順を追って、説明していきます。




① from keras import layers

何度も出てきたモジュールのインポート処理です。このTensorFlow公式サイトのチュートリアル『はじめてのニューラルネットワーク:分類問題の初歩』では、layersモジュールの取り込みを行っていないため、コードが、長くなっています(青字を付け加えなくてはなりません…)。

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10)
])


② model = keras.Sequential()

今回のチュートリアルでは、『Sequential Model』を作成します。

ディープラーニングのモデルは、レイヤーで構成されており、各レイヤーは前のレイヤーからの入力を受け取り、出力を生成します。 Sequential Modelは、レイヤーを一直線に繋げて構成されるもっとも単純なモデルであり、一つの入力から一つの出力を生成することができます。

( )内は、[ ]を付け、選択したレイヤーをカンマで区切って順番に並べていきます。

例えば、今回のチュートリアルのような画像分類の問題では、画像を入力とし、それがどのクラスに属するかを出力することができます。

Kerasには、『Sequential Model』の他にも、『Functional Model』が用意されており、分岐・並列・スキップなど自由にモデル構造を構築できます。イメージが湧きにくいのですが、実際のコードの例が下記の参考資料に掲載されていますので、興味のある方はGO!

【参考】 【Tensorflow Keras】Sequential APIとFunctional API                 https://qiita.com/ktdatascience/items/ce18618ed82872ac3d93

③ a)  layers.Input(shape=(28, 28)), 
  b)  layers.Flatten(),
  c)  layers.Dense(128, activation='relu’),
  d)  layers.Dense(10)

a)layers.Input(shape=(28, 28)), 

a) は、入力層を表現しているコードです。

入力層は、モデルが想定するデータの形状と種類を設定します。入力層自体は処理を行いませんが、画像のサイズやデータセット内の特徴量の数など、モデルが受け取る入力の種類を指示します。これにより、後続のすべてのレイヤーがデータを適切に処理できるようになり、ディープラーニングにおいて重要な役割を担います。

Keras 3では「入力のカタチは最初に Input() で宣言する」というルールに統一されつつあります。こちらの方が、後からモデルの構造を model.summary() で確認する際にもエラーが起きにくく確実です。

b) layers.Flatten()

b) によって、多次元配列を1次元の配列に変換する事ができます。

学習するデータは、縦と横の2次元配列(28×28)ですが、多くの機械学習モデルは1次元のデータが必要となってきます。これを解決するために使用するレイヤーです。これで、入力値として28×28の画像を一次元の784ピクセルデータで渡す事ができます。

c) layers.Dense(128, activation='relu’)

c) Denseは、ニューラルネットワークで前の層のすべてのノードと次の層のすべてのノードを繋ぐ基本の層です。データを受け取り、重みとバイアスで計算をして次へ送ります。

( )内の『128』は、128個のニューロンで画像の特徴を分析するように指定しています。この128という数値には厳密な根拠はなく経験則で決めたものと思われますが。いい感じに画像を分類してくれます。まずは 128 のような定番の数字でモデルを作り、後から精度を見ながら 64 や 256 に増減させてチューニングする」というのが、AIエンジニアの日常的な開発手順になります。

『activation='relu’』は、活性化関数として、ReLU関数を使用するように指定しています。ReLU関数とは、入力が0以下の場合に0を出力し、入力が0より大きい場合はそのままの値を出力する関数です。

d) layers.Dense(10)

d) によって、10個の出力がされていますが、これはロジット(Logits)と呼ばれるもので、各クラスの生の評価スコアです。

一応、[Tシャツ: -2.1, ズボン: -0.5, ..., スニーカー: 3.2, アンクルブーツ: 8.5]のように、その画像が各クラスに属する数値を計算したものが算出されているのですが、数値はマイナスから大きなプラスで、確率ではありません。

この数値を10個のクラスの合計値が100%になるように確率に変換しているのは Softmax関数です。実際に『layers.Dense(10, activation=‘softmax’)』とすれば、確率を出力することができます。しかし、コンピュータで小数点以下の計算をするとき、Softmaxの計算と損失の計算を別々に行うと、数値が小さくなりすぎて計算エラー(丸め誤差)が起きやすくなります。

次のSectionで体験するモデルの学習時では『from_logits=True』を使っています。これは、「モデルからは生のスコア(ロジット)が出てくるから、損失(誤差)を計算するときに、内部で一緒にSoftmax変換もやっておいてね!」という指示です。丸め誤差を防ぐために、公式チュートリアルでは、このような方法を取っています。

*************

一般的には『中間層(隠れ層)が2層以上』重なっているネットワークをディープラーニングと呼びます。

この公式チュートリアルでは、中間層(隠れ層)が一つしかありませんので、厳密にはディープラーニングということはできません。

しかし、使われている技術(TensorFlow/Kerasフレームワーク、活性化関数 ReLU、バックプロパゲーションによる重み更新、オプティマイザ Adam など)は、ディープラーニングとまったく同じ仕組みで動作しています。

最初から何十層もある本物のディープネットワークを書くと、コードが複雑になり、CPU/GPUでの計算時間もかかってしまいます。初学者が「データの入力 → 隠れ層での処理 → 出力 → 学習(fit)」という一連の流れを数秒で体験・理解してもらうため、この公式チュートリアルでは最小限のサンプルとして用意されています。


*************

★今回、体験したコード

# レイヤーの設定
from keras import layers
model = keras.Sequential([
    layers.Input(shape=(28, 28)),  # Keras 3推奨:最初に入力シェイプを独立して定義
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(10)
])

コメント