| ページ一覧 | ブログ | twitter |  書式 | 書式(表) |

MyMemoWiki

「TensorFlow」の版間の差分

提供: MyMemoWiki
ナビゲーションに移動 検索に移動
1行目: 1行目:
| [[機械学習]] | [[数学]] | [[統計]] | [[ベイズ統計]] | [[データ解析]] | [[R]] | [[Anaconda]] |
+
| [[機械学習]] | [[数学]] | [[統計]] | [[ベイズ統計]] | [[データ解析]] | [[R]] | [[Anaconda]] | [[Python NumPy]] |
 
==[https://www.tensorflow.org/?hl=ja TensorFlow]==
 
==[https://www.tensorflow.org/?hl=ja TensorFlow]==
 
*Googleが公開した機械学習フレームワーク
 
*Googleが公開した機械学習フレームワーク

2021年10月16日 (土) 01:51時点における版

| 機械学習 | 数学 | 統計 | ベイズ統計 | データ解析 | R | Anaconda | Python NumPy |

TensorFlow

  • Googleが公開した機械学習フレームワーク
  • 便利なPython APIと比較すると劣るがC++ APIを備える
  • すべての数学は抽象化される
  • TensorBoardというインタラクティブ=な可視化環境
  • 機械学習のためのアルゴリズムを関数やメソッドとしてライブラリにまとめているので、機械学習のためのモデルをフローチャートとして記述することで実装できる
  • Keras:Tensorflow特有の難解なプログラミング手法を簡素化し、直感的にコーディングできるようにしたラッパーライブラリ
    • Kerasのユーザー増加を鑑みコアライブラリとしての組み込みを経て、Tensorflow2.0ではAPIの一部として組み込み


ドキュメント


インストール


Anacondaでのインストール


Dockerを使用したインストール


TensorFlow DockerイメージをUbuntuに構築し他ホストから接続する

 $ docker pull tensorflow/tensorflow:latest  # Download latest stable image
 $ docker run -it -p 8888:8888 tensorflow/tensorflow:latest-jupyter  # Start Jupyter server 
$ docker run -it --net shared_nw --ip 192.168.0.10 -p 8888:8888 tensorflow/tensorflow:latest-jupyter
  • Docker Desktopにイメージが登録された

Ml docker desktop.png

  • Jupyter notebookを起動

Ml tensorflow.png

tokenを確認


  • 一度終了したコンテナを再度起動
$ docker ps -a
CONTAINER ID   IMAGE                                  COMMAND                  CREATED        STATUS                     PORTS     NAMES
92ce0f7112eb   tensorflow/tensorflow:latest-jupyter   "bash -c 'source /et…"   25 hours ago   Exited (0) 4 seconds ago             sleepy_varahamihira
$ docker start 92ce0f7112eb
92ce0f7112eb
$ docker exec -it 92ce0f7112eb /bin/bash

________                               _______________                
___  __/__________________________________  ____/__  /________      __
__  /  _  _ \_  __ \_  ___/  __ \_  ___/_  /_   __  /_  __ \_ | /| / /
_  /   /  __/  / / /(__  )/ /_/ /  /   _  __/   _  / / /_/ /_ |/ |/ / 
/_/    \___//_/ /_//____/ \____//_/    /_/      /_/  \____/____/|__/
  • シェルからトークンを取得する
root@92ce0f7112eb:/tf# jupyter notebook list
Currently running servers:
http://0.0.0.0:8888/?token=dda07003bf50df42ccbd737ea09753318149a29a21b4ebe5 :: /tf

Visual Studio Codeからコンテナに接続


Visual Studio Code で Docker Desktop(Mac)のTensorflowコンテナの開発環境を構築(グラフ表示、コード補完)手順

テンソル


テンソルの作成


import tensorflow as tf

# 2x1行列
m1 = tf.constant([[1. , 2.]]) 
# 1x2行列
m2 = tf.constant([
    [1],
    [2]
])
# ランク3のテンソルを定義
m3 = tf.constant([
    [
        [1,2],
        [3,4],
        [5,6]
    ],
    [
        [7,8],
        [9,10],
        [11,12]
    ]
])

print(m1)
print(m2)
print(m3)
  • 結果
tf.Tensor([[1. 2.]], shape=(1, 2), dtype=float32)
tf.Tensor(
[[1]
 [2]], shape=(2, 1), dtype=int32)
tf.Tensor(
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]], shape=(2, 3, 2), dtype=int32)

テンソル初期化


  • 5×5のテンソルを0.25で初期化
m4 = tf.ones([5,5]) * 0.25
print(m4)
  • 結果
tf.Tensor(
[[0.25 0.25 0.25 0.25 0.25]
 [0.25 0.25 0.25 0.25 0.25]
 [0.25 0.25 0.25 0.25 0.25]
 [0.25 0.25 0.25 0.25 0.25]
 [0.25 0.25 0.25 0.25 0.25]], shape=(5, 5), dtype=float32)

演算子


  • 使用例
x = tf.constant([[1,2]])
nx = tf.negative(x)
print(nx)
  • 結果
tf.Tensor([[-1 -2]], shape=(1, 2), dtype=int32)
演算子 内容 備考
add
subract
multiply
pow
exp
sqrt
div
truediv
floordiv
mod

コードをグラフとして理解

  • 全ての演算子をノードとして考える
  • ノード間の辺は数学関数の構成
  • データは矢印を通って流れる

セッション


  • https://www.tensorflow.org/guide/effective_tf2?hl=ja
  • TensorFlow 1.X では、ユーザーは tf.* API 呼び出しを行って、手動で抽象構文木(グラフ)を作成する必要がありました
  • API を呼び出したら、出力テンソルと入力テンソルのセットを session.run() 呼び出しに渡して、手動で抽象構文木をコンパイルする必要があった
  • TensorFlow 2.0 はこれを逐次的に実行(Python が通常行うのと同じように)し、グラフとセッションは実装の詳細のような感覚になっています
# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)

変数


  • 変数は tf.Variable クラスを介して作成および追跡されます。tf.Variable は、そこで演算を実行して値を変更できるテンソルを表します。特定の演算ではこのテンソルの値の読み取りと変更を行うことができます。
import tensorflow as tf

raw_data = [1.,2.,8.,-1.,0.,5.5,6.,13]
spike = tf.Variable(False)

for i in range(1, len(raw_data)):
    if raw_data[i] - raw_data[i - 1] > 5:
        spike.assign(True)
    else:
        spike.assign( False)
    print(f"Spike {spike.numpy()}")
  • 結果
Spike False
Spike True
Spike False
Spike False
Spike True
Spike False
Spike True

保存と読み込み


  • トレーニングのチェックポイント
  • 「TensorFlow のモデルを保存する」という言いまわしは通常、次の 2 つのいずれかを意味します。
    • チェックポイント
    • 保存されたモデル(SavedModel)
チェックポイント
  • チェックポイントは、モデルで使用されるすべてのパラメータ(tf.Variableオブジェクト)の正確な値をキャプチャします
  • チェックポイントにはモデルで定義された計算のいかなる記述も含まれていないため、通常は、保存されたパラメータ値を使用するソースコードが利用可能な場合に限り有用
  • TensorFlow 1.xのtf.compat.v1.train.Saverが変数名ベースのチェックポイントを読み書きするのとは対照的に、Checkpoint.save()とCheckpoint.restore()はオブジェクトベースのチェックポイントを読み書きします。
SavedModel
  • パラメータ値(チェックポイント)に加え、モデルで定義された計算のシリアライズされた記述が含まれています。
  • モデルを作成したソースコードから独立
  • TensorFlow Serving、TensorFlow Lite、TensorFlow.js、または他のプログラミング言語のプログラム(C、C++、Java、Go、Rust、C# などの TensorFlow API)を介したデプロイに適している

Keras: Pythonの深層学習ライブラリ

  • TensorFlow上で実行可能な高水準のニューラルネットワークライブラリ
  • 迅速な実験を可能にすることに重点

TensorBoard

  • 機械学習の実験に必要な可視化機能とツールを提供
import tensorflow as tf
import datetime

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

def create_model():
  return tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
  ])
  
model = create_model()
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, histogram_freq=1)

model.fit(x=x_train, 
          y=y_train, 
          epochs=5, 
          validation_data=(x_test, y_test), 
          callbacks=[tensorboard_callback])
  • 起動
# tensorboard --logdir logs/fit

Tensorboard01.png

Tensorboard02.png

Sample

テンソルの作成


  • リストまたはNumPy配列からテンソルを作成
    np.set_printoptions(precision=3)
    a = np.array([1, 2, 3], dtype=np.int32)
    b = [4, 5, 6]
    t_a = tf.convert_to_tensor(a)
    t_b = tf.convert_to_tensor(b)
    print(t_a)
    print(t_b)
  • 結果
tf.Tensor([1 2 3], shape=(3,), dtype=int32)
tf.Tensor([4 5 6], shape=(3,), dtype=int32)

テンソルが参照している値にアクセス


  • 単にテンソルで、NumPyのメソッドを呼び出すだけ
print(t_a.shape)
  • 結果
(3,)

定数値のテンソルの作成


    const_tensor = tf.constant([1, 2, 5 ,np.pi], dtype=tf.float32)
    print(const_tensor)
  • 結果
tf.Tensor([1.    2.    5.    3.142], shape=(4,), dtype=float32)

テンソルのデータ型と形状を操作


データ型を変換


キャスト(cast)
    t_a_new = tf.cast(t_a, tf.int64);
    print(t_a_new.dtype)
  • 結果
<dtype: 'int64'>
転置(transpose)
    t = tf.random.uniform(shape=(3, 5))
    t_tr = tf.transpose(t)
    print (t.shape, ' --> ', t_tr.shape)
  • 結果
(3, 5)  -->  (5, 3)

Tips

The kernel appears to have died. It will restart automatically.


  • これだけだと原因は分からないのですが、 コンソールからPythonを起動し、同じコードをコピペして実行
>>> import tensorflow
Illegal instruction (core dumped)