【TensorFlow入門】挫折しない深層学習モデルの構築方法!元AIアレルギーのエンジニアが教えるKerasの魔術

目次

「TensorFlow、難しすぎない?」と一度でも思ったあなたへ

正直に告白しよう。私は数年前、一度TensorFlowに挫折している。

当時、第3次AIブームの波に乗ろうと、意気揚々と公式ドキュメントを開いた。でも、そこに書いてあったのは「計算グラフの定義」だの「セッションの実行」だの、直感的に理解できない概念のオンパレード。Pythonを書いているはずなのに、まるで別の言語を解読しているような気分だった。

tf.Session() って何だよ? 変数宣言したのに run() しないと中身が見れないってどういうこと?」

深夜のオフィスで、エラーログという名の赤い文字の壁を前に、私はそっとPCを閉じた。WebエンジニアとしてPHPやJavaScriptでサクサク開発していた自分にとって、あの頃のTensorFlow(いわゆる1.x系)は、あまりにも敷居が高すぎたんだ。

「AIなんて、数学オタクか研究者がやるもんだろ」

そう捨て台詞を吐いて、私はAIの勉強を封印した。

でも、時代は変わった。TensorFlow 2.0が登場し、Kerasという「神」のような高レベルAPIが標準統合されたことで、世界は一変したんだ。

「えっ、こんなに簡単に書けるの?」

久しぶりに触ってみて、腰を抜かした。かつて数十行書いていた処理が、たった数行で終わる。直感的で、Pythonらしい書き方。これなら私らWebエンジニアでも、副業でサクッとAIモデルを作れる。

今、データサイエンスやAI開発の副業案件は山のようにある。単価も高い。でも、「難しそう」というイメージだけで食わず嫌いをしているエンジニアが多すぎる。もったいない。本当にもったいない。

この記事では、かつての私のような「AIアレルギー」を持つ人に向けて、TensorFlow(とKeras)を使った深層学習モデルの構築方法を、徹底的に噛み砕いて解説する。数式は極力出さない。現場で使えるコードと、実務でハマらないための勘所を中心に話していく。

読み終わる頃には、「なんだ、ディープラーニングって意外と単純じゃん」と思えるようになっているはずだ。さあ、リベンジの準備はいいかい?

深夜のデスクでTensorFlow 1.x系の複雑なコードに頭を抱え、挫折しかけている数年前の男性エンジニアの線画イラスト

なぜ今、TensorFlow(Keras)を選ぶのか?

現場で求められる「実装スピード」と「デプロイのしやすさ」

最近は「PyTorchの方が研究界隈では人気だよね」なんて話もよく聞く。確かに論文実装などはPyTorchが多い。でも、私らのような実務家や副業エンジニアにとって、TensorFlow(特にKerasインターフェース)は依然として最強の選択肢の一つだ。

理由はシンプル。「とっつきやすさ」と「本番環境への載せやすさ」だ。

Kerasを使えば、ブロックを積み上げるように直感的にニューラルネットワークを構築できる。model.add() を繰り返すだけ。レゴブロック感覚だ。

そして、作ったモデルをスマホアプリに組み込んだり(TensorFlow Lite)、ブラウザで動かしたり(TensorFlow.js)、Web APIとしてデプロイしたり(TensorFlow Serving)するためのエコシステムが圧倒的に充実している。

副業案件では「モデルを作って終わり」ではなく、「作ったモデルをシステムに組み込んで動かす」ところまで求められることが多い。その時、TensorFlowのこの守備範囲の広さが、強力な武器になるんだ。

そもそもディープラーニングって何をしているの?

難しく考える必要はない。ディープラーニング(深層学習)のモデル構築とは、「入力データ(画像やテキスト)」を「出力データ(猫か犬かのラベルなど)」に変換するための『関数』を自動で作る作業だ。

従来のプログラミングでは、エンジニアがロジック(if文やfor文)を書いていた。
「もし耳が尖っていて、ヒゲがあれば猫」みたいなルールを人間が記述していたわけだ。

でもディープラーニングは違う。
「これが猫の画像、これが犬の画像」という大量のデータ(教師データ)を渡して、「この違いを見分けるための計算式(パラメータ)を勝手に調整してくれ」とPCに丸投げする。これが「学習」だ。

TensorFlowは、この「大量のデータを使った計算式の自動調整」を効率よく行うためのライブラリだと思ってくれればいい。

環境構築?Google Colabを使えば3秒で終わる

初心者が一番最初に躓くのが「環境構築」だ。CUDAがどうとか、cuDNNのバージョンが合わないとか、Pythonの環境が壊れたとか。やる前に心が折れる。

だから、悪いことは言わない。最初は Google Colab を使おう。

Googleアカウントさえあれば、ブラウザ上で動くJupyter Notebook環境が無料で使える。しかも、最初からTensorFlowもインストール済みだし、なんと高価なGPUまで無料で使える。神サービスだ。

  1. Googleドライブを開く
  2. 「新規」→「その他」→「Google Colaboratory」を選択
  3. ノートブックが開いたら、準備完了

これだけ。ローカル環境で消耗するのは、もっと慣れてからで遅くない。まずは「動くものを作る」体験を最優先にしよう。

カフェでノートPCを開き、Google Colabを使ってサクサク環境構築を終えて安堵している様子の線画イラスト

【実践】TensorFlow/Kerasで手書き数字認識(MNIST)モデルを作る

ここからは実際に手を動かしていこう。AI界の「Hello World」と呼ばれる、MNIST(手書き数字画像の分類)をやってみる。

「またMNISTかよ」と思うかもしれないけど、ここにはモデル構築のエッセンスが全部詰まっている。ここをしっかり理解できれば、画像が猫になろうが、レントゲン写真になろうが、基本は同じだ。

1. 必要なライブラリのインポート

まずは呪文のようにこれらをインポートする。

import tensorflow as tf
from tensorflow.keras import layers, models
import matplotlib.pyplot as plt
import numpy as np

# バージョン確認(これ結構大事)
print(f"TensorFlow Version: {tf.__version__}")

2. データの準備と前処理

TensorFlowには、練習用のデータセットを簡単にダウンロードできる機能がついている。

# MNISTデータの読み込み
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# データの形状を確認
print(f"学習データ: {x_train.shape}")  # (60000, 28, 28)
print(f"正解ラベル: {y_train.shape}")  # (60000,)

# 【超重要】データの正規化(0?255 の値を 0?1 に変換)
x_train, x_test = x_train / 255.0, x_test / 255.0

ここで大事なのが「正規化」だ。ニューラルネットワークは、大きな数字(0?255)をそのまま扱うのが苦手だ。計算が発散したり、学習が遅くなったりする。だから、0.0?1.0の範囲にギュッと縮めてあげる。料理で言う「下ごしらえ」みたいなものだ。これを忘れると、精度が出なくて泣くことになる。

3. モデルの構築(ここがハイライト!)

Kerasの真骨頂、Sequential モデルでの定義だ。層(Layer)を積み重ねていく。

model = models.Sequential([
    # 1. 入力層:28x28の2次元画像を、784要素の1次元配列に「平坦化」する
    layers.Flatten(input_shape=(28, 28)),

    # 2. 中間層(隠れ層):128個のニューロンを持つ層
    # activation='relu' は「活性化関数」。入力を非線形に変換する魔法のスイッチ。
    layers.Dense(128, activation='relu'),

    # ドロップアウト層:過学習を防ぐために、ランダムに20%のニューロンを無効化する
    layers.Dropout(0.2),

    # 3. 出力層:0?9の数字のどれかを当てるので、ニューロンは10個
    # activation='softmax' で、合計が100%になるような確率を出力する
    layers.Dense(10, activation='softmax')
])

# モデルの設計図を表示
model.summary()

見てほしい、このシンプルさ。「平らにして(Flatten)」→「計算して(Dense)」→「ちょっと間引いて(Dropout)」→「答えを出す(Dense)」。これだけでニューラルネットワークが定義できてしまう。

activation='relu'(ReLU関数)は、今は「とりあえずこれを使えばOK」という定番の関数だと思っていい。
activation='softmax'(ソフトマックス関数)は、最終的な出力を「確率」に変換してくれる。「0である確率が10%、1である確率が80%…」みたいにしてくれるんだ。

4. モデルのコンパイル

モデルの形はできたけど、どうやって学習するか(どうやって賢くなるか)の設定が必要だ。

model.compile(
    optimizer='adam',  # 最適化アルゴリズム:Adamが超優秀で定番
    loss='sparse_categorical_crossentropy',  # 損失関数:多クラス分類ならこれ
    metrics=['accuracy']  # 評価指標:正解率を見たい
)

ここも専門用語が多いけど、翻訳するとこうなる。

  • Optimizer(最適化): どうやって正解に近づくための修正を行うか? → adam(今はこれが最強クラス)。
  • Loss(損失関数): 今のモデルがどれくらい「間違っているか」をどう計算するか? → 分類問題ならクロスエントロピーを使うのが定石。

5. 学習の実行(Training)

いよいよ学習開始。PCが頑張る時間だ。

# epochs=5 は「データを5周学習する」という意味
history = model.fit(x_train, y_train, epochs=5)

実行すると、プログレスバーが出てきて、loss が下がり、accuracy が上がっていく様子が見えるはずだ。
この瞬間が、AI開発で一番アドレナリンが出る瞬間かもしれない。「おお…賢くなってる…!」という実感が湧く。

モニターに表示された学習曲線のグラフを見つめ、Lossが下がっていく様子にガッツポーズする男性の線画イラスト

6. モデルの評価

学習に使っていない「テストデータ」を使って、実力を測る。カンニングなしの実力テストだ。

test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'\nテストデータの正解率: {test_acc:.4f}')

おそらく97%?98%くらいの正解率が出るはずだ。たった数行のコードで、手書き数字をほぼ完璧に読み取れるAIが完成したわけだ。すごくないか?

現場で必ずぶつかる「過学習」という壁

さて、ここまではチュートリアル通りの綺麗な世界の話。でも、実務や副業案件ではこう簡単にはいかない。
初心者が必ず踏む地雷、それが 「過学習(Overfitting)」 だ。

過学習とは、モデルが「練習問題(学習データ)の答えを丸暗記してしまって、応用(テストデータ)が効かなくなった状態」のこと。
学習データの正解率は99.9%なのに、テストデータの正解率が60%しかない、みたいな現象が起きる。

過学習を防ぐための3つのテクニック

私が現場でよく使う対策を紹介しよう。

  1. Dropout(ドロップアウト)を入れる
    さっきのコードにも入っていた layers.Dropout(0.2) がこれ。学習中にランダムにニューロンをサボらせることで、特定のニューロンへの依存を防ぎ、モデルを「タフ」にする。
  2. Early Stopping(早期終了)
    「テストデータの精度が上がらなくなったら、そこで学習を強制終了する」という設定。無駄な学習を止めて、過学習が進む前にストップをかける。 # コールバックの設定 early_stop = tf.keras.callbacks.EarlyStopping( monitor='val_loss', patience=3, # 3回連続で改善しなかったら止める restore_best_weights=True # 一番良かった時の状態に戻す ) model.fit(x_train, y_train, epochs=50, validation_split=0.2, callbacks=[early_stop]) これ、実務では必須級のコードだ。これがないと、いつまで学習させればいいかわからなくなる。
  3. データ拡張(Data Augmentation)
    手元の画像を「回転させる」「拡大する」「ずらす」などして、擬似的にデータを水増しする。データが増えれば、モデルはより汎用的な特徴を学ばざるを得なくなる。TensorFlowなら layers.RandomFliplayers.RandomRotation をモデルの最初に挟むだけで実装できる。
複雑なグラフを見ながら、「過学習してるなぁ…」と悩み、頭を掻いているエンジニアの線画イラスト

副業案件で稼ぐための「転移学習」のススメ

ここまで「ゼロからモデルを作る」方法を話してきたけど、実は副業案件でゼロからモデルを設計することは稀だ。
なぜなら、世界中の天才たちが作った「最強のモデル」が既に公開されているからだ(VGG16, ResNet, EfficientNetなど)。

私ら副業エンジニアの勝ち筋は、これらを利用する 「転移学習(Transfer Learning)」 にある。

転移学習とは、例えば「1000種類の画像を分類できる賢いAI」を持ってきて、その知識の一部を借りつつ、「自分の特定のタスク(例:現場の良品・不良品判定)」に合わせて最後の部分だけ再学習させる手法だ。

これを使うと:

  • 少ないデータでも高精度が出る
  • 学習時間が圧倒的に短い
  • 実装が簡単

Kerasなら、こんな感じで書ける。

# 学習済みのVGG16モデルをダウンロード(出力層は含めない)
base_model = tf.keras.applications.VGG16(
    weights='imagenet', 
    include_top=False, 
    input_shape=(224, 224, 3)
)

# 既存の層は学習させないようにロック(重みを固定)
base_model.trainable = False

# 自分のタスク用の層を追加
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dense(1, activation='sigmoid') # 例えば2値分類なら
])

実務案件の8割はこれで解決できると言っても過言ではない。ゼロから俺々モデルを作るよりも、巨人の肩に乗っかる方が、クライアントにとってもメリットが大きいんだ。

既存の巨大なロボット(学習済みモデル)に、自分用の小さなパーツを取り付けてカスタマイズしているイメージの線画イラスト

FAQ:初心者が抱きがちな疑問

Q. GPU搭載のハイスペックPCを買うべきですか?

A. まだ買わなくていい。
最初はGoogle Colab(無料版)で十分。学習に数時間かかるような重いモデルを扱うようになったり、ローカルでの推論速度が求められる案件を受けたりするようになってから考えればいい。高い買い物を焦る必要はない。

Q. 数学(微積分・線形代数)はどこまで必要ですか?

A. 「概念」は必要だけど、「計算」は不要。
微分が「傾き(変化の割合)」であることや、行列の掛け算のイメージ(入力×重み)は持っておいた方がいい。でも、手計算で偏微分ができる必要はない。それはTensorFlowが勝手にやってくれるから。エンジニアに必要なのは「数式を解く力」より「何が起きているかをイメージする力」だ。

Q. Python以外の言語でもTensorFlowは使えますか?

A. 使えるけど、おすすめしない。
JavaScript (TensorFlow.js) や Swift などもあるけど、情報量やライブラリの充実度でPythonが圧倒的だ。学習フェーズはPython一択。デプロイフェーズで他の言語を使うことはあるけど、まずはPythonで慣れよう。

まとめ:AIモデル構築は「魔法」ではなく「工学」だ

長々と解説してきたけど、TensorFlowを使った深層学習モデルの構築は、決して一部の天才だけのものではないことが伝わっただろうか。

それは魔法ではなく、ブロックを積み上げ、パラメータを調整し、データを流し込むという、非常に泥臭くて、でもロジカルな「工学(エンジニアリング)」だ。

私も最初は食わず嫌いしていた。「難しそう」「数式アレルギーだし」と逃げていた。でも、一歩踏み出してみたら、そこには強力なツールが用意されていて、エンジニアとしての可能性を広げてくれた。

実際に手を動かして、自分の書いたコードでモデルが動き、予測結果が出た瞬間の感動は、何度味わっても良いものだ。

自分で作成したモデルが正しく手書き数字を認識し、その結果が表示されたモニター画面を指差して喜んでいるエンジニアの線画イラスト

もしあなたが、「AIなんて自分には無理」と思っているなら、騙されたと思ってGoogle Colabを開いて、この記事のコードをコピペして実行してみてほしい。
手書きの数字をAIが認識したその瞬間、あなたのエンジニアとしての視座は、間違いなく一段階上がるはずだ。

そして、その先には「AIが作れるエンジニア」としての、新しいキャリアと副業のチャンスが待っている。
さあ、まずは最初の一行、import tensorflow から始めよう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いたエンジニア

渡辺 一誠のアバター 渡辺 一誠 バックエンドスペシャリスト

バックエンドに長く携わるスペシャリストで、高負荷環境での最適化が得意。論理的かつストイックだが仲間へのサポートは手厚い。クラシック音楽が好きで、集中したい時はよく流している。確かな技術でプロジェクトを支える存在。

目次