「NumPy」と「TensorFlow」はどちらもテンソルを計算するためのツール

こんにちは。ゆうせいです。

機械学習、特にディープラーニングの世界に足を踏み入れると、必ずと言っていいほど出会うのが「NumPy」と「TensorFlow」です。どちらも多次元配列、つまりテンソルを計算するためのツールですが、その役割や得意なことは大きく異なります。

今回は、この二つのライブラリの関係性を、「万能な手芸セット」と「全自動の織物工場」に例えながら、その共通点と決定的な違いを解説していきますね!


共通点:どちらも「テンソル」を扱う計算ツール

まず、ご指摘の通り、両者の最大の共通点はテンソル(Tensor)、つまり多次元配列を扱うためのライブラリであることです。

テンソルと聞くと難しく聞こえますが、要は数字が詰まった箱のことです。

  • 0次元テンソル: ただの数字(スカラー) 5
  • 1次元テンソル: 数字の列(ベクトル) [1, 2, 3]
  • 2次元テンソル: 数字の表(行列) [[1, 2], [3, 4]]
  • 3次元以上のテンソル: 数字の立方体、など

NumPyもTensorFlowも、これらのテンソル同士を足したり、掛け合わせたりといった数学的な計算を、Pythonの標準機能よりも遥かに高速に行うことができます。


NumPy:高速で万能な「手芸セット」

NumPyは、科学技術計算全般を支える、Pythonの基本的なライブラリです。

これを例えるなら、高品質な針、糸、ハサミがすべて揃った「万能な手芸セット」です。

このセットがあれば、データを切ったり(スライシング)、形を整えたり(リシェイプ)、色を塗ったり(計算)と、手作業で思い通りの作品を自由自在に、かつ素早く作ることができます。

NumPyの主な特徴

  • 即時実行: c = a + b とコードを書くと、その場ですぐに計算が実行されます。直感的で分かりやすいですね。
  • CPUでの計算がメイン: 主にコンピュータの頭脳であるCPUを使って計算するように設計されています。
  • 汎用性: 機械学習だけでなく、画像処理、信号処理、統計分析など、数値データを扱うあらゆる場面で活躍する、まさに縁の下の力持ちです。

TensorFlow:学習する「全自動の織物工場」

一方、TensorFlowは、Googleが開発した、主にディープラーニング(深層学習)のために作られたライブラリです。

こちらは設計図を渡すと、最適な布を自動で織り続けてくれる「全自動の織物工場」に例えられます。

この工場の最大の特徴は、ただ織るだけでなく、出来上がった布(予測結果)と見本(正解データ)を比べ、自動で機械(モデルのパラメータ)を微調整して、より良い布を織れるように自ら学習していく点にあります。

TensorFlowの主な特徴

  • 計算グラフの構築: TensorFlowは、まず計算全体の「設計図(計算グラフ)」を作ります。そして、その設計図を元に、後からまとめて計算を実行します。これにより、全体の計算を最適化できるのです。
  • GPU/TPUでの高速化: ディープラーニングで必要となる膨大な単純計算は、GPUやTPUといった専用のハードウェア(工場の特殊な機械)が非常に得意です。TensorFlowはこれらを最大限に活用し、計算を劇的に高速化します。
  • 自動微分: これがTensorFlowの「魔法」であり、最大の強みです。モデルが学習するために必要な、非常に複雑な微分計算を自動で行ってくれます。これにより、モデルは自らの間違いを修正し、賢くなっていくのです。NumPyにはこの機能はありません。

違いが一目でわかる比較表

項目NumPyTensorFlow
例え万能な手芸セット 🧶全自動の織物工場 🏭
主な目的汎用的な科学技術計算ディープラーニング、大規模機械学習
計算の実行即時実行計算グラフを構築してから実行
主な実行環境CPUCPU, GPU, TPU
最大の特徴高速な数値計算ライブラリの基礎自動微分によるモデルの学習機能

共通点:テンソルを作り、計算する

まず、どちらのライブラリも、多次元配列(テンソル)を簡単に作成し、それらを使って数学的な計算ができる点では全く同じです。

たとえば、2x2の行列(2次元テンソル)を2つ作り、それらの足し算をしてみましょう。

NumPyの場合 NumPy: The Hand Tool 🖐️

import numpy as np

# 2x2の行列(テンソル)を作成
a_np = np.array([[1, 2],
                 [3, 4]])

b_np = np.array([[5, 6],
                 [7, 8]])

# テンソルの足し算
c_np = a_np + b_np

print("--- NumPy ---")
print(c_np)

TensorFlowの場合 TensorFlow: The Factory Machine

import tensorflow as tf

# 2x2の行列(テンソル)を作成
a_tf = tf.constant([[1, 2],
                    [3, 4]])

b_tf = tf.constant([[5, 6],
                    [7, 8]])

# テンソルの足し算
c_tf = a_tf + b_tf

print("--- TensorFlow ---")
print(c_tf)

【実行結果】

--- NumPy ---
[[ 6  8]
 [10 12]]
--- TensorFlow ---
tf.Tensor(
[[ 6  8]
 [10 12]], shape=(2, 2), dtype=int32)

どうでしょうか?

np.array と tf.constant という命令の違いはあれど、やっていることは本質的に同じですよね。どちらも同じ形のテンソルを作り、同じ計算結果を出力しました。これが両者の共通点です。


決定的な違い:TensorFlowの「自動微分」機能

では、何が違うのか。最大の違いは、TensorFlowが機械学習モデルの「学習」のために作られているという点です。

学習とは、モデルの予測と正解の「誤差」を計算し、その誤差が小さくなるようにモデルのパラメータを少しずつ調整していく作業です。この「調整」の方向を決めるために、微分(gradient)という計算が不可欠になります。

TensorFlowは、この非常に面倒な微分計算を自動で行ってくれる魔法のような機能を持っています。

例:y = x² の微分

y = x² という式を考えます。高校数学で習ったように、これをxで微分すると y' = 2x になりますね。xが3のとき、傾きは 2 * 3 = 6 となります。

NumPyには、この微分を自動で行う機能はありません。

TensorFlowでは、いとも簡単に計算できてしまいます。

# xは学習によって変化する「変数」として定義
x = tf.Variable(3.0)

# 計算の過程をテープに記録
with tf.GradientTape() as tape:
  # y = x² を計算
  y = x * x

# yをxで微分した値(傾き)を計算
dy_dx = tape.gradient(y, x)

print("--- TensorFlowの自動微分 ---")
print(f"x = {x.numpy()} のとき、y = x² の傾きは {dy_dx.numpy()} です。")

【実行結果】

--- TensorFlowの自動微分 ---
x = 3.0 のとき、y = x² の傾きは 6.0 です。

tf.GradientTape() で計算を監視するだけで、複雑な計算であっても、その傾き(モデルがどちらの方向に進めば正解に近づくか)を自動で算出してくれます。これこそが、TensorFlowが「学習するための工場」と呼ばれる所以です。


どう使い分けるの?最強の連携プレー

「じゃあ、ディープラーニングをやるならTensorFlowだけでいいの?」と思うかもしれませんが、答えは「No」です。実は、この二つは最高のパートナーなのです!

実際のデータ分析の現場では、以下のような見事な連携プレーが見られます。

  1. データ準備(NumPyの出番!): まず、元となるデータ(糸の素材)を読み込み、NumPyの豊富な機能を使って、形を整えたり、不要な部分をカットしたり、下処理をします。この段階では、手元でサッと作業できるNumPyが非常に便利です。
  2. モデルへの入力: 綺麗に下処理されたNumPy配列(準備された糸)を、tf.convert_to_tensor() という命令一つでTensorFlowのテンソルに変換します。
  3. 訓練と予測(TensorFlowの出番!): 変換されたテンソルをTensorFlowの工場(モデル)に投入し、自動学習と予測を任せます。

このように、データの細かい前処理は小回りの利くNumPy、大規模な学習は専門工場のTensorFlow、という役割分担が、最も効率的なのです。


サンプルコード:NumPyでデータ準備、TensorFlowでモデル訓練

ここでは、y = 2x + 1 という単純な関係性を持つデータを作成し、この法則をモデルに学習させてみます。

import numpy as np
import tensorflow as tf

# --- Step 1: NumPyでデータを準備する  NumPy: The Data Chef 👨‍🍳 ---

print("--- 1. NumPyによるデータ準備 ---")
# 特徴量X(入力データ)をNumPy配列として作成
# -1.0から1.0の範囲で、100個のランダムな数値を生成
X_np = np.random.rand(100).astype(np.float32) * 2 - 1

# 正解ラベルy(出力データ)をNumPy配列として作成
# y = 2x + 1 の関係に、少しだけノイズ(ばらつき)を加える
noise = np.random.randn(100).astype(np.float32) * 0.1
y_np = 2 * X_np + 1 + noise

# 準備したデータの形状を確認
print(f"NumPyで準備したXの形状: {X_np.shape}")
print(f"NumPyで準備したyの形状: {y_np.shape}\n")


# --- Step 2: NumPy配列をTensorFlowテンソルに変換する The Handover 🤝 ---

print("--- 2. TensorFlowテンソルへの変換 ---")
# TensorFlowのモデルが扱える形式に変換する
# この変換は多くの場合、.fit()メソッド内部で自動的に行われるが、
# 明示的に変換することも一般的
X_tf = tf.constant(X_np)
y_tf = tf.constant(y_np)

print(f"変換後のXの型: {type(X_tf)}\n")


# --- Step 3: TensorFlowでモデルを構築し、訓練する TensorFlow: The Factory 🏭 ---

print("--- 3. TensorFlowによるモデル構築と訓練 ---")
# 最もシンプルなニューラルネットワークモデルを定義
# 入力が1つ、出力が1つの層を持つ
model = tf.keras.Sequential([
    tf.keras.layers.Dense(units=1, input_shape=[1])
])

# モデルがどのように学習するかを設定(コンパイル)
# 'sgd': 最適化アルゴリズムの一つ
# 'mean_squared_error': 損失関数(誤差の計算方法)
model.compile(optimizer='sgd', loss='mean_squared_error')

# モデルの訓練を実行!
# NumPy配列を直接入力することも可能
# epochs=50 は、データ全体を50回繰り返し学習させるという意味
print("訓練を開始します...")
model.fit(X_np, y_np, epochs=50, verbose=0) # verbose=0で進捗表示をオフに
print("訓練が完了しました!\n")


# --- Step 4: 学習済みモデルで予測する Prediction 🔮 ---

print("--- 4. 学習済みモデルによる予測 ---")
# NumPyで作成した新しいデータで予測を試す
test_data_np = np.array([10.0], dtype=np.float32)

# モデルに予測させる
prediction = model.predict(test_data_np)

print(f"入力が10.0のとき、モデルの予測結果は約 {prediction[0][0]:.2f} です。")
print("(正解は約 y = 2 * 10.0 + 1 = 21.0)")

このコードのポイント

  1. データ準備はNumPyで: np.random.rand() のように、手軽で直感的なNumPyの関数を使って、学習の元となるデータを素早く作成しています。実際の現場でも、CSVファイルから読み込んだデータをPandas経由でNumPy配列として扱うことが多いです。
  2. シームレスな連携: model.fit(X_np, y_np, ...) の部分に注目してください。TensorFlowのKeras APIは非常によくできており、NumPy配列を直接入力データとして受け取ってくれます。内部で自動的にテンソルに変換してくれるため、私たちは変換を意識することなく、スムーズにデータをモデルに渡すことができるのです。
  3. 役割分担の明確化: 複雑なデータ操作や科学計算はNumPyの得意分野。一方で、モデルの定義、自動微分によるパラメータの更新、GPUを使った高速な訓練はTensorFlowの独壇場です。このコードは、まさしくその理想的な役割分担を体現しています。

このように、NumPyとTensorFlowは競合するものではなく、お互いの強みを活かし合うことで、データサイエンスのワークフロー全体を効率化する最高のパートナーなのです。

まとめと今後の学習指針

NumPyとTensorFlowの違い、ご理解いただけたでしょうか?

  • NumPy: データサイエンスの「読み書きそろばん」。あらゆる数値計算の基礎となる、高速で万能な計算ツール
  • TensorFlow: ディープラーニングを実現するための「自動学習機能付き」のモデル構築フレームワーク

今後の学習としては、まずNumPyの操作にしっかりと慣れ親しむことを強くお勧めします。NumPyは、TensorFlowだけでなく、あらゆるデータ分析ライブラリの土台となるからです。

NumPyで自由にデータを扱えるようになったら、いよいよTensorFlowを使って、そのデータを「学習」させる次のステージに進みましょう。その時、あなたがNumPyで学んだ知識は、間違いなく強力な武器となりますよ。応援しています!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。