0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TensorFlowってなんだ?〜「PyTorchの影に隠れた巨人」の真の実力を完全理解する〜

0
Posted at

この記事の対象読者

  • 「TensorFlowは古い」「PyTorchの方がいい」という声を聞いて不安な方
  • pip install tensorflow をしたことはあるが、TensorFlowの全体像がつかめていない方
  • Kerasは使ったことがあるがTensorFlowとの関係がよくわからない方
  • AIフレームワークの選択に迷っている方

この記事で得られること

  • TensorFlowの現在地: 2026年のTensorFlowは「過去の遺物」なのか「現役の巨人」なのかを正確に理解できる
  • エコシステムの全体像: Keras、TFLite(LiteRT)、TFX、TPUなど、TensorFlow帝国の地図が描ける
  • 実践スキル: TensorFlow/Kerasでのモデル構築からデプロイまでを体験できる

この記事で扱わないこと

  • PyTorchとのベンチマーク比較の詳細
  • TensorFlow 1.x系のAPI(もう使わなくていい)
  • Google Cloud Platform(GCP)の使い方全般

1. TensorFlowとの出会い

「TensorFlowはオワコン。時代はPyTorch。」

2023年頃からSNSでよく見かけるようになったこのフレーズ。研究論文の85%がPyTorchを使い、HuggingFaceのエコシステムもPyTorch中心。この状況を見て「TensorFlowは終わった」と思った人は少なくないだろう。

正直に言うと、私もそう思っていた。

しかし実態を調べてみると、全く違う景色が見えてきた。

TensorFlowは2026年現在、企業の本番環境で37%以上のマーケットシェアを持ち、25,000社以上が利用している。

研究の世界ではPyTorchが王者だ。しかし「研究成果をプロダクションに持っていく」段階では、TensorFlowのエコシステムが依然として強力な選択肢なのだ。特にモバイル・エッジデバイスへのデプロイ、Google CloudのTPU活用、エンタープライズMLOpsパイプラインの構築では、TensorFlowの右に出るものはまだ多くない。

これは「過去の遺物」の姿ではない。PyTorchとは異なる土俵で、静かに勝ち続けている巨人の姿だ。

ここまでで、TensorFlowが「研究 vs 本番」という軸で見ると全く違う評価になることが伝わっただろうか。
次は、この記事で使う用語を整理しておこう。


2. 前提知識の確認

2.1 計算グラフ(Computational Graph)とは

ニューラルネットワークの計算を、ノード(演算)とエッジ(データフロー)で表現したもの。TensorFlowの名前の由来は「テンソルがグラフの中を流れる(flow)」から来ている。

2.2 Eager Execution(即時実行)とは

コードを書いた順にその場で計算が実行されるモード。Pythonの通常の動作と同じ感覚で使える。TensorFlow 2.0以降はこれがデフォルトになっている。つまり、TF 1.x時代の「セッション」地獄はもう過去の話だ。

2.3 TPU(Tensor Processing Unit)とは

Googleが開発した、機械学習に特化した専用チップ(ASIC)。TensorFlowと最も相性が良く、大規模モデルの学習で圧倒的なコストパフォーマンスを発揮する。

これらの用語が押さえられたら、TensorFlowの背景を見ていこう。


3. TensorFlowが生まれた背景

3.1 前身:DistBelief(Google Brain時代)

TensorFlowの源流は、Google内部で使われていた「DistBelief」という分散学習システムだ。2011年にGoogle Brainチームが開発し、音声認識の誤り率を25%削減するなどの成果を上げた。しかしDistBeliefには柔軟性の問題があり、Jeff Deanらのチームがコードベースを根本から作り直すことを決断。これがTensorFlowになった。

3.2 2015年11月:オープンソース化

TensorFlow 1.0は2015年11月にオープンソースとして公開された(正式な1.0.0リリースは2017年2月)。当時のAI/ML界隈では圧倒的な存在感を放ち、2016年のGoogle I/OではGitHub上の1,500リポジトリがTensorFlowに言及しているとJeff Deanが発表した。

しかし、TF 1.x系には致命的な問題があった。

問題 詳細
静的グラフの苦痛 「グラフ定義」と「実行」が完全に分離。tf.Session() による実行が必須
デバッグの困難さ グラフ構築時にエラーが出ず、実行時に初めてわかる
APIの乱立 tf.layerstf.kerastf.estimator...どれを使えばいいかわからない

3.3 2019年9月:TensorFlow 2.0の革命

TensorFlow 2.0は、PyTorchの「Define-by-Run」に影響を受けて大幅な刷新を行った。

  • Eager Executionがデフォルトに - もう tf.Session() は不要
  • Keras統合 - tf.keras が公式の高レベルAPIに
  • API整理 - 重複するAPIを大量に削除・統合

これでPyTorchとの使い勝手の差は大きく縮まった。

3.4 2023-2024年:Keras 3.0とLiteRT

2023年、Kerasの生みの親Francois CholletがKeras 3.0をリリース。これはTensorFlowだけでなく、PyTorchやJAXもバックエンドとして選べるマルチフレームワーク版だ。「KerasはもはやTensorFlow専用ではない」という事実は、エコシステムの在り方を大きく変えた。

2024年にはTensorFlow Lite(TFLite)が独立プロジェクト「LiteRT」に移行を開始。モバイル/エッジ向け推論エンジンとして独自の進化を歩み始めている。

3.5 2026年現在の姿

最新の安定版はTensorFlow 2.20(2025年8月リリース)、次期版2.21のRC(リリース候補)が2026年2月に公開済み。NVIDIAは2025年をもって公式TensorFlowコンテナのリリースを終了するなど、エコシステムの変化は続いている。

背景がわかったところで、基本的な仕組みを見ていこう。


4. 基本概念と仕組み

4.1 TensorFlow 2.xの二刀流:Eager + Graph

TensorFlow 2.xの最大の特徴は「両方できる」ことだ。

import tensorflow as tf

# --- Eager Mode(デフォルト:PyTorchと同じ感覚)---
a = tf.constant([[1, 2], [3, 4]])
b = tf.constant([[5, 6], [7, 8]])
c = tf.matmul(a, b)
print(c)  # 即座に結果が出る
# tf.Tensor([[ 19  22] [ 43  50]], shape=(2, 2), dtype=int32)

# --- Graph Mode(@tf.functionで高速化)---
@tf.function  # この一行でグラフモードに変換
def fast_matmul(x, y):
    return tf.matmul(x, y)

result = fast_matmul(a, b)  # 初回はグラフ構築、以降は高速実行

@tf.function がTensorFlowの秘密兵器。普段はEagerで開発・デバッグし、パフォーマンスが必要な箇所だけ @tf.function を付ける。これがTF 2.xの「美味しいところ取り」設計だ。

4.2 Kerasとの関係:3つの時代

時代 バージョン 関係性
第1期 Keras 1.x-2.x TFとは独立したライブラリ。バックエンドにTF/Theano/CNTKを選択
第2期 tf.keras(TF 2.0〜) TensorFlowに統合。TF公式の高レベルAPI
第3期 Keras 3.0(2023〜) 再び独立。TF / PyTorch / JAXをバックエンドに選択可能

2026年現在、Keras 3.0を使えば同じコードでTensorFlowとPyTorchの両方で動くモデルが書ける。「TF vs PyTorch」という二項対立は、Kerasの世界では過去のものになりつつある。

4.3 TensorFlowエコシステムの全体像

TensorFlowの真の強みは「フレームワーク単体」ではなく「エコシステム全体」にある。

┌──────────────────────────────────────────────┐
│                TensorFlow エコシステム          │
├──────────────┬───────────────┬───────────────┤
│ 学習・開発    │ デプロイ       │ MLOps         │
│              │               │               │
│ tf.keras     │ TF Serving    │ TFX           │
│ tf.data      │ LiteRT(TFLite)│ ML Metadata   │
│ TensorBoard  │ TF.js         │ TF Transform  │
│ tf.function  │ ONNX Export   │ TF Data Valid. │
│ Keras 3.0    │ TensorRT      │ Vertex AI     │
├──────────────┴───────────────┴───────────────┤
│ ハードウェア: CPU / GPU(CUDA) / TPU / Edge TPU │
└──────────────────────────────────────────────┘

4.4 PyTorchにはない「TensorFlowだけの」強み

領域 TensorFlowの優位性
モバイル/エッジ LiteRT(旧TFLite)は最も成熟したモバイルML推論エンジン
ブラウザ TensorFlow.jsはブラウザ上で直接推論可能
TPU Google TPUとのネイティブ統合はTFのみ
MLOps TFX(TensorFlow Extended)は本番パイプラインの業界標準的存在
可視化 TensorBoardはPyTorchからも使われるほどの標準ツール

基本概念が理解できたところで、実際にコードを書いて動かしてみよう。


5. 実践:実際に使ってみよう

5.1 環境構築

# CPU版
pip install tensorflow

# GPU版(CUDA 12.x対応)
pip install tensorflow[and-cuda]

# Keras 3.0(マルチバックエンド版)を使う場合
pip install keras

注意: TensorFlow 2.20はPython 3.9〜3.13に対応。Python 3.14以降は未サポート(2026年2月現在)。

5.2 環境別の設定ファイル

開発環境用(config.yaml)

# config.yaml - 開発環境用
project:
  name: "tf-project"

environment: development

tensorflow:
  device: "CPU"
  mixed_precision: false
  xla_compilation: false     # 開発時はOFFでデバッグしやすく
  eager_mode: true           # デフォルト

training:
  batch_size: 32
  epochs: 5
  learning_rate: 0.001

logging:
  level: "DEBUG"
  tensorboard_dir: "./logs/dev"

本番環境用(config.production.yaml)

# config.production.yaml - 本番環境用
project:
  name: "tf-project"

environment: production

tensorflow:
  device: "GPU"              # or "TPU"
  mixed_precision: true      # float16で高速化
  xla_compilation: true      # XLAコンパイラ有効化
  eager_mode: false          # Graph modeで最適化

training:
  batch_size: 256
  epochs: 100
  learning_rate: 0.001

serving:
  model_format: "SavedModel"
  tf_serving_port: 8501

logging:
  level: "WARNING"
  tensorboard_dir: "/var/log/tensorboard"

テスト環境用(config.test.yaml)

# config.test.yaml - CI/CD用
project:
  name: "tf-project"

environment: test

tensorflow:
  device: "CPU"
  mixed_precision: false
  xla_compilation: false
  eager_mode: true
  seed: 42

training:
  batch_size: 8
  epochs: 1
  learning_rate: 0.001

logging:
  level: "WARNING"
  tensorboard_dir: "./logs/test"

5.3 基本的な使い方:MNIST分類(Keras API)

"""
TensorFlow/Keras MNIST分類 - 入門用サンプル
実行方法: python tf_mnist.py
必要パッケージ: tensorflow
"""
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np


def create_model():
    """シンプルなMNIST分類モデルを構築"""
    model = keras.Sequential([
        layers.Input(shape=(28, 28)),
        layers.Flatten(),
        layers.Dense(512, activation='relu'),
        layers.Dropout(0.2),
        layers.Dense(256, activation='relu'),
        layers.Dropout(0.2),
        layers.Dense(10, activation='softmax')
    ])

    model.compile(
        optimizer='adam',
        loss='sparse_categorical_crossentropy',
        metrics=['accuracy']
    )
    return model


def main():
    # --- デバイス確認 ---
    print(f"TensorFlow: {tf.__version__}")
    gpus = tf.config.list_physical_devices('GPU')
    print(f"利用可能GPU: {len(gpus)}")
    if gpus:
        for gpu in gpus:
            print(f"  {gpu.name}")

    # --- データ準備 ---
    (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
    x_train = x_train.astype('float32') / 255.0
    x_test = x_test.astype('float32') / 255.0

    # --- モデル構築 ---
    model = create_model()
    model.summary()

    # --- TensorBoardコールバック ---
    tensorboard_cb = keras.callbacks.TensorBoard(
        log_dir='./logs',
        histogram_freq=1
    )

    # --- 学習 ---
    history = model.fit(
        x_train, y_train,
        batch_size=64,
        epochs=5,
        validation_split=0.1,
        callbacks=[tensorboard_cb],
        verbose=1
    )

    # --- 評価 ---
    test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
    print(f"\nテスト精度: {test_acc:.4f}")

    # --- モデル保存(SavedModel形式) ---
    model.save("mnist_saved_model")
    print("モデルを SavedModel 形式で保存しました")

    # --- モデル保存(Keras形式) ---
    model.save("mnist_model.keras")
    print("モデルを .keras 形式で保存しました")


if __name__ == "__main__":
    main()

5.4 実行結果

$ python tf_mnist.py
TensorFlow: 2.20.0
利用可能GPU: 1台
  /physical_device:GPU:0
Model: "sequential"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type)                        ┃ Output Shape        ┃       Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ flatten (Flatten)                   │ (None, 784)         │             0 │
│ dense (Dense)                       │ (None, 512)         │       401,920 │
│ dropout (Dropout)                   │ (None, 512)         │             0 │
│ dense_1 (Dense)                     │ (None, 256)         │       131,328 │
│ dropout_1 (Dropout)                 │ (None, 256)         │             0 │
│ dense_2 (Dense)                     │ (None, 10)          │         2,570 │
└─────────────────────────────────────┴─────────────────────┴───────────────┘
 Total params: 535,818 (2.04 MB)
Epoch 1/5 - loss: 0.3012 - accuracy: 0.9104 - val_accuracy: 0.9667
Epoch 2/5 - loss: 0.1134 - accuracy: 0.9658 - val_accuracy: 0.9748
Epoch 3/5 - loss: 0.0801 - accuracy: 0.9756 - val_accuracy: 0.9778
Epoch 4/5 - loss: 0.0618 - accuracy: 0.9805 - val_accuracy: 0.9790
Epoch 5/5 - loss: 0.0498 - accuracy: 0.9845 - val_accuracy: 0.9802

テスト精度: 0.9798
モデルを SavedModel 形式で保存しました
モデルを .keras 形式で保存しました

5.5 よくあるエラーと対処法

エラー 原因 対処法
Could not load dynamic library 'libcudnn.so' cuDNNが見つからない pip install tensorflow[and-cuda] で再インストール。またはCUDAを手動セットアップ
OOM when allocating tensor GPUメモリ不足 tf.config.experimental.set_memory_growth(gpu, True) で動的メモリ確保に変更
AttributeError: module 'keras' has no attribute ... Keras 2.x と 3.0の混在 import tensorflow.kerasimport keras のどちらかに統一
ValueError: Shapes (None, 10) and (None, 1) are incompatible ラベル形式の不一致 sparse_categorical_crossentropycategorical_crossentropy を確認
Could not find TensorRT TensorRTが未インストール 推論高速化が不要なら無視してOK。必要ならNVIDIA TensorRTをインストール

5.6 環境診断スクリプト

#!/usr/bin/env python3
"""
TensorFlow環境診断スクリプト
実行方法: python check_tf_env.py
"""
import sys
import platform


def check_environment():
    """TensorFlow環境をチェック"""
    issues = []
    info = []

    info.append(f"Python: {sys.version_info.major}.{sys.version_info.minor}.{sys.version_info.micro}")
    info.append(f"OS: {platform.system()} {platform.release()}")

    try:
        import tensorflow as tf
        info.append(f"TensorFlow: {tf.__version__}")

        # Eager Mode確認
        info.append(f"Eager Mode: {tf.executing_eagerly()}")

        # GPU確認
        gpus = tf.config.list_physical_devices('GPU')
        if gpus:
            for gpu in gpus:
                info.append(f"GPU: {gpu.name}")
            # CUDA確認
            info.append(f"CUDA対応ビルド: {tf.test.is_built_with_cuda()}")
        else:
            info.append("GPU: 利用不可(CPU実行)")

        # TPU確認
        try:
            tpu = tf.distribute.cluster_resolver.TPUClusterResolver()
            info.append(f"TPU: {tpu.cluster_spec()}")
        except ValueError:
            info.append("TPU: 利用不可")

        # Keras確認
        try:
            import keras
            info.append(f"Keras: {keras.__version__}")
            if hasattr(keras, 'backend'):
                info.append(f"Keras Backend: {keras.backend.backend()}")
        except ImportError:
            info.append("Keras (standalone): 未インストール")

        # XLA確認
        info.append(f"XLAビルド: {tf.test.is_built_with_xla()}")

    except ImportError:
        issues.append("TensorFlowがインストールされていません")

    # 結果
    print("=" * 50)
    print(" TensorFlow 環境診断レポート")
    print("=" * 50)
    print("\n[環境情報]")
    for item in info:
        print(f"  {item}")
    if issues:
        print(f"\n[問題点: {len(issues)}件]")
        for issue in issues:
            print(f"  - {issue}")
    else:
        print("\n  環境は正常です!")
    print("=" * 50)


if __name__ == "__main__":
    check_environment()

実装方法がわかったので、次は具体的なユースケースを見ていこう。


6. ユースケース別ガイド

6.1 ユースケース1: TensorFlow Servingで本番デプロイ

想定読者: 学習済みモデルをAPI化して本番環境に載せたい方

推奨構成: TensorFlow + SavedModel + TF Serving (Docker)

サンプルコード:

"""
モデルをSavedModel形式で保存(TF Serving対応)
"""
import tensorflow as tf
from tensorflow import keras

# モデル定義・学習は省略(前節参照)
model = keras.Sequential([
    keras.layers.Dense(128, activation='relu', input_shape=(784,)),
    keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

# SavedModel形式で保存(バージョニング対応)
export_path = "./saved_models/mnist/1"  # バージョン番号
model.save(export_path)
print(f"SavedModel exported to: {export_path}")
# Docker経由でTF Servingを起動
docker run -p 8501:8501 \
  --mount type=bind,source=$(pwd)/saved_models/mnist,target=/models/mnist \
  -e MODEL_NAME=mnist \
  tensorflow/serving

# curlで推論リクエスト
curl -d '{"instances": [[0.0, 0.1, 0.2, ...]]}' \
  -X POST http://localhost:8501/v1/models/mnist:predict

6.2 ユースケース2: LiteRT(TFLite)でモバイルデプロイ

想定読者: モデルをスマートフォンやエッジデバイスで動かしたい方

推奨構成: TensorFlow + TFLite Converter + LiteRT

サンプルコード:

"""
Kerasモデル → TFLite変換(モバイル向け)
"""
import tensorflow as tf

# 学習済みモデルを読み込み
model = tf.keras.models.load_model("mnist_saved_model")

# TFLiteに変換
converter = tf.lite.TFLiteConverter.from_saved_model("mnist_saved_model")
converter.optimizations = [tf.lite.Optimize.DEFAULT]  # 量子化で軽量化
tflite_model = converter.convert()

# 保存
with open("mnist_model.tflite", "wb") as f:
    f.write(tflite_model)

original_size = sum(
    v.numpy().nbytes for v in model.trainable_variables
)
print(f"元モデル: {original_size / 1024:.1f} KB")
print(f"TFLite: {len(tflite_model) / 1024:.1f} KB")
print(f"圧縮率: {len(tflite_model) / original_size:.1%}")

6.3 ユースケース3: Keras 3.0マルチバックエンド活用

想定読者: TF/PyTorch両対応のコードを書きたい方

推奨構成: Keras 3.0 + 任意バックエンド

サンプルコード:

"""
Keras 3.0のマルチバックエンド機能
環境変数でバックエンドを切り替え可能
"""
import os
# バックエンド選択(tensorflow / torch / jax)
os.environ["KERAS_BACKEND"] = "tensorflow"  # or "torch" or "jax"

import keras
from keras import layers, ops

print(f"Keras: {keras.__version__}")
print(f"Backend: {keras.backend.backend()}")

# このコードはTF/PyTorch/JAXどれでも動く!
model = keras.Sequential([
    layers.Dense(256, activation="relu"),
    layers.Dropout(0.3),
    layers.Dense(10, activation="softmax"),
])

# バックエンド非依存の演算
x = ops.ones((2, 784))
output = model(x)
print(f"Output shape: {output.shape}")

ユースケースを把握できたところで、この先の学習パスを確認しよう。


7. 学習ロードマップ

初級者向け(まずはここから)

  1. TensorFlow公式チュートリアル - 初心者向け - 15分でMNIST分類を体験
  2. Keras公式ガイド - Keras 3.0のマルチバックエンド入門
  3. 本記事のMNISTサンプルでTensorBoardを使ってみる(tensorboard --logdir=./logs

中級者向け(実践に進む)

  1. @tf.function を使ったパフォーマンス最適化を体験する
  2. TF Serving公式ガイド でモデルのAPI化を学ぶ
  3. TFLite/LiteRTでモバイル向けモデル変換を試す
  4. TFX(TensorFlow Extended) でMLパイプラインを構築する

上級者向け(さらに深く)

  1. XLAコンパイラ による計算最適化を学ぶ
  2. TPU Research Cloud で無料TPUを使った大規模学習を試す
  3. Keras 3.0でPyTorch/JAXバックエンドへの切り替えを検証する
  4. カスタムオペレーターの実装(tf.custom_gradient

8. まとめ

この記事では、TensorFlowについて以下を解説した。

  1. TensorFlowの現在地 - 研究ではPyTorchが優勢だが、本番デプロイ・モバイル・MLOpsではTFが依然として強い
  2. エコシステムの全体像 - Keras、TF Serving、LiteRT、TFX、TensorBoard、TPUが織りなす包括的なプラットフォーム
  3. 実践的な使い方 - Keras APIでの開発から、SavedModel保存、TF Serving/TFLiteデプロイまで

私の所感

「TensorFlowはオワコン」と言い切れるほど、この業界は単純ではない。

確かに、研究論文やHuggingFaceエコシステムでのPyTorch優位は揺るがない。私自身、新しいモデルを試す時はPyTorchを使うことが圧倒的に多い。しかし、「学習したモデルをどうやってユーザーに届けるか」という段階になると、TensorFlowのエコシステムが持つ成熟度は無視できない。

2026年の正解は「TF vs PyTorch」の二択ではなく、「Keras 3.0で書いてバックエンドを選ぶ」という第三の道だ。

そして何より、TensorBoardという可視化ツールは、PyTorchユーザーですら手放せない存在になっている。フレームワークの壁を越えて使われるツールを生み出した時点で、TensorFlowの歴史的功績は揺るがない。

「知ってるようで知らない」TensorFlow。その全体像を掴んだ今、あなたのツールボックスは確実に広がったはずだ。


参考文献

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?