Dense層って何?畳み込みとの違いを解説

投稿日:2025年6月26日木曜日 最終更新日:

Dense Google Colab Keras

X f B! P L
アイキャッチ画像 Dense層って何?畳み込みとの違いを解説

はじめに:Dense層とは?

  ディープラーニングのモデル構造は、さまざまな種類の「層(レイヤー)」で構成されています。   その中でも特に基本的かつ重要なのが、Dense層(全結合層)です。
  この記事では、Dense層の働きや仕組みを丁寧に解説するとともに、画像認識でよく使われる畳み込み層(Conv層)との違いについてもわかりやすく説明します。


Dense層の仕組み

  Dense層とは、全ての入力ノードが全ての出力ノードに接続されている構造を持つ層のことです。このため、「全結合層」とも呼ばれます。
  たとえば、入力が3個・出力が2個あれば、3×2=6個の重みが必要となり、これらが学習の対象になります。
  Dense層の計算は、次のシンプルな数式で表されます: 

出力 = 活性化関数(入力ベクトル × 重み行列 + バイアス)

    この計算では、入力値と重みを掛けた合計にバイアスを加え、最後に活性化関数(ReLUやSigmoidなど)を適用します。
  この一連の処理により、ニューラルネットワークは非線形な複雑な関係性を学習することが可能になります。

  以下の図は、Dense層を含むニューラルネットワークの全体構造を示したものです。

Dense層の図

図解:Dense(全結合)層の役割

  上記の図には、入力層・中間層(隠れ層)・出力層という、ニューラルネットワークの基本構造が描かれています。   この中で、中央のノード群がDense層に該当します。   以下では、それぞれの層が担う役割を、順を追って見ていきましょう。 

1. 入力層(Input Layer)

  図の一番左にあるノード群が入力層です。画像認識の場合は、各ピクセルの値(0〜255)を1つずつこの層に入力します。   たとえば28×28ピクセルの画像なら、合計784個の入力ノードになります。 

2. 中間層(隠れ層 / Hidden Layers)

  図の中央にあるノードが「隠れ層(Dense層)」です。   Dense層の最大の特徴は、前の層のすべてのノードとつながっている点です。

     
  • 各ノードが前層すべての出力を受け取り、重みをかけて合計します。
  •  
  • 合計値に活性化関数を適用し、非線形な変換を行います。
  •  
  • この処理により、データに潜む「特徴の組み合わせ」や「関係性」を学習できます。

3. 出力層(Output Layer)

  右端のノード群が出力層です。手書き数字の分類であれば、0〜9までの10クラスを予測するため、出力ノードは10個になります。   それぞれのノードが「その数字である確率」を表します。

Dense層の主な役割

  Dense層は、Conv層などで抽出された特徴をもとに、最終的な分類や判断を下す層として使われることが多いです。

     
  • Conv層: 特徴を抽出する(目・口・線など、局所的な情報)
  •  
  • Dense層: 抽出された特徴全体をもとにクラスを分類する(最終判断)

  つまり、Dense層はニューラルネットワークにおける「最終判断の頭脳」といえる重要な部分なのです。 

図から読み取れるポイント

     
  • すべてのノードが前の層と接続されている → 全結合
  •  
  • シンプルな図だが、ニューラルネットワークの基本構造をよく表している

畳み込み層(Conv層)との違い

  Dense層と並んでディープラーニングで必須となるのが「畳み込み層(Conv層)」です。特に画像処理ではConv層が特徴抽出の主役を担います。
  ここでは、両者の違いを表にまとめて比較してみましょう。

                                                                 
項目Dense層畳み込み層(Conv層)
接続方式すべての入力とすべての出力がつながる(全結合)カーネル(小さなフィルタ)で画像の一部分ずつ見る(局所結合)
主な用途最終的な判断・分類(出力層)画像などから特徴を抽出(入力〜中間層)
パラメータ数多い(全てのノードが接続されるため)少ない(カーネルを使い回すため)

  Conv層は計算量を抑えつつ効果的な特徴抽出が可能であり、Dense層は抽出された特徴全体をもとに最終的な意思決定を行うため、役割が大きく異なります。

Dense層のKerasでの使い方

  画像分類モデルでは、Conv層で画像から特徴を抽出したあと、Flatten層でデータを1次元に変換し、Dense層で分類を行うのが一般的です。   以下はKerasでよく使われるDense層の実装例です。

# Kerasでの典型的なDense層の使い方
from tensorflow.keras import layers

x = layers.Flatten()(conv_output)
x = layers.Dense(64, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)

  このように、Dense層はモデルの最後に配置されることが多く、出力を決定する重要な役割を持っています。

  しかし、Dense層を設計する上で、ノード数を無計画に増やしてしまうと、意図せずモデルが肥大化し、学習時間が長引いたり、過学習を引き起こしたりするリスクがあります。
  次の章では、モデルの肥大化を防ぎ、効率的な設計を行うために、Kerasの model.summary() で表示される「Param \# (パラメータ数)」がどのように決まるのかを詳しく検証します。

Dense層の「Param \#」はどのように計算されているか?

  Dense層の設計において、最も具体的にモデルの大きさを把握できるのが、パラメータ数(Param #)です。この数値が、モデルの学習能力や、実行環境のメモリに直接影響します。

  Kerasの model.summary() で表示される Param # は、その層が学習する重み(Weight)とバイアス(Bias)の総数を示しています。これはモデルの「記憶容量」であり、この計算過程を理解することが設計の第一歩です。

Dense層のパラメータ数に関する情報

                                                                   
計算要素意味
重み (Weights)前の層のノード数 × 現在の層のノード数
バイアス (Biases)現在の層のノード数

Param #の計算式

  Param # = (前の層のノード数 × 現在の層のノード数) + 現在の層のノード数

具体例:

前の層のノード数が 4、現在のDense層のノード数(units)が 3 の場合:

  1. 重みの総数: 4 × 3 = 12
  2. バイアスの総数: 3
  3. Param #: 12 + 3 = 15
前の層が4で、Dense層が3の場合

この Param # が、あなたのPCやGPUのメモリ使用量に直結します。

独自の検証:層の設計パターンによる違い

  ノード数や層の深さが具体的にどうモデルに影響するのかを把握するため、シンプルなモデル構造の違いを比較検証します。MNISTデータセット(入力サイズ 784)を例として、Dense層を組み替えた際の model.summary() の結果を詳細に見ていきます。

パターンA: シンプルな単層モデル

# パターンA: Dense層1つ
import tensorflow as tf
from tensorflow import keras

model_A = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(28, 28)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(units=128, activation='relu'), # 中間層
    tf.keras.layers.Dense(units=10, activation='softmax') # 出力層
])
model_A.summary()

パターンA: summary結果

Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ flatten (Flatten)               │ (None, 784)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense)                   │ (None, 128)            │       100,480 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense)                 │ (None, 10)             │         1,290 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 101,770 (397.54 KB)
 Trainable params: 101,770 (397.54 KB)
 Non-trainable params: 0 (0.00 B)

パターンA: 考察

層の数は少なく、パラメータも 約10万個 と最小限に抑えられています。迅速な学習には向きますが、複雑な特徴の抽出能力は低くなります。

パターンB: 階層を深くしたモデル

# パターンB: Dense層を増やしたモデル
model_B = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(28, 28)),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(units=128, activation='relu'),
    tf.keras.layers.Dense(units=64, activation='relu'), # 追加
    tf.keras.layers.Dense(units=32, activation='relu'), # 追加
    tf.keras.layers.Dense(units=10, activation='softmax')
])
model_B.summary()

パターンB: summary結果

Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                    ┃ Output Shape           ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ flatten_1 (Flatten)             │ (None, 784)            │             0 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense)                 │ (None, 128)            │       100,480 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_3 (Dense)                 │ (None, 64)             │         8,256 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_4 (Dense)                 │ (None, 32)             │         2,080 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_5 (Dense)                 │ (None, 10)             │           330 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
 Total params: 111,146 (434.16 KB)
 Trainable params: 111,146 (434.16 KB)
 Non-trainable params: 0 (0.00 B)

パターンB: 考察

層が深くなったことで、中間層のパラメータ総数はパターンAと大差ありませんが、モデルはより複雑な特徴を段階的に学習できるようになります。ただし、勾配消失学習時間の増加のリスクも増大します。


まとめ:Dense層の設計で迷ったときのチェックリスト

Dense層の設計に絶対的な正解はありませんが、迷った際は以下の3つのステップで決定してください。

     
  1. 入力の理解: 最初のDense層は、入力層からどれだけの情報を引き継ぐか(input_shape)を明確に意識する。
  2.  
  3. パラメータの総量チェック: model.summary()Total paramsを確認し、モデルが大きすぎないか(過学習リスク、メモリ不足リスク)をチェックする。(独自考察) MNISTのような単純なタスクでは、10万〜20万個程度のパラメータで十分な精度が出ることが多いです。
  4.  
  5. 収束を監視: 層を深くすることは素晴らしいですが、必ずEarlyStoppingを使って学習を監視し、学習が停滞したら層を減らす勇気を持つこと。

Dense層を含むモデル設計では、lossval_loss の 挙動を見て過学習を判断することが重要です。 詳しくは Kerasでlossが下がらない時のチェックリスト で解説しています。

まとめ

  Dense層(全結合層)は、すべての入力を使って最終的な判断を下す層です。   一方、畳み込み層(Conv層)は画像などから局所的な特徴を抽出する層です。
  ディープラーニングでは、これらの層を組み合わせることで、高度なパターン認識や分類が可能になります。   特にCNNでは、「Conv層 → Flatten → Dense層」の流れが基本構成となっており、それぞれの役割を理解することが重要です。

参考リンク