TensorFlow

【TensorFlow】集約関数を用いたTensorの計算

【TensorFlow】集約関数を用いたTensorの計算

Googleによって開発されている機械学習ライブラリであるTensorFlowで、Tensorの値を集約するための各種集約関数の使い方を紹介します。

TensorFlowの集約関数

TensorFlowには、対象となるTensorの値を集約する関数が各種用意されています。例えば、総和(sum)のようにTensorの全ての値を足し算するといった計算が集約の一種です。本記事では、Tensorの集約関数について簡単な使用例を用いて紹介します。

絶対値 (tf.abs)

Tensorの絶対値を計算するには、以下のようにtf.absを使用します。

import tensorflow as tf

tensor = tf.constant([-1, -2, 3, 4, -5])

# 絶対値を計算する tf.abs
abs_tensor = tf.abs(tensor)
print(abs_tensor)
【実行結果】
tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

Note

tf.absの公式ドキュメントはこちらを参照してください。tf.absは、tf.math.absの別名となっています。

総和 (tf.reduce_sum)

Tensorの総和を計算するには、以下のようにtf.reduce_sumを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 総和を計算する tf.reduce_sum
sum_tensor = tf.reduce_sum(tensor)
print(sum_tensor)
【実行結果】
tf.Tensor(15, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して総和を計算しています。

Note

tf.reduce_sumの公式ドキュメントはこちらを参照してください。tf.reduce_sumは、tf.math.reduce_sumの別名となっています。

総乗 (tf.reduce_prod)

Tensorの総乗を計算するには、以下のようにtf.reduce_prodを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 総乗を計算する tf.reduce_prod
prod_tensor = tf.reduce_prod(tensor)
print(prod_tensor)
【実行結果】
tf.Tensor(120, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して総乗を計算しています。

Note

tf.reduce_prodの公式ドキュメントはこちらを参照してください。tf.reduce_prodは、tf.math.reduce_prodの別名となっています。

平均 (tf.reduce_mean)

Tensorの平均を計算するには、以下のようにtf.reduce_meanを使用します。

import tensorflow as tf

tf.random.set_seed(42)

# 平均5, 標準偏差2の正規分布に従うデータ
tensor = 5 + tf.random.normal(shape=(1000,)) * 2

# 平均値を計算する tf.reduce_mean
mean_tensor = tf.reduce_mean(tensor)
print(mean_tensor)
【実行結果】
tf.Tensor(5.0008373, shape=(), dtype=float32)

上記例では、平均5、標準偏差2の正規分布に従うランダムデータを生成して、平均を計算しています。

Note

tf.reduce_meanの公式ドキュメントはこちらを参照してください。tf.reduce_meanは、tf.math.reduce_meanの別名となっています。

分散 (tf.math.reduce_variance)

Tensorの分散を計算するには、以下のようにtf.math.reduce_varianceを使用します。

import tensorflow as tf

tf.random.set_seed(42)

# 平均5, 標準偏差2の正規分布に従うデータ
tensor = 5 + tf.random.normal(shape=(1000,)) * 2

# 分散を計算する tf.math.reduce_variance
var_tensor = tf.math.reduce_variance(tensor)
print(var_tensor)
【実行結果】
tf.Tensor(3.9046683, shape=(), dtype=float32)

上記例では、平均5、標準偏差2の正規分布に従うランダムデータを生成して、分散を計算しています。

エラーとなる場合

tf.math.reduce_varianceについては、intだとエラーとなりますので注意しましょう。

import tensorflow as tf

tensor = tf.constant([1, 2, 3, 4, 5])

# 分散を計算する tf.math.reduce_variance
var_tensor = tf.math.reduce_variance(tensor)
print(var_tensor)
【実行結果】
TypeError: Input must be either real or complex. Received integer type <dtype: 'int32'>.

実行する場合には、tf.cast(tensor, dtype=tf.float32)のように型変換してから使用してください。型変換については「Tensorの型変換方法」にまとめていますので興味があれば参考にしてください。

Note

tf.math.reduce_varianceの公式ドキュメントはこちらを参照してください。

標準偏差 (tf.math.reduce_std)

Tensorの標準偏差を計算するには、以下のようにtf.math.reduce_stdを使用します。

import tensorflow as tf

tf.random.set_seed(42)

# 平均5, 標準偏差2の正規分布に従うデータ
tensor = 5 + tf.random.normal(shape=(1000,)) * 2

# 標準偏差を計算する tf.math.reduce_std
std_tensor = tf.math.reduce_std(tf.cast(tensor, dtype=tf.float32))
print(std_tensor)
【実行結果】
tf.Tensor(1.9760233, shape=(), dtype=float32)

上記例では、平均5、標準偏差2の正規分布に従うランダムデータを生成して、標準偏差を計算しています。

エラーとなる場合

tf.math.reduce_stdについては、intだとエラーとなりますので注意しましょう。

import tensorflow as tf

tensor = tf.constant([1, 2, 3, 4, 5])

# 標準偏差を計算する tf.math.reduce_std
std_tensor = tf.math.reduce_std(tensor)
print(std_tensor)
【実行結果】
TypeError: Input must be either real or complex. Received integer type <dtype: 'int32'>.

実行する場合には、tf.cast(tensor, dtype=tf.float32)のように型変換してから使用してください。型変換については「Tensorの型変換方法」にまとめていますので興味があれば参考にしてください。

Note

tf.math.reduce_stdの公式ドキュメントはこちらを参照してください。

最大値 (tf.reduce_max)

Tensorの最大値を計算するには、以下のようにtf.reduce_maxを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 最大値を計算する tf.reduce_max
max_tensor = tf.reduce_max(tensor)
print(max_tensor)
【実行結果】
tf.Tensor(5, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して最大値を計算しています。

Note

tf.reduce_maxの公式ドキュメントはこちらを参照してください。tf.reduce_maxは、tf.math.reduce_maxの別名となっています。

最小値 (tf.reduce_min)

Tensorの最小値を計算するには、以下のようにtf.reduce_minを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 最小値を計算する tf.reduce_min
min_tensor = tf.reduce_min(tensor)
print(min_tensor)
【実行結果】
tf.Tensor(1, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して最小値を計算しています。

Note

tf.reduce_minの公式ドキュメントはこちらを参照してください。tf.reduce_minは、tf.math.reduce_minの別名となっています。

最大要素位置 (tf.argmax)

Tensorの最大要素となる位置を計算するには、以下のようにtf.argmaxを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 最大値の位置を計算する tf.argmax
argmax_tensor = tf.argmax(tensor)
print(argmax_tensor, "\n")

# 最大値を取得する
max_tensor = tensor[argmax_tensor]
print(max_tensor)
【実行結果】
tf.Tensor(4, shape=(), dtype=int64) 

tf.Tensor(5, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して最大要素の位置を計算しています。計算した要素位置を[]で指定することで最大値を取り出すこともできます。

Note

tf.argmaxの公式ドキュメントはこちらを参照してください。tf.argmaxは、tf.math.argmaxの別名となっています。

最小要素位置 (tf.argmin)

Tensorの最小要素となる位置を計算するには、以下のようにtf.argminを使用します。

import tensorflow as tf

tensor = tf.range(1, 6)

# 最小値の位置を計算する tf.argmin
argmin_tensor = tf.argmin(tensor)
print(argmin_tensor, "\n")

# 最小値を取得する
min_tensor = tensor[argmin_tensor]
print(min_tensor)
【実行結果】
tf.Tensor(0, shape=(), dtype=int64) 

tf.Tensor(1, shape=(), dtype=int32)

上記例では[1, 2, 3, 4, 5]といったTensorを作成して最小要素の位置を計算しています。計算した要素位置を[]で指定することで最小値を取り出すこともできます。

Note

tf.argminの公式ドキュメントはこちらを参照してください。tf.argminは、tf.math.argminの別名となっています。

いずれかの要素がTrue (tf.reduce_any)

Tensorのいずれかの要素がTrueとなっているかを判定するには、以下のようにtf.reduce_anyを使用します。

import tensorflow as tf

tensor_1 = tf.constant([False, False, False])
tensor_2 = tf.constant([True, False, True])
tensor_3 = tf.constant([True, True, True])

# いずれかがTrueの場合を判定 tf.reduce_any
print(tf.reduce_any(tensor_1))
print(tf.reduce_any(tensor_2))
print(tf.reduce_any(tensor_3))
【実行結果】
tf.Tensor(False, shape=(), dtype=bool)
tf.Tensor(True, shape=(), dtype=bool)
tf.Tensor(True, shape=(), dtype=bool)

tf.reduce_anyでは、いずれかの要素がTrueであればTrueとなるので、すべての要素がFalseのTensor以外ではTrueが返却されていることが分かります。

Note

tf.reduce_anyの公式ドキュメントはこちらを参照してください。tf.reduce_anyは、tf.math.reduce_anyの別名となっています。

すべての要素がTrue (tf.reduce_all)

Tensorのすべての要素がTrueとなっているかを判定するには、以下のようにtf.reduce_allを使用します。

import tensorflow as tf

tensor_1 = tf.constant([False, False, False])
tensor_2 = tf.constant([True, False, True])
tensor_3 = tf.constant([True, True, True])

# 全てTrueの場合を判定 tf.reduce_all
print(tf.reduce_all(tensor_1))
print(tf.reduce_all(tensor_2))
print(tf.reduce_all(tensor_3))
【実行結果】
tf.Tensor(False, shape=(), dtype=bool)
tf.Tensor(False, shape=(), dtype=bool)
tf.Tensor(True, shape=(), dtype=bool)

tf.reduce_allでは、すべての要素がTrueであればTrueとなるので、すべての要素がTrueのTensor以外ではFalseが返却されていることが分かります。

Note

tf.reduce_allの公式ドキュメントはこちらを参照してください。tf.reduce_allは、tf.math.reduce_allの別名となっています。

reduceの意味

TensorFlowの各種関数はtf.reduce_xxxというような関数名になっています。NumPyにも似たような集約関数がありますが、reduceという名前は入っていません。

これは、GPUカーネル(つまりGPUの実装)が要素の計算順序を保証しない簡易アルゴリズム(reduce algorithm)を使っているからこのような名前になっているようです。

この意味については「scikit-kearn、Keras、TensorFlowによる実践機械学習」に記載があり知りました。こちらの書籍はTensorFlow/Kerasについて幅広く学べるよい参考書になっているので興味があれば購入してみてください。

まとめ

Googleによって開発されている機械学習ライブラリであるTensorFlowで、Tensorの値を集約するための各種集約関数の使い方を紹介しました。

TensorFlowの集約関数としては、以下のようなものがあります。

集約関数名計算内容
tf.abs絶対値
tf.reduce_sum総和
tf.reduce_prod総乗
tf.reduce_mean平均
tf.math.reduce_variance分散
tf.math.reduce_std標準偏差
tf.reduce_max最大値
tf.reduce_min最小値
tf.argmax最大要素位置
tf.argmin最小要素位置
tf.reduce_anyいずれかの要素がTrueか判定
tf.reduce_allすべての要素がTrueか判定

集約関数は、データの状況を把握するためにはよく使うので使い方をしっかり理解しておくとよいでしょう。

Pythonによるディープラーニング」はTensorFlow/Kerasの中~上級者向けの本ですが非常におすすめです。CNN, RNN, Transformer, GAN等高度なモデルも扱っており面白い&TensorFlow/Kerasの実装力をつけることができます。