masalibの日記

システム開発、運用と猫の写真ブログです

TensorFlow2.0の基礎

「TensorFlow 2.0 Complete Course - Python Neural Networks for Beginners Tutorial」をベースに自分用に説明追加したものになります。

www.youtube.com

この動画は6時間もあるのでご注意

なお、実行したい人は下記のNoteBookから実行できます(要googleアカウント)

https://colab.research.google.com/drive/1X1yhWDFRr27KJsYjkAtoNDTl9k-EtiXS

TensorFlow 2.0の概要

このノートブックでは、TensorFlow 2.0のインタラクティブ(対話式)な紹介が提供されます。 TensorFlowモジュール内の次のトピックについて説明します。

マシンにTensorFlowをインストールせずに続行したい場合は、 Google Collaboratoryを使用できます。 Collaboratoryは無料のJupyterノートブック環境で、セットアップは不要で、完全にクラウドで実行されます。

インストール TensorFlow

TensorFlowをローカルマシンにインストールするには、pipを使用できます。

pip install tensorflow

CUDA対応のGPUがある場合は、TensorFlowのGPUバージョンをインストールできます。 その際には https://www.tensorflow.org/install/gpu にある他のソフトウェアもインストールする必要があります。

TensorFlowのインポート

ここでの最初のステップは、コラボレーション内からTensorFlowの正しいバージョンを選択することです!

%tensorflow_version 2.x  # この行はGoogle Collaboratoryじゃない限り必要ないです

#TensorFlow 2.x selected.と表示される
import tensorflow as tf  # tensorflow モジュール(module)をインポートする
print(tf.version)  # バージョンが2,xである事を確認する

#<module 'tensorflow._api.v2.version' from '/usr/local/lib/python3.6/dist-packages/tensorflow/_api/v2/version/__init__.py'>

テンソルとは、ベクトルと行列をより高い次元に一般化したものです。

内部的には、TensorFlowはテンソルを基本データ型のn次元配列として表します。

参考URL

テンソルがTensorFlowの根本的な側面であることは驚くに値しません。

プログラム全体に渡って操作される主要なオブジェクトです。 各テンソルは、最終的に値を生成する部分的に定義された計算を表します。 TensorFlowプログラムは、テンソルの関係の詳細を示すTensorオブジェクトのグラフを作成することによって機能します。 グラフのさまざまな部分を実行すると、結果を生成できます。

テンソルにはデータ型形状があります。

データ型(タイプ)には、

  • float32
  • int32
  • string

などがあります。

形状:データの次元を表します。 テンソルは加算、減算、ドット積、クロス積などのようなそれらに適用される演算を持つことができます。

テンソルの作成

以下は、いくつかの異なるテンソルを作成する方法の例です。

テンソルとデータ型の値を定義するだけで、準備完了です。
通常、数値データのテンソルを処理することに価値があります。
文字列テンソルが表示されることは非常にまれです。
データ型の完全なリストについては、次のガイドを参照してください。

https://www.tensorflow.org/api_docs/python/tf/dtypes/DType?version=stable

string = tf.Variable("this is a string", tf.string) 
number = tf.Variable(324, tf.int16)
floating = tf.Variable(3.567, tf.float64)

テンソルのランク

ランクの別の言葉は次数です。これらの用語は単にテンソルに関係する次元の数を意味します。

tensorにはrankという概念があります。数学でもrank(階数)が出てきますが、数学のそれとは少し異なります。 [ ]のネストの数がrankです。

参考URL

rank = 1
x = tf.constant([1,2,3])

rank = 2
y = tf.Variable([[1,2,3], [4,5,6], [7,8,9,], [0,2,3]])

rank = 3
z = tf.Variable([ [[1,2], [3,4]], [[5,6], [7,8]] ])

aa = tf.Variable([[[1]]]) # これも3段入れ子なのでrank = 3 
# [ ]のネスト(入れ子)が何段になっているか数えます。

テンソルのランク を決定するには、次のメソッドを呼び出します。

# 処理の最後にprint sess.run(tf.rank(x))を追加するとrankも計算してくれます。
tf.rank(x)

テンソルの形状(shape)

各次元に存在する要素の数です。TensorFlowはテンソルの形状を決定しようとしますが、 時々それが未知であるかもしれません。 テンソルの形状を取得するには、shape属性を使用します。

テンソルの形状の変更

テンソルの要素数は、そのすべての形状のサイズの積です。多くの場合、同じ数の要素を持つ多くの形状があるため、テンソルの形状を変更できると便利です。

次の例は、テンソルの形状を変更する方法を示しています。

# 要素が1の配列を生成する (numpyのonesみたいなもの)
tensor1 = tf.ones([1,2,3])  

# 変更(reshape) [1,2,3] から [2,3,1]に変更して別の変数に保存する
tensor2 = tf.reshape(tensor1, [2,3,1])  

# 減らしてくれるもよう・・・理解できていない(すいません)
tensor3 = tf.reshape(tensor2, [3, -1])  

# 処理の最後にprint sess.run(tf.rank(x))を追加するとrankも計算してくれます。
tf.rank(x)

#<tf.Tensor: shape=(), dtype=int32, numpy=1>と表示

テンソルの形状(shape)

各次元に存在する要素の数です。TensorFlowはテンソルの形状を決定しようとしますが、 時々それが未知であるかもしれません。 テンソルの形状を取得するには、shape属性を使用します。

ab = tf.constant([[1,2,3], [4,5,6], [7,8,9,], [0,2,3]])
ab.shape

#行列のように考えるとこれは4x3なのでshape=(4, 3)です。
#また2段目の[ ]が4つ、その中に要素が3つあるのでshape=(4, 3)と考える事もできます。
#TensorShape([4, 3])

テンソルの形状の変更

テンソルの要素数は、そのすべての形状のサイズの積です。多くの場合、同じ数の要素を持つ多くの形状があるため、テンソルの形状を変更できると便利です。

次の例は、テンソルの形状を変更する方法を示しています。

要素が1の配列を生成する (numpyのonesみたいなもの)

tensor1 = tf.ones([1,2,3])  
print(tensor1)

# tf.Tensor(
# [[[1. 1. 1.]
#   [1. 1. 1.]]], shape=(1, 2, 3), dtype=float32)

変更(reshape) [1,2,3] から [2,3,1]に変更して別の変数に保存する

tensor2 = tf.reshape(tensor1, [2,3,1])  
print(tensor2)

# tf.Tensor(
# [[[1.]
#   [1.]
#   [1.]]
# 
#  [[1.]
#   [1.]
#   [1.]]], shape=(2, 3, 1), dtype=float32)

減らしてくれる・・・理解できていない(すいません)

tensor3 = tf.reshape(tensor2, [3, -1])  
print(tensor3)

# tf.Tensor(
# [[1. 1.]
#  [1. 1.]
#  [1. 1.]], shape=(3, 2), dtype=float32)

tensor4 = tf.reshape(tensor2, [2, -1])  
print(tensor4)

# tf.Tensor(
# [[1. 1. 1.]
#  [1. 1. 1.]], shape=(2, 3), dtype=float32)


tensor5 = tf.reshape(tensor2, [1, -1])  
print(tensor5)

# tf.Tensor([[1. 1. 1. 1. 1. 1.]], shape=(1, 6), dtype=float32)

Tensorsスライス

スライス演算子は、テンソルで特定の軸または要素を選択するために使用できます。

テンソルから要素をスライスまたは選択するときは、角括弧のセット内でカンマ区切りの値を使用できます。後続の各値は、テンソルの異なる次元を反映します。

例:

tensor[dim1, dim2, dim3]

単品(1つ)を指定する場合(最初は0から開始される)

three = tensor[0,2]  
print(three)  
tf.Tensor(3, shape=(), dtype=int32)

一行目を取得する

row1 = tensor[0]  
print(row1)
# tf.Tensor([1 2 3 4 5], shape=(5,), dtype=int32)

1カラム目だけを抽出する

column1 = tensor[:, 0]  
print(column1)

# tf.Tensor([ 1  6 11 16], shape=(4,), dtype=int32)

2行目と4行目を取得する

row_2_and_4 = tensor[1::2]  
print(row_2_and_4)

# tf.Tensor(
# [[ 6  7  8  9 10]
#  [16 17 18 19 20]], shape=(2, 5), dtype=int32)

3行目と4行目を取得する

row_2_and_4 = tensor[0::3]  
print(row_2_and_4)

# tf.Tensor(
# [[ 1  2  3  4  5]
#  [16 17 18 19 20]], shape=(2, 5), dtype=int32)

Tensorsのタイプ

テンソルにはさまざまなタイプがあります。

とりあえず、テンソルの値を変更する可能性がある場合は変数テンソルを使用することを理解するだけで十分です。

参考URL

ほとんどの情報は、下にあるTensorFlowウェブサイトから直接取得されます。

https://www.tensorflow.org/guide/tensor