🧠 STEP 7: Kerasの基本API
Sequentialモデルでニューラルネットワークを構築する方法を学ぼう
📋 このステップで学ぶこと
- Sequentialモデルとは?モデルの構築方法
- Denseレイヤー(全結合層)の仕組みとパラメータ数
- compile():学習の設定方法
- fit():データを使った学習方法
- evaluate()とpredict():評価と予測
🎯 1. Sequentialモデルとは?
1-1. Sequentialモデルの基本概念
Sequential(シーケンシャル)モデルとは、層を順番に積み重ねる最もシンプルなモデル構築方法です。
「Sequential」は「順番の」「連続的な」という意味です。
Sequentialモデルは、ケーキの層を重ねるように作ります。
スポンジ(入力層)→ クリーム(隠れ層1)→ フルーツ(隠れ層2)→ トッピング(出力層)
下から上へ、1層ずつ順番に積み重ねるのがポイントです。
以下の図は横スクロールできます。
1-2. Sequentialモデルの作成方法
Kerasでは、Sequentialモデルを作成する方法が2つあります。
すべての層をリスト([ ])の中に書いて、一度に定義する方法です。
コードが簡潔で見やすいため、こちらが推奨されます。
空のモデルを作って、add()メソッドで層を1つずつ追加する方法です。
条件によって層を変えたい場合に便利です。
- シンプル:直感的で理解しやすい
- 1入力1出力:入力が1つ、出力が1つの構造
- 制限:分岐や複数入力/出力が必要な場合は使えない
(その場合はFunctional APIを使う)
🔗 2. Denseレイヤー(全結合層)
2-1. Denseレイヤーとは?
Dense(デンス)レイヤーは、全結合層(Fully Connected Layer)とも呼ばれます。
「Dense」は「密集した」という意味で、前の層のすべてのユニットと、次の層のすべてのユニットがすべて接続されています。
以下の図は横スクロールできます。
2-2. Denseレイヤーのパラメータ
layers.Dense(units, activation, input_shape)
| パラメータ | 説明 | 例 |
|---|---|---|
| units | ユニット数(ニューロンの数) | 64, 32, 10 など |
| activation | 活性化関数 | ‘relu’, ‘sigmoid’, ‘softmax’ |
| input_shape | 入力データの形状(最初の層のみ) | (10,), (784,) など |
layers.Dense(64, activation=’relu’, input_shape=(10,))
・64 → このレイヤーのユニット数は64個
・activation=’relu’ → ReLU活性化関数を使う
・input_shape=(10,) → 入力は10次元のデータ
2-3. パラメータ数の計算
Denseレイヤーのパラメータ数は、重みとバイアスの合計です。
パラメータ数 = (入力次元 × ユニット数) + ユニット数
= 重みの数 + バイアスの数
重みの数 = 10 × 64 = 640
バイアスの数 = 64
パラメータ数 = 640 + 64 = 704
2-4. model.summary()で構造を確認
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 64) 704
dense_1 (Dense) (None, 32) 2080
dense_2 (Dense) (None, 1) 33
=================================================================
Total params: 2,817
Trainable params: 2,817
Non-trainable params: 0
_________________________________________________________________
第1層(dense):704パラメータ
入力10次元 × 64ユニット + 64バイアス = 10×64 + 64 = 704
第2層(dense_1):2,080パラメータ
入力64次元 × 32ユニット + 32バイアス = 64×32 + 32 = 2,080
第3層(dense_2):33パラメータ
入力32次元 × 1ユニット + 1バイアス = 32×1 + 1 = 33
⚙️ 3. モデルのコンパイル(compile)
3-1. コンパイルとは?
モデルを構築した後、実際に学習を始める前に学習の設定を行う必要があります。
これがコンパイル(compile)です。
車(モデル)を作っただけでは走れません。
走る前に設定が必要です:
・どの道を走るか? → optimizer(最適化アルゴリズム)
・目的地との距離をどう測るか? → loss(損失関数)
・何を表示するか? → metrics(評価指標)
3-2. compile()の書き方
model.compile(
optimizer=’adam’, # 最適化アルゴリズム
loss=’binary_crossentropy’, # 損失関数
metrics=[‘accuracy’] # 評価指標
)
3-3. 各パラメータの詳細
損失を最小化するために、重みをどう更新するかを決めます。
- ‘adam’:最も一般的。迷ったらこれを使う
- ‘sgd’:シンプルな確率的勾配降下法
- ‘rmsprop’:RNNでよく使われる
予測と正解の「ずれ」をどう計算するかを決めます。
問題タイプによって使い分けます。
- ‘mse’:回帰問題(数値予測)
- ‘binary_crossentropy’:二値分類(2クラス)
- ‘categorical_crossentropy’:多クラス分類(3クラス以上)
- ‘sparse_categorical_crossentropy’:多クラス分類(ラベルが整数)
学習中に表示する指標を決めます。リスト形式で複数指定可能。
- ‘accuracy’:正解率(分類問題で使用)
- ‘mae’:平均絶対誤差(回帰問題で使用)
- ‘mse’:平均二乗誤差
3-4. 問題タイプ別の設定例
- どう最適化するか → optimizer(基本は’adam’)
- 何を最小化するか → loss(問題タイプで決まる)
- 何を監視するか → metrics(accuracyなど)
🎓 4. モデルの訓練(fit)
4-1. fit()メソッドとは?
モデルをコンパイルしたら、データを使って学習します。
これがfit(フィット)メソッドです。「fit」は「合わせる」「適合させる」という意味です。
history = model.fit(
x, # 訓練データ
y, # 正解ラベル
batch_size=32, # バッチサイズ
epochs=10, # エポック数
validation_split=0.2, # 検証データの割合
verbose=1 # 表示レベル
)
4-2. エポック(epoch)とバッチ(batch)を理解する
1000ページの教科書を勉強するとします。
- バッチ(batch):一度に読むページ数(例:32ページずつ)
- エポック(epoch):教科書全体を何回読むか(例:10回)
1エポックあたりのステップ数 = 1000 ÷ 32 ≈ 32ステップ
全ステップ数 = 32ステップ × 10エポック = 320ステップ
→ 32サンプルずつ処理して、全データを10回繰り返し学習
4-3. 各パラメータの詳細
| パラメータ | 説明 | 推奨値 |
|---|---|---|
| x, y | 訓練データと正解ラベル | NumPy配列 |
| batch_size | 一度に処理するデータ数 | 32(メモリ不足なら16や8) |
| epochs | 全データを何回学習するか | 10〜100(様子を見て調整) |
| validation_split | 検証用に使うデータの割合 | 0.2(20%) |
| verbose | 表示レベル(0:なし、1:プログレスバー、2:行ごと) | 1 |
4-4. 実装例
np.random.random((1000, 10))
0〜1のランダムな値で、1000サンプル×10次元のダミーデータを作成。
np.random.randint(2, size=(1000, 1))
0または1のランダムな整数で、1000個のラベルを作成(二値分類用)。
validation_split=0.2
データの20%(200サンプル)を検証用に分け、残り80%(800サンプル)で学習。
Epoch 1/10 25/25 [==============================] - 1s 12ms/step - loss: 0.6932 - accuracy: 0.5000 - val_loss: 0.6931 - val_accuracy: 0.5050 Epoch 2/10 25/25 [==============================] - 0s 3ms/step - loss: 0.6930 - accuracy: 0.5062 - val_loss: 0.6929 - val_accuracy: 0.5100 ... Epoch 10/10 25/25 [==============================] - 0s 3ms/step - loss: 0.6915 - accuracy: 0.5387 - val_loss: 0.6912 - val_accuracy: 0.5400
- 25/25:800サンプル ÷ 32バッチ ≈ 25ステップ
- loss:訓練データでの損失
- accuracy:訓練データでの正解率
- val_loss:検証データでの損失
- val_accuracy:検証データでの正解率
4-5. historyオブジェクトの活用
fit()の戻り値historyには、学習の履歴が保存されています。
これを使ってグラフを描くことができます。
📊 5. モデルの評価(evaluate)と予測(predict)
5-1. evaluate():モデルの評価
学習が終わったら、テストデータでモデルの性能を評価します。
evaluate()は、損失と評価指標を返します。
テスト損失: 0.6920 テスト精度: 0.5200
訓練データでの精度が高くても、見たことのないデータで良い結果が出るとは限りません。
テストデータは学習に使っていないため、モデルの本当の性能を測ることができます。
5-2. predict():予測
新しいデータに対して予測を行います。
predict()は、各サンプルの予測値(確率など)を返します。
予測確率: [[0.4892] [0.5103] [0.4756] [0.5234] [0.4889]] 予測クラス: [[0] [1] [0] [1] [0]]
・予測確率 0.4892 → 50%未満なので クラス0
・予測確率 0.5103 → 50%以上なので クラス1
・予測確率 0.5234 → 50%以上なので クラス1
閾値(しきい値)は通常0.5ですが、目的によって変更することもあります。
5-3. evaluate()とpredict()の違い
| メソッド | 目的 | 必要なもの | 戻り値 |
|---|---|---|---|
| evaluate() | モデルの性能評価 | データ + 正解ラベル | 損失、評価指標 |
| predict() | 新しいデータの予測 | データのみ | 予測値(確率など) |
5-4. 完全な実装例(まとめ)
テスト精度: 0.5150 予測確率: 0.4823 予測クラス: クラス0
📝 STEP 7 のまとめ
- Sequentialモデルは層を順番に積み重ねる最もシンプルな方法
- Denseレイヤーは全結合層で、最も基本的なレイヤー
- パラメータ数 = (入力次元 × ユニット数) + ユニット数
- compile()で最適化手法、損失関数、評価指標を設定
- fit()でデータを使って学習し、historyで履歴を保存
- evaluate()で評価、predict()で予測
この流れを覚えれば、ほとんどのニューラルネットワークを実装できます!
- 構築:Sequential() + Dense() でモデルを作成
- コンパイル:compile() で学習設定
- 訓練:fit() でデータから学習
- 評価:evaluate() で性能評価
- 予測:predict() で新しいデータを予測
次のSTEP 8では、実際にMNISTデータセットを使って、
手書き数字認識のニューラルネットワークを実装しましょう!
📝 練習問題
Sequentialモデル
Sequentialモデルについて正しいものを選んでください。
- A. 複数の入力を持つモデルに最適
- B. 層を順番に積み重ねるシンプルなモデル
- C. 分岐構造を持つモデルに最適
- D. Kerasでは使われなくなった古い方法
なぜBが正解なのか?
Sequentialモデルは、「Sequential(順番の)」という名前の通り、
層を順番に積み重ねる最もシンプルなモデル構築方法です。
他の選択肢の解説:
A、Cが間違い:複数入力や分岐構造には、Functional APIを使います。
Dが間違い:Sequentialは今でも広く使われる標準的な方法です。
Denseレイヤーのパラメータ数
入力が10次元、Denseレイヤーのユニット数が5のとき、パラメータ数はいくつですか?
- A. 50
- B. 55
- C. 15
- D. 5
パラメータ数の計算方法
Denseレイヤーのパラメータは重みとバイアスで構成されます。
なぜバイアスはユニット数分あるのか?
各ユニット(ニューロン)に1つずつバイアス項があるからです。
5ユニットなら、バイアスも5つです。
compile()の設定
住宅価格を予測する回帰問題で、compile()の設定として最も適切なものを選んでください。
- A. optimizer=’adam’, loss=’mse’, metrics=[‘mae’]
- B. optimizer=’adam’, loss=’binary_crossentropy’, metrics=[‘accuracy’]
- C. optimizer=’adam’, loss=’categorical_crossentropy’, metrics=[‘accuracy’]
- D. optimizer=’sgd’, loss=’hinge’, metrics=[‘precision’]
なぜAが正解なのか?
住宅価格予測は回帰問題(数値を予測する問題)です。
回帰問題には以下の設定が適切です。
問題タイプ別の設定チート表:
他の選択肢の解説:
Bが間違い:binary_crossentropyは二値分類用です。
Cが間違い:categorical_crossentropyは多クラス分類用です。
batch_sizeの役割
fit()メソッドのbatch_sizeについて正しいものを選んでください。
- A. 学習するエポック数を決める
- B. 一度に処理するデータの数を決める
- C. 検証データの割合を決める
- D. モデルの層数を決める
batch_sizeとは?
batch_sizeは、一度にGPUで処理するデータの数です。
メモリ不足時の対処:
batch_size=32でメモリ不足 → 16 → 8 と半分ずつ減らす
他の選択肢の解説:
Aが間違い:エポック数は epochs パラメータで決めます。
Cが間違い:検証データの割合は validation_split で決めます。
Dが間違い:層数はモデル構築時(Sequential)で決めます。
predict()の出力
3クラス分類(猫、犬、鳥)で、model.predict()の出力が
[[0.7, 0.2, 0.1]] だった場合、正しい解釈を選んでください。
- A. 猫が70個、犬が20個、鳥が10個
- B. 猫の確率70%、犬の確率20%、鳥の確率10%
- C. エラー(確率の合計が1でない)
- D. クラス0が正解、クラス1とクラス2は不正解
多クラス分類の出力を理解しよう
多クラス分類では、出力層にSoftmax活性化関数を使います。
Softmaxは、出力を確率分布(合計1.0)に変換します。
予測クラスの取得方法:
他の選択肢の解説:
Aが間違い:個数ではなく確率です。
Cが間違い:0.7 + 0.2 + 0.1 = 1.0 なので正常です。
Dが間違い:正解かどうかは、実際のラベルと比較しないとわかりません。
学習メモ
ディープラーニング基礎 - Step 7