Googleによって開発されている機械学習ライブラリであるTensorFlowで、Tensorの値を集約するための各種集約関数の使い方を紹介します。
Contents
- 1 TensorFlowの集約関数
- 1.1 絶対値 (tf.abs)
- 1.2 総和 (tf.reduce_sum)
- 1.3 総乗 (tf.reduce_prod)
- 1.4 平均 (tf.reduce_mean)
- 1.5 分散 (tf.math.reduce_variance)
- 1.6 標準偏差 (tf.math.reduce_std)
- 1.7 最大値 (tf.reduce_max)
- 1.8 最小値 (tf.reduce_min)
- 1.9 最大要素位置 (tf.argmax)
- 1.10 最小要素位置 (tf.argmin)
- 1.11 いずれかの要素がTrue (tf.reduce_any)
- 1.12 すべての要素がTrue (tf.reduce_all)
- 2 reduceの意味
- 3 まとめ
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)
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を作成して総和を計算しています。
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を作成して総乗を計算しています。
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の正規分布に従うランダムデータを生成して、平均を計算しています。
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の型変換方法」にまとめていますので興味があれば参考にしてください。
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の型変換方法」にまとめていますので興味があれば参考にしてください。
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を作成して最大値を計算しています。
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を作成して最小値を計算しています。
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を作成して最大要素の位置を計算しています。計算した要素位置を[]で指定することで最大値を取り出すこともできます。
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を作成して最小要素の位置を計算しています。計算した要素位置を[]で指定することで最小値を取り出すこともできます。
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が返却されていることが分かります。
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が返却されていることが分かります。
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か判定 |
集約関数は、データの状況を把握するためにはよく使うので使い方をしっかり理解しておくとよいでしょう。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。
「Pythonによるディープラーニング」はTensorFlow/Kerasの中~上級者向けの本ですが非常におすすめです。CNN, RNN, Transformer, GAN等高度なモデルも扱っており面白い&TensorFlow/Kerasの実装力をつけることができます。