初心者向けディープラーニング(1)TensorFlowの基本的な開発ステップの反復トレーニングとモデルの使用

この記事では、ロジスティック回帰を使用して、テンソルフローの基本的な開発手順を示す例として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ノードを実行すると、生成される値を表示できます。 。

結果を生成します:
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45154565/article/details/109800508