この記事では、ロジスティック回帰を使用して、テンソルフローの基本的な開発手順を示す例として2次元データを適合させます。
例:一見混沌としたデータのセットからy≈2xの法則を見つけます
説明の例:
xとyの間の対応する関係がy≈2xであるデータセットのセットがあるとします。
ディープラーニングには、おおよそ4つのステップがあります。
(1)データの準備
(2)モデルの構築
(3)反復トレーニング
(4)モデルの使用
3.反復トレーニング
(1)トレーニングモデル
深い学習(1)TensorFlow基本的な開発手順を学習の最初のステップ:モデル(フォワード+リバース)データを用意し、構築するモデルを構築する第2工程を、モデルをすることができることに訓練を通して反復。
注:テンソルフローのタスクはセッションを通じて実行されます
# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量
# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2
# 启动session
with tf.Session() as sess:
sess.run(init) # 通过sess.进行网络节点的运算
plotdata = {
"batchsize":[],"loss":[]} # 存放批次值和损失值
# 向模型输入数据
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={
X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置
# 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
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!")
print ("cost=", sess.run(cost, feed_dict={
X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
結果は次のことを示しています。
上記の結果から、コスト(生成された予測値と真の値のギャップ)は常に小さくなり、Wとb(2つのパラメーター)は常に変化していることがわかります。
(2)トレーニングモデルの視覚化
# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量
# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2
# 启动session
with tf.Session() as sess:
sess.run(init) # 通过sess.进行网络节点的运算
plotdata = {
"batchsize":[],"loss":[]} # 存放批次值和损失值
# 向模型输入数据
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={
X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置
# 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
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!")
print ("cost=", sess.run(cost, feed_dict={
X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
def moving_average(a,w=10): # 定义moving_average()函数
if len(a) < w:
return a[:]
return [val if idx<w else sum(a[(idx-w):idx])/w for idx,val in enumerate(a)]
#图形显示
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()
結果は次のことを示しています。
- 最初の図に示されている斜線は、モデルのパラメーターwとbが一定の場合に形成されるxとyの線形方程式であり、y = 2xのほぼ直線です。
- 2枚目の写真では、最初は損失値が減少しており、5回目頃に安定していることがわかります。
4.モデルを使用します
モデルのトレーニング後は、入力値を渡すだけで、sess.runを使用してモデル内の各ノードを実行し、モデルを使用できます。
# 初始化变量
init = tf.global_variables_initializer() # global_variables_initializer()函数初始化所有变量
# 训练参数
training_epochs = 20 # 设置迭代次数为20次
display_step = 2
# 启动session
with tf.Session() as sess:
sess.run(init) # 通过sess.进行网络节点的运算
plotdata = {
"batchsize":[],"loss":[]} # 存放批次值和损失值
# 向模型输入数据
for epoch in range(training_epochs):
for (x, y) in zip(train_X, train_Y):
sess.run(optimizer, feed_dict={
X: x, Y: y}) # 通过feed机制将真实数据灌到占位符(第二步创建模型时)对应的位置
# 输出显示训练中的详细信息,每执行一次都会将网络结构的节点打印出来
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!")
print ("cost=", sess.run(cost, feed_dict={
X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
def moving_average(a,w=10): # 定义moving_average()函数
if len(a) < w:
return a[:]
return [val if idx<w else sum(a[(idx-w):idx])/w for idx,val in enumerate(a)]
#图形显示
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()
print ("x=0.2,z=", sess.run(z, feed_dict={
X: 0.2}))
たとえば、上記のコードの最後の行は次のとおりです。0.2(feed_dict = {X:0.2})を渡してから、sess.runを使用してモデル内のzノードを実行すると、生成される値を表示できます。 。
結果を生成します: