Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Scikit-LearnとTensorFlowによる実践機械学習~TensorFlow諦めた編~

Scikit-LearnとTensorFlowによる実践機械学習~Scikit-Learn編~ の続きです。

前半(8章まで)は、ほぼScikit-Learnに関する話でした。
後半(9章以降)は、TensorFlowの話に移っていきます。

※書籍がTensorFlow1の内容で書かれているのに対し、どうやら現在はTensorFlow2みたいだということで、TensorFlow2ではどうなってるのかよくわからない部分が多いです。

内容に入る前に、メモ程度に参考になるサイトをまとめておきます。
  ・サンプルコード(GitHub)
  ・TensorFlow公式サイト
  ・PFN社のChainer Tutorial
  ・書籍情報

■ 結論

結論から言うと、TensorFlow2が現状ということを考え、TensorFlow1で学習するのはあまり効率的ではないなと感じました。

TensorFlow1と2では、まるで別物のように感じますし、TensorFlow2の方が遥かに優れているようです。初っ端に「TensorFlowは、Sessionを開始して閉じるということをするのが特徴だ。」的な雰囲気なのですが、TensorFlow2では、このSessionが廃止されているという...

TensorFlow編の初っ端からこんな感じなので、実践しようとすると、どこが変わっていてどこが変わっていないのかよく分かりませんし、もう大変です。調べていてもちょっと調べるだけで時間がみるみるうちに溶けていきます。

TensorFlow1でとりあえず勉強すればいいじゃんという意見もあると思いますが、今回の自分の目的的には、実践で使えるようにしたいのであってTensorFlowの勉強がしたいわけではないので、それはちょっと違うんですよね。書籍をTensorFlow2に対応しているものに変えるかな...(この本安くなかったんだけどなぁ)

とはいえ、バージョンが違うだけで勉強になることは多いです。実践というのを一旦置いておく段階に達したら再び読み直そうと思います。現在はまだとりあえず動いてほしいフェーズなので、しばらくは本棚を温めてもらう役割になりそうではありますが。

一応、9章(TensorFlow編の最初の章)の途中までQiitaにメモしていたので記事は下に続きますが、ぶっちゃけ内容は陳腐で読む価値があるのかは微妙です。

さてさて、Scikit-LearnとTensorFlowによる実践機械学習の全16章のうち、13章まで読んでやる気がぷつんと切れてしまったので、とりあえずDeepLearningの勉強はまたの機会に。よさげな本も増えてきましたしね、飽和するのを一旦待ちます。




※陳腐なメモは以下に続きます。

■ 9章:TensorFlowを立ち上げる。

勉強日:2020/6/21

「そもそもTensorFlowってなんだろう?Deep Learning用のライブラリ??」というところから私の知識は始まりまります。ぶっちゃけた話、このぐらいの知識から読み始めると大分つらいです。

書籍には、

 ① 数値計算のための強力なオープンソースソフトウェアであること
 ② 特に大規模な機械学習のためにチューニングされていること
 ③ 基本原則は、実行する計算グラフをPythonで定義すると、TensorFlowがそのグラフを読み取り、最適化されたC++コードで効率よく実行すること
 ④ 何より重要なのは、グラフをCPUやGPUで並列処理できること
 ⑤ 分散コンピューティングをサポートしていること

というようなことが書かれています。

正直、ぱっと読んだ時は「なんのこっちゃ」という感じで、そもそもTensorFlowと計算グラフって何の関係があるの?という疑問を持ちました。じっくり先まで読んでみると、どうやらTensorFlowは基本的に「計算グラフの作成 → 計算の実行」という順序を踏むようです。なるほどね。

・9.1 インストール

隔離された環境というのが出てくるのですが、今まで仮想環境が必要になったことはなかったので作ったことがありませんでした。今回はいい機会だと思ったので、あれこれ調べて仮想環境も作ってみました。

書籍には、virtualenvで作ると書いてあったのですが、私はAnacondaを使って作りたかったので、以下のようなサイトを参考にしました。

【Python】Anacondaを使った仮想環境の構築
【Anaconda】condaコマンドで仮想環境を構築する方法

TensorFlowをインストールするところで気が付いたのですが、書籍内でのTensorFlowのバージョンが1なのに対し、現在のバージョンは2になっているようです。しかも大分使い勝手が違う様子。。。

うーん、うーん、ぅ-…

まぁ、とりあえず、サンプルコードぺたぺたして分かった気になる戦法でいって、細かいところは後で調べたり別の書籍買って勉強するかな。

・9.2 最初のグラフの作成とセッション内での実行

計算グラフは作っても何も起こらない」というのを理解できなくて何回も読み返しました。書いてあるまんまなんですけど、「なんで」がループした感じですね。

初めてTensorFlowを使った身からすると、まず変数の箱を作るというのがすごく斬新でした。

グラフを作った後は、Session()コマンドで計算実行のセッションを開始し、計算が終わったらSession.close()で終わりを明示的に宣言する。しかもセッション内は全てSession.run()で実行されるというね。

Session.png

これだとセッションが閉じられていないのに、他のことをしてしまう危険性があるということで、withを使う方法が紹介されています。個人的にはこちらの方が好きですね。

with.png


※TensorFlow2では...

Sessionという概念がなくなったようです。

【参考】
tensorflow 2.0 の紹介(日本語訳)
Design Documentから見たTensorFlow 2.0の変更点

例えば、$f = x^2y + y +2$ を $x=3\,,\,y=4$ として、こんな計算グラフを使って計算したいとします。

計算グラフ.png

TensorFlow1では、

import tensorflow as tf

# ★計算グラフの構築
x = tf.Variable(3, name = "x")
y = tf.Variable(4, name = "y")
f = x*x*y + y +2

# ★計算の実行
sess = tf.Session() # TensorFlowセッションを開く
                    # 計算グラフを用いた計算をするには必ず必要
sess.run(x.initializer) # 変数の初期化
sess.run(y.initializer)
result = sess.run(f) # fの評価
print(result) # 計算結果の表示
sess.close # TensorFlowを閉じる

出力はもちろん

42

です。TensorFlow2ではSessionの概念がなくなったのでこれが使えないのですが、基本的な概念がよくわかっていないためどうしたらいいのやら。。。
とりあえずあれこれ調べて公式にtf.functionがいいよって書いてあったのでこれを使います。

import tensorflow as tf

# 変数のセット
x = tf.Variable(3)
y = tf.Variable(4)

# tf.functionで関数を作る
@tf.function
def f(x, y):
    return x*x*y + y + 2

result = f(x, y)
print(result)

出力はこんな感じ。たしかに分かりやすい。っていうかTensorFlow2の方がPytonぽさがありますね。

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

・9.3 グラフの管理

何言っているのかよくわからなかった。
あとで調べる。

・9.4 ノードの値のライフサイクル

ほぇーという感じでした。まず、第一にTensorFlowが自動的にノード間の依存関係を拾ってくれる点に感動し、次に計算結果が再利用されない点にほぇーとなりました。

再利用されないというのは、例えば、

w = tf.constant(3)
x = w + 2
y = x + 5
z = x * 3

という計算があった時に、$y$ と $z$ を評価するのに

1⃣
1. $w = 3$
2. $x = w + 2$

3. $y = x + 5$

2⃣
1. $w = 3$
2. $x = w + 2$

3. $z = x * 3$

という処理が行われるみたいです。何かというと、$w = 3$ と $x = w + 2$ は、$y$ を求める時にも $z$ を求める時にも共通して必要なものなのに、わざわざ再計算されるということみたいです。つまり、赤字部分は同じだから人間なら1回しか計算しませんが、TensorFlowでは2回計算するということですね。

一回で処理させたい場合には、やはりwithを使います。

with tf.Session() as sess:
    y_val, z_val = sess.run([y, z])

でもこれTensorFlow2でもあるのかな・・・

・9.5 TensorFlowによる線形回帰

なんか突然TensorFlowで、カリフォルニアの住宅価格データセットを使った線形回帰をしています。DeepLearning用のためだけのライブラリじゃないよってことかな。

・9.6 勾配降下法の実装

3種類の勾配の計算を説明してくれています。すなわち、
・マニュアルによる勾配計算
・自動微分を使う
・オプティマイザを使う
です。
マニュアルは愚直にコードを書いて計算する方法で、自動微分はTensorFlowが自動的に効率の良い方法で勾配を計算してくれるという優れもののようです。オプティマイザは、書籍の説明だと「自動微分よりも優れている」的なことしか書いていないのですが、最適化のための関数といういうことなのでしょうか?

・9.7 訓練アルゴリズムへのデータの供給

プレースホルダ-の使い方が書いてあるが、TensorFlow2ではプレースホルダーは廃止になっているらしい。
TensorFlow1と2でものすごく違うものになっている気がするけど、本当にこの本で勉強を進めることが最適なのだろうかという気がしてきました。

・9.8 モデルの保存と復元

モデルを使いまわしたり、他のプログラムで使ったり、他のモデルと比較したりするために、モデルを復元したいということがあります。他にも訓練を最初からやり直すのではなく、途中からやり直したい場合などにも復元する必要があります。TensorFlowでは、この復元が非常に容易らしいです。

書籍では restore() を使う方法が書いてありますが、公式では keras による方法が紹介されていました。これは確かに便利ですね。

★参考★

[1] TensorFlow 2.0 主な変更点(S-Analysis)
[2] tensorflow 2.0 の紹介(日本語訳)
[3] Design Documentから見たTensorFlow 2.0の変更点
[4] TensorFlow2.0ついにリリース!

greatonbi
基本的だけど調べてもあまり出てこないものについてメモしています。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away