Pythonの楽しいAI最もホットなアプリケーションフレームワークTensorFlow練習☝☝☝

Pythonの楽しいAI最もホットなアプリケーションフレームワークTensorFlow練習 

 

ますます広範の研究および製品でTensorFlowのアプリケーションでは、多くの開発者や研究者はさらに、この深い学習の枠組みを研究するために期待しています。フレームワークの投票で2144年に発売され、ほとんどのヒト昨日は、1441人の参加者はTensorFlowフレームワークを使用している必要があり、フレームワークは、すべての最高の使用です。しかし、この静的演算マップは、いくつかの学習費ので、ピットストップの初心者への準備をたくさん持っているTensorFlow。この記事では、初心者がTensorFlowプログラミングのスキルを把握するのに役立つためにステップにより、簡単な理論と実践のステップを設計したチュートリアルの学習TensorFlowシリーズについて説明します。

このチュートリアルシリーズは、あなたが畳み込みニューラルネットワークを実装するために選んだのはなぜTensorFlowからの6つの部分に分割され、必要に応じて初心者のスキルを紹介します。ほとんどのヒト本明細書では、静的な図コンピューティング、テンソル、TensorBoard可視化およびモデルパラメータを格納、などを含む利点と欠点などカフェTensorFlow基地PyTorchと深い学習フレームワークを記述する。

 

なぜTensorFlow?

この記事では、我々はあなたがアプリケーションに最適なフレームワークを選択するため、(カフェ、Theano、PyTorch、TensorFlowとKerasを含む)で最も人気のある深い学習フレームワークを比較します。

カフェ1:最初の主流の生産深い学習ライブラリ、2014年に、UCバークレー校によって開始。

利点:

  • 速いです

  • GPUのサポート

  • かなりのMatlabとPythonインタフェース

短所:

  • 柔軟ではありません。カフェでは、各ノードは、レイヤとして扱われるので、あなたは、新しいタイプの層をしたい場合、あなたは完全な前方、後方、および勾配更新プロセスを定義する必要があります。これらの層は、あなたが無限のリストを選択する必要があり、ネットワーク構築ブロックです。(対照的に、TensorFlowに、各ノードは、行列加算、乗算又は畳み込みとしてテンソル演算である。簡単にこれらの操作として、層組成物を定義することができる。このようTensorFlow以上を許可小さいビルディングブロック柔軟かつモジュラー。)

  • これは、不必要な冗長コードの多くを必要とします。あなたはCPUとGPUの両方をサポートしたい場合は、それぞれの追加機能のために達成する必要があります。また、あなたのモデルを定義するために、通常のテキストエディタを使用する必要があります。本当に頭痛!それは、異なるコンポーネント間の良好なモジュール方式であるため、ほとんどの人は、プログラムでモデルを定義したいと考えています。興味深いことに、カフェTensorFlowの主な建築家は、今のチームで働きます。

  • 特異性。コンピュータビジョンにのみターゲット(しかし、非常によく行います)。

  • これは、Pythonで書かれていません!あなたは新しい変化を導入する場合は、C ++およびCUDAに(小さな変化のために、あなたはPythonとMatlabのインターフェースで使用することができます)をプログラムする必要があります。

  • 悪いドキュメント。

  • インストールより困難!依存関係が多数あります。

  • 入力フォーマットのごく一部の種類の、唯一の出力フォーマットHDF5(あなたが常に実行にはPython / C ++ / Matlabのインターフェースのためにそれを使用し、出力データを得ることができますが)。

  • ネットワークサイクルを構築するため使用できません。

Theano 2:モントリオール大学の研究チームによって構築されました。Keras、ラザニアやブロックを含むライブラリーを構築しTheanoトップオープン深度値、。2017年9月28日発表のヨシュア・ベンジオは、Theanoの開発は終了しますだから、実際にはTheanoは死んでいます!

利点:

  • 美しい抽象計算グラフ(同等TensorFlow)

  • CPUとGPUは、最適化されています

  • まあ数値最適化タスクに適応

  • アドバンストパッケージ(Keras、ラザニア)

短所:

  • 元Theanoのみ、比較的低レベルのAPI

import numpy
           for _ in range(T):
               h = torch.matmul(W, h) + b
  • 大きなモデルは、コンパイルに時間がかかる場合があります

  • これは、マルチGPUをサポートしていません。

  • エラーメッセージが便利(と時々イライラ)ではないかもしれません

Pytorch 3.:2017インディアン1越、PythonのトーチライブラリのFacebookのバージョン(LUAで書かれた)オープンソース。

利点:

  • 図動的計算(図手段実行時に生成される)、RNNを使用した場合、例えば、それは非常に有用である、あなたは、可変長の入力と出力を処理することを可能にします。

  • 別の例として、PyTorchに、あなたはループのために書くための標準的なPythonの構文を使用することができます。

  • 事前研修モデルが多数

  • モジュラー部品の多数の容易な組み合わせ

  • GPU上で実行するために、簡単に、独自の層の種類を書くのは簡単

  • 「TensorBoard」はいくつかの重要な機能が欠けている場合は、「Losswise」Pytorchの代用として使用することができます

短所:

  • 公式文書以外のリミテッド参考/リソース

  • いいえ商用サポートしません

4. TensorFlow:下位記号計算ライブラリーの組合せ(例えばTheano)と上位ネットワーク仕様ライブラリ(例えば、ブロックおよびラザニア)一緒。

利点:

  • Googleが、開発を継続的なサポートを保証することができますので、開発、保守、およびします。

  • 巨大な、活発なコミュニティ

  • ネットワークトレーニング低レベル、高レベルのインタフェース

  • 「TensorBoardは、」ネットワークトポロジのパフォーマンスを追跡し、デバッグを容易にするために設計された強力な可視化パッケージです。

  • Pythonで書かれた非常に読み取り可能なプログラミング言語であり、(いくつかの部分は、パフォーマンスに大きな影響は、C ++を用いて達成される持っているが)

  • マルチGPUのサポート。だから、自由にプログラムを停止または再起動することなく、異なるコンピュータ上でコードを実行することができます

  • Theanoベースモデルコンパイラオプションよりも速く

  • Theanoより短いコンパイル時間

  • TensorFlow深い学習だけでなく、学習ツールや他のアルゴリズムを強化するためのサポートをサポートしていないだけ。

短所:

  • 図純粋なPythonは計算、したがって遅いです

  • 図構造は、マップが実行を「コンパイル」しなければならないことを意味し、静的です

Keras 5: Kerasは、より高度な、最もユーザーフレンドリーなAPIで、Googleの脳チームメンバーフランシスCholletによって書かれ、維持され、設定可能な後端を持っています。

利点:

  • それは読みやすいし、使用すること、深い学習モデルを構築するために、高レベルのAPIを提供します

  • 仕様書の作成

  • 大規模な、活発なコミュニティ

  • 上記にある他のライブラリ深い学習(例えばTheanoとTensorFlow、設定可能)

  • オブジェクト指向設計を使用して、すべてのコンテンツオブジェクトは、(例えば、ネットワーク層のパラメータ、最適化、等)であると考えられます。すべてのモデルパラメータは、オブジェクトのプロパティとしてアクセスすることができます。

例えば:

  • model.layers [3]モデルを提供する第三の層を.OUTPUT

  • model.layers [3]シンボルリストテンソル重量.weights

短所:

  • 目的は非常に一般的ですので、それは非常にパフォーマンスの面で不足しています

  • (それのために最適化されていないので)、しかしバックエンドTheano良い結果と併せて使用する場合、バックエンドと組み合わせて使用​​するときは、パフォーマンス上の問題を抱えているTensorFlow

  • TensorFlow又は可撓性PyTorch異なり

TensorFlowの基礎

数値計算のためのデータフローグラフ(データフローグラフ)、オープンソースソフトウェアライブラリを使用TensorFlow。データ転送がテンソルテンソル(多次元配列)の代表であり、フローは代表図を計算を用いて計算しました。「ノード」(ノード)及び「エッジ」(エッジ)とのデータフロー図は、有向グラフ数学演算を説明するために構成されています。「ノード」は、通常適用される数学的演算を示すために使用されるだけでなく、出発点のデータ入力と出力の終了を示す、または/書き込み終了固定変数(永続変数)を読み取ることができます。ノード間の入力/出力関係の側。データ転送エッジが動的に多次元データ配列、すなわちテンソル(テンソル)の寸法を調整することができます。

図・コンピューティング・セッション

「計算マップ」方法 - 最初のステップは、TensorFlowその主な特徴を学習し理解することです。TensorFlowは、実質的にすべてのコードは、2つの重要な部品で構成されています。

1.「算出マップ」を作成し、計算データの流れていることを示し

2.ファイル名を指定して実行「セッション」、操作を実行

実際には、別の定義は、その実行から計算TensorFlow。二つの部分は、以下のセクションで詳細に説明します。それまでは、最初のステップは、TensorFlowをインポートすることであることを忘れないでください!

import tensorflow as tf

このように、PythonはTensorFlowのすべてのクラス、メソッド、およびシンボルにアクセスすることができます。後で、我々はそのの完全な名前で文字を入力する代わりにそれを使用できるように、このコマンドを使用すると、TensorFlowライブラリは、別名「TF」の下にインポートされます「TensorFlow。」

1.図の計算

TensorFlow創造的なアイデアは、最大の数値計算は、図のように表現されます。別の言い方をすれば、任意のバックボーンTensorFlowプログラムは、算出マップです。公式サイトTensorFlow述べたように、「計算チャートをTensorFlowグラフノード上で一連の操作で構成されています。」

まず、ノードおよび操作は何ですか?例えば、説明するための最良の方法。我々 "X ^ 2Y + Y + 2 F(X、Y)=" 仮定関数のコードを書きます。次のように図TensorFlowの計算は次のとおりです。

図2:TensorFlow図の計算の構築。

上記のように、図は、構成を相互接続エッジによって算出一連のノードがあります。各ノードは、操作(オペレーション)の略称、OPと呼ばれています。各ノードは、このように、操作の発生またはテンソルテンソル計算されるかもしれない計算を表します。各入力としてゼロ以上のカードの量でノード、及び出力としてテンソルを生成します。

それでは、簡単な計算グラフを作成してみましょう。

import tensorflow as tf
a = 2
b = 3
c = tf.add(a, b, name='Add')
print(c)
______________________________________________________
Tensor("Add:0", shape=(), dtype=int32)

図は、計算された変数に対して生成されました:

図3:左:Tensorboard図で生成さを可視化;右:変数を生成(取得デバッガPyCharmスクリーンショットからデバッグモードで動作しているとき)

実際のノードを評価するために、図に計算されるセッションで実行しなければなりません。手短に言えば、唯一書かれたコードは、それらの上で実行予想されたサイズ及びテンソル図の動作を決定するために使用される生成します。しかし、それは任意のテンソルに割り当てられません。

したがって、TensorFlowグラフは、Pythonでの定義と同様に機能します。それはあなたが任意の計算を行うよう(単に関数定義のように何の実行結果は存在しません)「ノー」です。これは、「のみ」のコンピューティング操作を定義します。

2.セッション(セッション)

TensorFlowでは、すべての異なる変数と動作は、図の計算に格納されています。我々はグラフ化して必要なモデルを構築した後ので、また、あなたは全体の計算チャートを実行するために、セッション(セッション)を開く必要があります。セッションでは、我々はすべての利用可能なCPUとGPUリソ​​ースへの分布を計算することができます。簡単な例として、図は、コンピューティングを実行し、cの値を求めます。

sess = tf.Session()
print(sess.run(c))
sess.close()
__________________________________________
5

このコードは、(SESのに譲渡された)セッション()オブジェクトを作成し、(2行目)、図十分なコンピューティングCを評価するために実行するために、その操作方法を呼び出します。計算は、システムリソースを取り戻す手助けするために、セッションを閉じる必要があり、またはリソースリークを完了した後に問題が発生します。

TensorFlowテンソル

import tensorflow as tf

TensorFlow 中最基本的单位是常量(Constant)、变量(Variable)和占位符(Placeholder)。常量定义后值和维度不可变,变量定义后值可变而维度不可变。在神经网络中,变量一般可作为储存权重和其他信息的矩阵,而常量可作为储存超参数或其他结构信息的变量。

1. 常量

创建一个节点取常数值,它接收以下的变量:

tf.constant(value, dtype=None, shape=None, name='Const', verify_shape=False)

我们来创建两个常量并将它们加起来。常量张量可以通过定义一个值来简单地定义:

# create graph
a = tf.constant(2)
b = tf.constant(3)
c = a + b
# launch the graph in a session
with tf.Session() as sess:
    print(sess.run(c))
____________________________________________________
5    

现在我们来看看创建的计算图和生成的数据类型:

2. 变量

变量是状态性的节点,输出的是它们当前的值,意味着它们可以在一个计算图的多次执行中保留它们的值。它们有一系列的有用特征,例如:

它们可以在训练期间或训练后保存到硬盘上。这允许来自不同公司和团队的人们保存、恢复和发送他们的模型参数给别人。

默认情况下,梯度更新(在所有神经网络中应用)将应用到计算图中的所有变量。实际上,变量是你希望调整以最小化损失函数的东西。

为了创建变量,你可以按如下方式使用 tf.Variable:

# Create a variable.
w = tf.Variable(<initial-value>, name=<optional-name>)

以下语句声明一个 2 行 3 列的变量矩阵,该变量的值服从标准差为 1 的正态分布,并随机生成。

w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))

TensorFlow 还有 tf.truncated_normal() 函数,即截断正态分布随机数,它只保留 [mean-2*stddev,mean+2*stddev] 范围内的随机数。

调用 tf.Variable 来创建一个变量是一种老方法。TensorFlow 推荐使用封装器 tf.get_variable,它能接收命名、形状等参数:

tf.get_variable(name,
                shape=None,
                dtype=None,
                initializer=None,
                regularizer=None,
                trainable=True,
                collections=None,
                caching_device=None,
                partitioner=None,
                validate_shape=True,
                use_resource=None,
                custom_getter=None,
                constraint=None)

变量在使用前需要初始化。为此,我们必须调用「变量初始值设定项操作」,并在 session 上运行该操作。

a = tf.get_variable(name="var_1", initializer=tf.constant(2))
b = tf.get_variable(name="var_2", initializer=tf.constant(3))
c = tf.add(a, b, name="Add1")

# launch the graph in a session
with tf.Session() as sess:
    # now let's evaluate their value
    print(sess.run(a))
    print(sess.run(b))
    print(sess.run(c))

3. 占位符

我们已经创建了各种形式的常量和变量,但 TensorFlow 同样还支持占位符。占位符并没有初始值,它只会分配必要的内存。在会话中,占位符可以使用 feed_dict 馈送数据。

feed_dict 是一个字典,在字典中需要给出每一个用到的占位符的取值。在训练神经网络时需要每次提供一个批量的训练样本,如果每次迭代选取的数据要通过常量表示,那么 TensorFlow 的计算图会非常大。因为每增加一个常量,TensorFlow 都会在计算图中增加一个节点。所以说拥有几百万次迭代的神经网络会拥有极其庞大的计算图,而占位符却可以解决这一点,它只会拥有占位符这一个节点。

a = tf.constant([5, 5, 5], tf.float32, name='A')
b = tf.placeholder(tf.float32, shape=[3], name='B')
c = tf.add(a, b, name="Add")

with tf.Session() as sess:
    # create a dictionary:
    d = {b: [1, 2, 3]}
    # feed it to the placeholder
    print(sess.run(c, feed_dict=d)) 
 ___________________________________________________
 [6. 7. 8.]

它生成的计算图与变量如下所示:

现在,我们已经能创建一个简单的神经网络。如下利用随机生成的数据创建了一个三层全连接网络:

import tensorflow as tf
from numpy.random import RandomState

batch_size=10
w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

# None 可以根据batch 大小确定维度,在shape的一个维度上使用None
x=tf.placeholder(tf.float32,shape=(None,2))
y=tf.placeholder(tf.float32,shape=(None,1))

#激活函数使用ReLU
a=tf.nn.relu(tf.matmul(x,w1))
yhat=tf.nn.relu(tf.matmul(a,w2))

#定义交叉熵为损失函数,训练过程使用Adam算法最小化交叉熵
cross_entropy=-tf.reduce_mean(y*tf.log(tf.clip_by_value(yhat,1e-10,1.0)))
train_step=tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

rdm=RandomState(1)
data_size=516

#生成两个特征,共data_size个样本
X=rdm.rand(data_size,2)
#定义规则给出样本标签,所有x1+x2<1的样本认为是正样本,其他为负样本。Y,1为正样本
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    print(sess.run(w1))
    print(sess.run(w2))
    steps=11000
    for i in range(steps):

        #选定每一个批量读取的首尾位置,确保在1个epoch内采样训练
        start = i * batch_size % data_size
        end = min(start + batch_size,data_size)
        sess.run(train_step,feed_dict={x:X[start:end],y:Y[start:end]})
        if i % 1000 == 0:
            training_loss= sess.run(cross_entropy,feed_dict={x:X,y:Y})
            print("在迭代 %d 次后,训练损失为 %g"%(i,training_loss))

上面的代码定义了一个简单的三层全连接网络(输入层、隐藏层和输出层分别为 2、3 和 2 个神经元),隐藏层和输出层的激活函数使用的是 ReLU 函数。该模型训练的样本总数为 512,每次迭代读取的批量为 10。这个简单的全连接网络以交叉熵为损失函数,并使用 Adam 优化算法进行权重更新。

其中需要注意的几个函数如 tf.nn.relu() 代表调用 ReLU 激活函数,tf.matmul() 为矩阵乘法等。tf.clip_by_value(yhat,1e-10,1.0) 这一语句代表的是截断 yhat 的值,因为这一语句是嵌套在 tf.log() 函数内的,所以我们需要确保 yhat 的取值不会导致对数无穷大。

TensorBoard 基础

TensorBoard 是一个可视化软件,在所有的 TensorFlow 标准安装中都包含了 TensorBoard。按谷歌的话说:「使用 TensorFlow 执行的计算,例如训练一个大规模深度神经网络,可能复杂且令人困惑。为了更加容易理解、调试和优化 TensorFlow 程序,我们内置了一套可视化工具,即 TensorBoard。」

TensorFlow 程序既能解决非常简单也能解决非常复杂的问题,它们都有两种基本组件——运算和张量。如前所述,你创建了一个由一系列运算构成的模型,馈送数据到模型上,张量将在运算之间流动,直到得到了输出张量,即你的结果。

完全配置好后,TensorBoard 窗口将呈现与下图类似的画面:

TensorBoard 的创建是为了帮助你了解模型中张量的流动,以便调试和优化模型。它通常用于两项任务:

1. 图形可视化

2. 编写摘要(或可视化学习)

在本教程中,我们将介绍 TensorBoard 的上述两项主要用法。尽早学习使用 TensorBoard,可以让使用 TensorFlow 的工作更有趣也更有成效。

1. 计算图可视化

强大的 TensorFlow 计算图会变得极其复杂。可视化图形有助于理解并对其进行调试。这是一个在 TensorFlow 网站工作的可视化示例。

为了激活 TensorFlow 程序 TensorBoard,需要向其中添加几行代码。这将把 TensorFlow 运算导出到一个名为「event file」(或 event log file)的文件中。TensorBoard 能够读取此文件并深入了解模型图及其性能。

现在我们来编写一个简单的 TensorFlow 程序,并用 TensorBoard 可视化其计算图。先创建两个常量并将其添加到一起。常数张量可以简单地通过定义它们的值来定义:

import tensorflow as tf

# create graph
a = tf.constant(2)
b = tf.constant(3)
c = tf.add(a, b)
# launch the graph in a session
with tf.Session() as sess:
    print(sess.run(c))
_____________________________________________
5 

为了用 TensorBoard 可视化程序,我们需要编写程序的日志文件。为了编写事件文件,我们首先需要为那些日志编写一个 writer,使用以下代码:

writer = tf.summary.FileWriter([logdir], [graph])

其中 [logdir] 是你想要保存那些日志文件的文件夹。你可以选择 [logdir] 作为某些有意义的东西,例如『./graphs』。第二个参数 [graph] 是我们正在编写的程序的计算图。有两种获取计算图的方法:

1. 使用 tf.get_default_graph() 调用计算图,返回程序的默认计算图

2. 将计算图设置为 sess.graph,返回会话的计算图(注意这里需要我们已经创建了会话)

我们将在以下的例子中展示两种方法。然而,第二种方法更加常用。不管用哪种方法,确保仅当你定义了计算图之后才创建一个 writer。否则,TensorBoard 中可视化的计算图将是不完整的。让我们添加 writer 到第一个例子中并可视化计算图。

import tensorflow as tf

# create graph
a = tf.constant(2)
b = tf.constant(3)
c = tf.add(a, b)

# creating the writer out of the session
# writer = tf.summary.FileWriter('./graphs', tf.get_default_graph())

# launch the graph in a session
with tf.Session() as sess:
    # or creating the writer inside the session
    writer = tf.summary.FileWriter('./graphs', sess.graph)
    print(sess.run(c))
    # don't forget to close the writer at the end
    writer.close()

接下来转到 Terminal,确保当前工作目录与运行 Python 代码的位置相同。例如,此处我们可以使用以下代码切换到目录

$ cd ~/Desktop/tensorboard

接下来运行:

$ tensorboard --logdir="./graphs" —port 6006

这将为你生成一个链接。ctrl + 左键单击该链接(或将其复制到浏览器中,或只需打开浏览器并转到 http://localhost:6006/)。接下来将显示 TensorBoard 页面,如下所示:

参数存储与加载

在基础部分中,最后还介绍了模型参数的保存与恢复。一般 TensorFlow 模型持久化可使用 tf.train.Saver() 完成,它会将 TensorFlow 模型保存为 .ckpt 格式的文件。一般该文件目录下会有三个文件,第一个 model.ckpt.meta 保存了 TensorFlow 计算图的结构,第二个 model.ckpt 文件保存了 TensorFlow 中每一个变量的取值,而最后一个 cheekpoint 文件保存了同目录下所有的模型文件列表。

为了保存和恢复模型变量,我们需要在构建计算图后调用 tf.train.Saver(),例如:

# create the graph
X = tf.placeholder(..)
Y = tf.placeholder(..)
w = tf.get_variale(..)
b = tf.get_variale(..)
...
loss = tf.losses.mean_squared_error(..)
optimizer = tf.train.AdamOptimizer(..).minimize(loss)
...

saver = tf.tfain.Saver()

在训练模式中,我们需要打开会话初始化变量和运行计算图,并在训练结束时调用 saver.save() 保存变量:

# TRAIN
with tf.Session() as sess:
    sess.run(tf.globale_variables_initializer())
    # train our model
    for step in range(steps):
        sess.run(optimizer)
        ...
    saved_path = saver.save(sess, './my-model', global_step=step)

在测试模式中,我们需要使用 saver.restore() 恢复参数:

# TEST
with tf.Session() as sess:
    saver.restore(sess, './my-model')
    ...

当然,模型持久化还有非常多的内容,例如由 MetaGraphDef Protocol Buffer 定义的计算图节点元数据。读者可继续阅读完整的教程或其它书籍以了解详细信息。

おすすめ

転載: www.cnblogs.com/itye2/p/11653459.html