「機械学習」の版間の差分
ナビゲーションに移動
検索に移動
336行目: | 336行目: | ||
====保存と読み込み==== | ====保存と読み込み==== | ||
---- | ---- | ||
+ | *[https://www.tensorflow.org/guide/checkpoint トレーニングのチェックポイント] | ||
===Tips=== | ===Tips=== |
2021年5月29日 (土) 05:00時点における版
機械学習
基礎
- 未定義の値はパラメータ、説明はモデル
- 典型的には、学習と推論の2段階でアルゴリズムを調べる
- 学習段階での目的は、特徴モデルと呼ばれるデータを記述し、モデルに要約すること
- 特徴ベクトルは、実際のデータを単純化したもの、学習・推論のステップはデータそのものではなく、特徴ベクトルに依存
- 測定する値とどの測定値を比較すべきかの設計は、特徴量設計と呼ばれる
- 調べる特徴の数が多すぎるとパフォーマンスが低下する可能性(次元の呪い)
- 同一性は構成されている特徴に分解される
学習アプローチ
- 訓練データ
- 特徴ベクトル
- 学習アルゴリズム
- モデル
推論アプローチ
- テストデータ
- 特徴ベクトル
- モデル
- 予測
距離の測定
学習のタイプ
教師あり学習
- モデルと呼ばれるラベル付きデータを必要とする
- 訓練データセットと呼ばれる例の集まりを使用する
教師なし学習
強化学習
- 環境が行動によりどう反応するかを観察することで収集される情報を訓練する
- どのような行動の組み合わせが最も有利な結果をもたらすかを知るため
アルゴリズム
アルゴリズム | 用途 | 備考 |
---|---|---|
線形回帰 | トレンドの予測 | |
ロジスティクス回帰 | データを2つのカテゴリに分類し、データセットを分割する最善の方法を見つける | |
多クラスタロジスティクス回帰 | データを複数のカテゴリに分類する | |
隠れマルコフモデル(ビタビ) | 最も可能性の高い隠れた理由を見出す | |
k平均法 | 固定数のカテゴリにクラスタリングし、自動的に分割 | |
自己組織化マップ | 任意のカテゴリにクラスタリングし、高次元データを2次元平面上へ非線形写像する | |
オートエンコーダ | 入力されたデータを一度圧縮し、重要な特徴量だけを残した後、再度もとの次元に復元 | |
Qポリシーニューラルネットワーク | ニューラルネットワークを用いた環境での強化学習 | |
パーセプトロン | 教師ありニューラルネットワークを用いたデータの分類 | |
畳み込みニューラルネットワーク | 教師ありニューラルネットワークを用いた次世界画像の分類 | |
リカレントニューラルネットワーク | ニューラルネットワークを使用して観測に一致するパターンを生成 | |
シーエンス変換(Seq2seq)モデル | 自然言語の問い合わせに対する自然言語応答の予測 | |
順位付け | 効用の学習によって項目を順位付けするための学習 |
TensorFlow
- Googleが公開した機械学習フレームワーク
- 便利なPython APIと比較すると劣るがC++ APIを備える
- すべての数学は抽象化される
- TensorBoardというインタラクティブ=な可視化環
ドキュメント
インストール
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にイメージが登録された
- Jupyter notebookを起動
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
テンソル
テンソルの作成
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
保存と読み込み
Tips
The kernel appears to have died. It will restart automatically.
- これだけだと原因は分からないのですが、 コンソールからPythonを起動し、同じコードをコピペして実行
>>> import tensorflow Illegal instruction (core dumped)
© 2006 矢木浩人