掌握訓練過程的視覺化

在革命的征途中,瞭解敵情與自身狀況是制定正確戰略的關鍵。在本章中,我們將學習如何記錄和視覺化 TensorFlow 中模型訓練的歷史過程。通過這種方式,我們可以深入瞭解模型在訓練過程中的表現,就像在革命中不斷總結經驗,以便及時調整策略,提高效率和結果。

示例代碼:01-Iris-MLP_show.py

python

複製程式碼

# 省略部分代碼

history = model.fit(x_train, y_train2,

                    epochs=200,        # 設定訓練次數,相當於革命中的戰鬥回合

                    batch_size=128)    # 每次訓練的數據量,如同每次出擊的兵力

 

import matplotlib.pyplot as plt       # 導入繪圖函數

 

plt.plot(history.history['accuracy'])  # 繪製訓練準確率曲線

plt.plot(history.history['loss'])      # 繪製訓練損失率曲線

plt.title('模型準確率')                 # 圖表標題

plt.ylabel('準確率與損失率')            # Y軸標籤

plt.xlabel('訓練輪次')                  # X軸標籤

plt.legend(['準確率', '損失率'], loc='upper left')  # 圖例

plt.show()                             # 顯示圖表

執行結果

在我們的訓練過程中,可以看到損失率下降,準確率上升。這就如同在革命戰爭中,我們通過不斷的鬥爭和實踐,逐步取得勝利。評估模型的有效性,就像評估我們的戰鬥成果。如果在訓練過程中準確率沒有提升,這意味著我們的策略可能需要調整,就如同在戰場上需要改變戰術。

教學視頻:1-Iris-MLP_show.mp4


深度學習的優化——最短路徑策略

在革命鬥爭中,我們要善於尋找一條通往勝利的最短路徑。同樣,在深度學習中,訓練模型的過程就是通過不斷優化,找到損失函數的最小值,從而提高模型的預測能力。神經網路的優勢在於,只要給予大量的資料,經過多次反覆運算訓練,就能逐步逼近理想的結果。

優化策略

在模型編譯時,我們使用了 optimizer='adam',這相當於我們在革命中選擇了一種有效的戰略方針。常見的優化策略有:

  • SGD(隨機梯度下降):如同基本的遊擊戰法。
  • RMSprop:類似於根據敵情調整的靈活戰術。
  • Adagrad:針對特殊情況的自我調整策略。
  • Adadelta:在 Adagrad 基礎上的改進,適應長期作戰。
  • Adam:綜合多種優勢的優化策略,如同毛主席提出的人民戰爭思想。
  • Adamax:Adam 的擴展版本,適用於更廣泛的情況。
  • Nadam:結合了 Nesterov 動量的 Adam 優化器,追求更快的收斂。

這些優化器就像不同的作戰策略,目標都是通過調整模型參數,降低損失函數的值,從而取得最終的勝利。在訓練過程中,如果模型的表現有所改善,我們就繼續沿用當前的策略;如果沒有進展,就需要及時調整,就像在戰鬥中根據實際情況改變戰術。

想像一下,我們在一片複雜的山地中行軍,目標是找到最低的山谷。梯度指向損失函數下降最快的方向,優化演算法就是説明我們沿著最陡峭的下坡路,快速到達目標。


優化策略——Adam 演算法

在眾多的優化演算法中,Adam 演算法是一種高效的策略,就像在革命中,我們找到了一條適合自己的革命道路。Adam 演算法結合了動量和自我調整學習率的優點,能夠快速地收斂到全域最優解。

示例代碼:02-Iris-adam.py

python

複製程式碼

# 省略部分代碼

learning_rate = 0.01                      # 學習率,相當於我們的前進速度

opt1 = tf.keras.optimizers.Adam(lr=learning_rate)  # 使用 Adam 優化器

 

model.compile(

    optimizer=opt1,

    loss=tf.keras.losses.categorical_crossentropy,  # 使用交叉熵作為損失函數

    metrics=['accuracy']                            # 評價指標為準確率

)

 

history = model.fit(x_train, y_train2,

                    epochs=400,           # 訓練 400 個回合,類似於革命中的長期鬥爭

                    batch_size=16)        # 每次使用 16 個樣本,相當於每次出動的部隊規模

 

import matplotlib.pyplot as plt

plt.plot(history.history['accuracy'])

plt.title('Adam 模型準確率')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['訓練準確率'], loc='lower right')

plt.show()

執行結果

通過使用 Adam 優化器,我們的模型準確率逐步提高。這就如同在革命中,我們採取了正確的戰略,人民軍隊的戰鬥力不斷增強,最終取得了勝利。

教學視頻:2_opt-adam.mp4


優化策略——SGD 演算法

隨機梯度下降(SGD)是最基本的優化演算法之一,就像革命初期的遊擊戰。它每次只使用部分資料來更新模型參數,速度較慢,但穩紮穩打。

示例代碼:03-Iris-sgd.py

python

複製程式碼

# 省略部分代碼

learning_rate = 0.01

opt1 = tf.keras.optimizers.SGD(lr=learning_rate)   # 使用 SGD 優化器

 

model.compile(

    optimizer=opt1,

    loss=tf.keras.losses.categorical_crossentropy,

    metrics=['accuracy']

)

 

history = model.fit(x_train, y_train2,

                    epochs=400,

                    batch_size=16)

 

# 顯示訓練歷史

plt.plot(history.history['accuracy'])

plt.title('SGD 模型準確率')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['訓練準確率'], loc='lower right')

plt.show()

執行結果

通過 SGD 優化器,模型的準確率也在提升,但速度可能比 Adam 略慢。這就如同革命中,我們需要探索和嘗試,找到更有效的戰術。

教學視頻:3_opt-SGD.mp4


優化策略——RMSprop 演算法

RMSprop 演算法通過調整每個參數的學習率,加速了模型的收斂。這就像革命中,我們根據不同地區的情況,採取靈活的戰術,提高了戰鬥效率。

示例代碼:04-Iris-RMSprop.py

python

複製程式碼

# 省略部分代碼

learning_rate = 0.01

opt1 = tf.keras.optimizers.RMSprop(lr=learning_rate)  # 使用 RMSprop 優化器

 

model.compile(

    optimizer=opt1,

    loss=tf.keras.losses.categorical_crossentropy,

    metrics=['accuracy']

)

 

history = model.fit(x_train, y_train2,

                    epochs=400,

                    batch_size=16)

 

# 顯示訓練歷史

plt.plot(history.history['accuracy'])

plt.title('RMSprop 模型準確率')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['訓練準確率'], loc='lower right')

plt.show()

執行結果

使用 RMSprop 優化器,模型的準確率有了顯著提升。這體現了靈活戰略在實際應用中的重要性。

教學視頻:4_opt-RMSprop.mp4


其他優化策略的運用

在革命鬥爭中,我們需要根據具體情況,選擇不同的戰術。同樣,深度學習中還有其他優化演算法,如 Adagrad、Adadelta、Nadam 和 Momentum,它們在不同情況下各有優勢。

  • Adagrad:適合處理稀疏資料的優化器。
  • Adadelta:Adagrad 的改進版本,適用於長期訓練任務。
  • Nadam:結合了 Nesterov 動量和 Adam 的優化器,加速了收斂。
  • Momentum:在 SGD 基礎上加入動量,説明模型跳出局部最小值。

示例代碼:05-Iris-Adagrad.py

python

複製程式碼

learning_rate = 0.01

opt1 = tf.keras.optimizers.Adagrad(lr=learning_rate)

 

# 後續代碼與前面類似

執行結果

教學視頻:5_opt-Adagrad.mp4

示例代碼:06-Iris-Adadelta.py

python

複製程式碼

learning_rate = 0.01

opt1 = tf.keras.optimizers.Adadelta(lr=learning_rate)

 

# 後續代碼與前面類似

執行結果

需要注意的是,Adadelta 在我們的實驗中效果較差,訓練次數需要增加。這就如同某些戰術在特定環境下不適用,需要我們靈活調整。

教學視頻:6_opt_Adadelta.mp4


如何選擇優化策略

面對多種優化演算法,選擇最適合的策略至關重要。我們可以將所有演算法的訓練曲線繪製在同一張圖上,進行比較,就像在革命中分析各種戰術的優劣。

示例代碼:09-Iris-all.py

python

複製程式碼

# 省略部分代碼

 

# 定義模型訓練函數

def model(opti):

    model = tf.keras.models.Sequential()

    model.add(tf.keras.layers.Dense(units=10, activation=tf.nn.relu, input_dim=dim))

    model.add(tf.keras.layers.Dense(units=10, activation=tf.nn.relu))

    model.add(tf.keras.layers.Dense(units=category, activation=tf.nn.softmax))

 

    model.compile(

        optimizer=opti,

        loss=tf.keras.losses.categorical_crossentropy,

        metrics=['accuracy']

    )

 

    history = model.fit(x_train, y_train2, epochs=80, batch_size=16)

    return history

 

# 使用不同優化器訓練模型

learning_rate = 0.01

history_Adam = model(tf.keras.optimizers.Adam(lr=learning_rate))

history_SGD = model(tf.keras.optimizers.SGD(lr=learning_rate))

history_RMSprop = model(tf.keras.optimizers.RMSprop(lr=learning_rate))

history_Adagrad = model(tf.keras.optimizers.Adagrad(lr=learning_rate))

history_Adadelta = model(tf.keras.optimizers.Adadelta(lr=learning_rate))

history_Nadam = model(tf.keras.optimizers.Nadam(lr=learning_rate))

history_mom = model(tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9))

 

# 繪製所有優化器的準確率曲線

import matplotlib.pyplot as plt

plt.plot(history_Adam.history['accuracy'])

plt.plot(history_SGD.history['accuracy'])

plt.plot(history_RMSprop.history['accuracy'])

plt.plot(history_Adagrad.history['accuracy'])

plt.plot(history_Adadelta.history['accuracy'])

plt.plot(history_Nadam.history['accuracy'])

plt.plot(history_mom.history['accuracy'])

plt.title('優化器的準確率比較')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['Adam', 'SGD', 'RMSprop', 'Adagrad', 'Adadelta', 'Nadam', 'Momentum'], loc='lower right')

plt.show()

執行結果

從圖中可以看出,Nadam 優化器的表現最佳,其次是 Momentum 和 RMSprop,而 Adadelta 表現較差。這就如同在革命中,我們需要選擇最適合當前形勢的戰略,以取得勝利。

教學視頻:9_opt_all.mp4


特徵資料的標準化

在革命中,瞭解和改造客觀世界是取得勝利的基礎。同樣,在深度學習中,對特徵資料進行標準化處理,有助於提高模型的性能。

歸一化

歸一化的目的是將資料轉換到 0 到 1 之間,消除量綱的影響,常用方法有:

  • 線性轉換y = (x - MinValue) / (MaxValue - MinValue)
  • 對數轉換y = log10(x)
  • 反正切轉換y = arctan(x) * 2 / π

示例代碼:10-MinMaxScale.py

python

複製程式碼

from sklearn import preprocessing

scaler = preprocessing.MinMaxScaler()  # 初始化歸一化器

 

X_train_minmax = scaler.fit_transform(iris.data)  # 將數據歸一化

print("歸一化後的數據:", X_train_minmax[:4])

執行結果

lua

複製程式碼

歸一化後的數據:

[[0.22222222 0.625      0.06779661 0.04166667]

 [0.16666667 0.41666667 0.06779661 0.04166667]

 [0.11111111 0.5        0.05084746 0.04166667]

 [0.08333333 0.45833333 0.08474576 0.04166667]]

教學視頻:10_minmax.mp4


優化策略中的學習率調整

在革命中,行軍速度需要根據敵情和地形靈活調整。同樣,學習率決定了模型參數更新的步長,影響訓練的速度和效果。

示例代碼:13-Iris-LearningRate001.py

python

複製程式碼

# 省略部分代碼

learning_rate = 0.001    # 將學習率調小

opt1 = tf.keras.optimizers.Adam(lr=learning_rate)

 

model.compile(

    optimizer=opt1,

    loss=tf.keras.losses.categorical_crossentropy,

    metrics=['accuracy']

)

 

history = model.fit(x_train, y_train2,

                    epochs=100,

                    batch_size=16)

 

# 繪製訓練準確率曲線

plt.plot(history.history['accuracy'])

plt.title('Adam 模型準確率(學習率 0.001)')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['訓練準確率'], loc='lower right')

plt.show()

執行結果

調整學習率後,模型的準確率達到了 1.0。這說明在訓練中,適當調整學習率,可以取得更好的效果,就像在戰鬥中,選擇合適的行軍速度,能夠更有效地打擊敵人。

教學視頻:13_Iris-LearningRate001.mp4


模型編譯的指標

在革命中,我們需要評估每次戰鬥的成果。同樣,在模型訓練中,選擇合適的指標(metrics)來評估模型性能至關重要。

分類指標

  • 二分類準確率(Binary Accuracy):用於只有兩個類別的情況。
  • 多分類準確率(Categorical Accuracy):用於多個類別的情況。

示例代碼:15-Binary_accuracy.py

python

複製程式碼

import numpy as np

import tensorflow as tf

import matplotlib.pyplot as plt

 

# 資料集

X = np.array([0.1,0.2,0.3,0.4,0.5,1.0,1.1,1.2,1.3, 1.4])

Y = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])

 

# 模型

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.Dense(units=10, input_dim=1))

model.add(tf.keras.layers.Dense(units=1, activation=tf.nn.sigmoid))

 

model.compile(

    optimizer=tf.keras.optimizers.Adam(lr=0.01),

    loss='binary_crossentropy',

    metrics=['accuracy']

)

 

history = model.fit(X, Y, epochs=400, batch_size=len(X))

 

# 繪製準確率曲線

plt.plot(history.history['accuracy'])

plt.title('二分類準確率')

plt.ylabel('準確率')

plt.xlabel('訓練輪次')

plt.legend(['二分類準確率'], loc='lower right')

plt.show()

執行結果

教學視頻:15-Binary_accuracy.py.mp4


通過以上的學習,我們將毛澤東同志的戰略思想融入到了深度學習的優化演算法中。正如在革命鬥爭中,只有不斷總結經驗,靈活運用戰略戰術,才能取得勝利。在深度學習中,也是如此,需要根據具體情況,選擇合適的優化策略,不斷調整參數,才能訓練出高性能的模型。

希望這次學習能夠幫助大家在實踐中取得更好的成果。


備註:以上內容旨在將技術知識與毛澤東的戰略思想相結合,以説明理解優化演算法的選擇和應用。如有不當之處,敬請指正。

創作者介紹
創作者 AI革命家 REVOLUTIONARY 的頭像
AI革命家

AI革命家 REVOLUTIONARY

AI革命家 發表在 痞客邦 留言(0) 人氣( 2 )