この記事の対象読者
- 「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.layers、tf.keras、tf.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.keras か import keras のどちらかに統一 |
ValueError: Shapes (None, 10) and (None, 1) are incompatible |
ラベル形式の不一致 |
sparse_categorical_crossentropy と categorical_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. 学習ロードマップ
初級者向け(まずはここから)
- TensorFlow公式チュートリアル - 初心者向け - 15分でMNIST分類を体験
- Keras公式ガイド - Keras 3.0のマルチバックエンド入門
- 本記事のMNISTサンプルでTensorBoardを使ってみる(
tensorboard --logdir=./logs)
中級者向け(実践に進む)
-
@tf.functionを使ったパフォーマンス最適化を体験する - TF Serving公式ガイド でモデルのAPI化を学ぶ
- TFLite/LiteRTでモバイル向けモデル変換を試す
- TFX(TensorFlow Extended) でMLパイプラインを構築する
上級者向け(さらに深く)
- XLAコンパイラ による計算最適化を学ぶ
- TPU Research Cloud で無料TPUを使った大規模学習を試す
- Keras 3.0でPyTorch/JAXバックエンドへの切り替えを検証する
- カスタムオペレーターの実装(
tf.custom_gradient)
8. まとめ
この記事では、TensorFlowについて以下を解説した。
- TensorFlowの現在地 - 研究ではPyTorchが優勢だが、本番デプロイ・モバイル・MLOpsではTFが依然として強い
- エコシステムの全体像 - Keras、TF Serving、LiteRT、TFX、TensorBoard、TPUが織りなす包括的なプラットフォーム
- 実践的な使い方 - Keras APIでの開発から、SavedModel保存、TF Serving/TFLiteデプロイまで
私の所感
「TensorFlowはオワコン」と言い切れるほど、この業界は単純ではない。
確かに、研究論文やHuggingFaceエコシステムでのPyTorch優位は揺るがない。私自身、新しいモデルを試す時はPyTorchを使うことが圧倒的に多い。しかし、「学習したモデルをどうやってユーザーに届けるか」という段階になると、TensorFlowのエコシステムが持つ成熟度は無視できない。
2026年の正解は「TF vs PyTorch」の二択ではなく、「Keras 3.0で書いてバックエンドを選ぶ」という第三の道だ。
そして何より、TensorBoardという可視化ツールは、PyTorchユーザーですら手放せない存在になっている。フレームワークの壁を越えて使われるツールを生み出した時点で、TensorFlowの歴史的功績は揺るがない。
「知ってるようで知らない」TensorFlow。その全体像を掴んだ今、あなたのツールボックスは確実に広がったはずだ。