この記事では、主にTensorFlowの基本、一般的に使用されるセッション、定数の定義、モデルの生成、モデルの保存、およびモデルに実際に保存されたコンテンツを表示する方法について説明します。
1.TensorFlowモデル
TensorFlowの名前は、その動作原理に基づいています。テンソル(テンサー)はN次元配列を表し、フロー(フロー)はデータフローグラフに基づく計算を意味します。
Tensorflowは、テンソルが画像の一方の端からもう一方の端に流れる計算(プログラミングモデル)です。
2.モデルの操作メカニズム
TensorFlowの操作メカニズムは、「定義」と「操作」から分離されています。運用の観点から、モデル構築とモデル運用の2つのレイヤーに分かれています。
モデル構築に必要な概念は次のとおりです。
上記の定義は「画像」です。
- 「グラフ」は計算タスクです
- モデルの実行中、セッションで「グラフ」が開始されます。
- セッションは、グラフの操作をCPUまたはGPUデバイスに配布してから、操作を実行する方法を提供します。実行後、Tensor値を返します。pythonでは、返されるTensorはnumpy ndarryオブジェクトです。CまたはC ++では、Tensorインスタンスを返します。
セッションとグラフの動作関係は次のとおりです。
実際の環境では、上図の操作は、トレーニングシナリオ、テストシナリオ、使用シナリオの3種類に分けられます。トレーニングシーンは他の2つのシーンとは異なります。
(1)トレーニングシナリオ:サンプルの学習とトレーニング、学習パラメーターの調整、および最終モデルの形成を通じて、モデルを最初から実現するプロセス。
プロセス:指定されたサンプルとラベルを入力ノードとして、多数のループの繰り返しを通じて、グラフの順方向操作(入力サンプルからop操作を介して出力方向を取得)によって取得された値、および逆方向操作(出力から)入力方向)、モデルの学習パラメーターを更新し、最後にモデルの肯定的な結果を最大化する近いサンプルラベルを取得します。
(2)テストシナリオとアプリケーションシナリオ:テストシナリオでは、グラフの順方向計算を使用して結果を実際の値と比較し、エラー値を取得します。使用シナリオでは、グラフの順方向計算を使用して結果を取得し、直接使用します。関数では、実際のパラメーター、正式なパラメーター、関数本体、および戻り値に分割できます。モデルでは、実際のパラメーターは入力サンプルであり、正式なパラメーターはプレースホルダーであり、操作プロセスは関数本体と同等であり、得られた結果は戻り値です。
セッションとグラフ間の相互作用の下で定義されたその他のデータフロー:
- インジェクションメカニズム(フィード):プレースホルダーを介してデータをパターンに渡します
- フェッチメカニズム(フェッチ):パターンから結果を取得します
3つの例
1.セッションの役割と使用例
# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time : 2019/5/15 11:32
# @Author : xhh
# @Desc : session的演示
# @File : tensor_tf4.py
# @Software: PyCharm
import tensorflow as tf
hello = tf.constant('hello, tensorflow') # 定义一个常量
sess = tf.Session() # 建立一个session
print(sess.run(hello)) # 通过sess中的run函数来运行结果
sess.close() # 关闭session
動作結果:
注:定義する定数に中国語が含まれている場合、
hello = tf.constant('你好, tensorflow') # 定义一个常量
はい、コーディングの問題が発生します
上記のコードでは、tf.constantが定数を定義しており、helloのコンテンツはセッションの実行時にのみ返されます。
2.セッションでの使用
with sessionは、今後頻繁に使用するもので、Pythonでwith useを使用します。プログラムが終了すると、セッションは自動的に閉じられます。手動で閉じる必要はありません。
例:with sessionメソッドを使用してセッションを確立し、セッション内の2つの変数(3と4)の加算値と乗算値を計算します
import tensorflow as tf
a = tf.constant(3) # 定义常量3
b = tf.constant(4) # 定义常量4
with tf.Session() as sess: # 建立session
print("相加: %i"%sess.run(a+b))
print("相乘: %i"%sess.run(a*b))
動作結果:
3.注入メカニズム
特定の実際のパラメーターを対応するプレースホルダーに挿入します。フィードはそれを呼び出すメソッドでのみ有効であり、メソッドが終了するとフィードは消えます。
プレースホルダーを定義し、フィードメカニズムを使用してプレースホルダーを介して特定の値を渡し、それらを加算および乗算します。
import tensorflow as tf
a = tf.placeholder(tf.int16)
b = tf.placeholder(tf.int16)
add = tf.add(a, b)
mul = tf.multiply(a, b)
with tf.Session() as sess:
# 计算具体数值
print("feed相加:%i"%sess.run(add, feed_dict={a:3, b:4}))
print("feed相乘:%i"%sess.run(mul, feed_dict={a:3, b:4}))
動作結果:
マーキング方法:tf.placeholderを使用してこれらの操作のプレースホルダーを作成してから、feed_dictを使用して特定の値をプレースホルダーに配置します。
4.線形回帰モデルを保存/ロードします
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
plotdata = {"batchsize":[], "loss":[]}
def moving_average(a, w=10):
if len(a)<w:
return a[:]
return [val if idx < w else sum(a[(idx-w):idx])/w for idx, val in enumerate(a)]
# 模拟数据
train_X = np.linspace(-1, 1, 100)
train_Y = 2*train_X + np.random.randn(*train_X.shape)*0.3 # 加入了噪声
# 图形展示
plt.plot(train_X,train_Y,'ro',label="original data") # label数据标签
plt.legend()
plt.show()
tf.reset_default_graph() # 重置会话
# 创建模型
# 占位符
X = tf.placeholder("float")
Y = tf.placeholder("float")
# 模型参数
W = tf.Variable(tf.random_normal([1]), name="weight")
b = tf.Variable(tf.zeros([1]), name="bias")
# 前向结构
z = tf.multiply(X, W) +b
# 反向优化
cost = tf.reduce_mean(tf.square(Y-z))
learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# 初始化变量
init = tf.global_variables_initializer()
# 参数设置
training_epochs = 20
display_step = 2
saver = tf.train.Saver() # 模型生成,并保存
savedir = "log/"
# 启动session
with tf.Session() as sess:
sess.run(init)
for epoch in range(training_epochs):
for (x, y) in zip(train_X,train_Y):
sess.run(optimizer, feed_dict={X:x, Y:y})
# 显示训练中的详细信息
if epoch % display_step == 0:
loss = sess.run(cost, feed_dict={X:train_X, Y:train_Y})
print("Epoch:",epoch+1,"cost=", loss,"W=",sess.run(W),"b=",sess.run(b))
if not (loss=="NA"):
plotdata["batchsize"].append(epoch)
plotdata["loss"].append(loss)
print("finished!")
saver.save(sess, savedir+"linermodel.cpkt")
print("cost=",sess.run(cost, feed_dict={X:train_X, Y:train_Y}),"W=", sess.run(W),"b=",sess.run(b))
# 图形显示
plt.plot(train_X, train_Y, 'ro', label='Original data')
plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
plt.legend()
plt.show()
plotdata["avgloss"] = moving_average(plotdata["loss"])
plt.figure(1)
plt.subplot(211)
plt.plot(plotdata["batchsize"], plotdata["avgloss"], 'b--')
plt.xlabel('Minibatch number')
plt.ylabel('Loss')
plt.title('Minibatch run vs. Training loss')
plt.show()
モデルは、同じディレクトリのログフォルダの下に生成されます。
セッションを再開してsess2という名前を付けた後、セーバーの復元機能を使用してモデルをロードします
# 重启一个Session
with tf.Session() as sess2:
sess2.run(tf.global_variables_initializer())
saver.restore(sess2, savedir+"linermodel.cpkt")
print("x=0.2, z=",sess2.run(z, feed_dict={X: 0.2}))
試験結果:
5.モデルの内容を表示します
保存したモデルの内部コンテンツを表示する
from tensorflow.python.tools.inspect_checkpoint import print_tensors_in_checkpoint_file
savedir = "log/"
print_tensors_in_checkpoint_file(savedir+"linermodel.cpkt",None,True)
動作結果:
操作の結果から、作成された変数の名前とその値がモデルに保存されていることがわかります。
私と私の友達の公式アカウントに注意を払うことができます~~~これは私の友達と私が時々更新するいくつかのpython技術資料です!!技術的な問題について話し合うためのメッセージを残すこともできます。サポートし、注意を払い、小さな広告をクリックしていただき、ありがとうございます~~