iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Software Development

LSTM結合Yolo v8對於多隻斑馬魚行為分析系列 第 26

day 26 lstm多隻斑馬魚模型分析

  • 分享至 

  • xImage
  •  

今天是第二十六我們可以多隻斑馬魚行為的模型做分析哪一個精準率比較高,以下是程式碼

數據準備與預處理

在這一部分,我們假設斑馬魚的數據包括了每隻斑馬魚在不同時間點的座標、速度等信息。這些數據會被預處理成符合LSTM模型輸入的格式。

import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.utils import to_categorical

# 設定隨機種子以保證結果的可重現性
np.random.seed(42)

# 假設有1000個樣本,每個樣本有50個時間步,每個時間步有20個特徵
num_samples = 1000
time_steps = 50
num_features = 20

# 創建隨機數據集,模擬斑馬魚的運動數據
data = np.random.rand(num_samples, time_steps, num_features)

# 創建隨機標籤,假設有5個行為類別
num_classes = 5
labels = np.random.randint(num_classes, size=(num_samples, time_steps, 1))

# 數據標準化:我們使用標準化來將數據縮放到均值為0,標準差為1的範圍內
scaler = StandardScaler()

# 我們需要將數據重新整形為 (num_samples * time_steps, num_features) 來進行標準化
data_reshaped = data.reshape(-1, num_features)
data_reshaped = scaler.fit_transform(data_reshaped)

# 將數據重塑回原來的形狀 (num_samples, time_steps, num_features)
data = data_reshaped.reshape(num_samples, time_steps, num_features)

# 將標籤轉換為 one-hot 編碼
labels = to_categorical(labels, num_classes=num_classes)

LSTM 模型結構設計

這個部分,我們將構建一個更複雜的LSTM模型,並加入正則化技術如Dropout來減少過擬合。此外,我們還會加入TimeDistributed層來處理每個時間步的輸出。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, TimeDistributed, BatchNormalization
from tensorflow.keras.optimizers import Adam

# 建立Sequential模型
model = Sequential()

# 第一層LSTM:128單元,回傳序列以便疊加多層LSTM
model.add(LSTM(128, return_sequences=True, input_shape=(time_steps, num_features)))
model.add(BatchNormalization())  # 批量正規化
model.add(Dropout(0.3))  # Dropout層,用於防止過擬合

# 第二層LSTM:64單元
model.add(LSTM(64, return_sequences=True))
model.add(BatchNormalization())
model.add(Dropout(0.3))

# 第三層LSTM:32單元
model.add(LSTM(32, return_sequences=True))
model.add(BatchNormalization())
model.add(Dropout(0.3))

# Time




```python
# TimeDistributed全連接層,輸出每個時間步對應的行為類別
model.add(TimeDistributed(Dense(64, activation='relu')))
model.add(Dropout(0.3))  # 增加Dropout防止過擬合

# 最後一層TimeDistributed全連接層,使用softmax進行分類
model.add(TimeDistributed(Dense(num_classes, activation='softmax')))

# 編譯模型,使用Adam優化器和交叉熵損失函數
model.compile(optimizer=Adam(learning_rate=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

# 顯示模型摘要
model.summary()

模型訓練

這部分的目的是使用我們的數據來訓練這個模型,並使用部分數據作為驗證集來監控模型的訓練過程。為了防止過度擬合,我們使用了EarlyStopping回調函數來在驗證損失不再減少時停止訓練。

from tensorflow.keras.callbacks import EarlyStopping

# 定義EarlyStopping回調函數,當驗證損失不再下降時停止訓練
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)

# 訓練模型,並使用20%的數據作為驗證集
history = model.fit(data, labels, 
                    epochs=100, 
                    batch_size=32, 
                    validation_split=0.2, 
                    callbacks=[early_stopping])

訓練結果可視化

為了檢查模型的性能,我們可以繪製訓練和驗證的損失和準確度曲線,這有助於我們了解模型是否過擬合或欠擬合。

import matplotlib.pyplot as plt

# 繪製訓練與驗證損失曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

# 繪製訓練與驗證準確度曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()

模型評估與測試

在訓練完成後,我們可以使用測試集來評估模型的性能。這裡假設我們有一個新測試數據集test_data,並通過模型預測斑馬魚的行為。

# 假設有新的測試數據集
test_samples = 10  # 測試樣本數
test_data = np.random.rand(test_samples, time_steps, num_features)

# 對測試數據進行標準化
test_data_reshaped = test_data.reshape(-1, num_features)
test_data_reshaped = scaler.transform(test_data_reshaped)
test_data = test_data_reshaped.reshape(test_samples, time_steps, num_features)

# 使用模型進行預測
predictions = model.predict(test_data)

# 將預測結果轉換為類別標籤
predicted_classes = np.argmax(predictions, axis=-1)

# 顯示每個測試樣本的預測結果
for i in range(test_samples):
    print(f"Sample {i+1} predictions: {predicted_classes[i]}")

模型應用

最後,我們可以將這個LSTM模型應用於實際的斑馬魚行為分析任務中。

1. 數據準備與預處理

import numpy as np
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.utils import to_categorical
  • numpy: 用於處理數據,例如生成隨機數據集。
  • StandardScaler: 用於對數據進行標準化處理,將數據的均值設為0,標準差設為1,這樣可以加速模型的收斂並提升模型性能。
  • to_categorical: 將數據標籤轉換為one-hot編碼,使得模型可以進行多分類預測。
# 設定隨機種子以保證結果的可重現性
np.random.seed(42)

# 假設有1000個樣本,每個樣本有50個時間步,每個時間步有20個特徵
num_samples = 1000
time_steps = 50
num_features = 20

# 創建隨機數據集,模擬斑馬魚的運動數據
data = np.random.rand(num_samples, time_steps, num_features)
  • np.random.seed(42): 設置隨機種子,以確保每次運行時生成的隨機數據相同,這對於實驗的可重現性非常重要。
  • data: 隨機生成的數據集,模擬了1000個樣本,每個樣本有50個時間步,並且每個時間步包含20個特徵(例如斑馬魚在不同時間點的座標、速度等)。
# 創建隨機標籤,假設有5個行為類別
num_classes = 5
labels = np.random.randint(num_classes, size=(num_samples, time_steps, 1))
  • labels: 生成隨機標籤,假設斑馬魚有5種不同的行為模式,並且這些標籤對應於數據集中的每個時間步。
# 數據標準化:我們使用標準化來將數據縮放到均值為0,標準差為1的範圍內
scaler = StandardScaler()

# 我們需要將數據重新整形為 (num_samples * time_steps, num_features) 來進行標準化
data_reshaped = data.reshape(-1, num_features)
data_reshaped = scaler.fit_transform(data_reshaped)

# 將數據重塑回原來的形狀 (num_samples, time_steps, num_features)
data = data_reshaped.reshape(num_samples, time_steps, num_features)

# 將標籤轉換為 one-hot 編碼
labels = to_categorical(labels, num_classes=num_classes)
  • 數據標準化:將數據重塑為適合StandardScaler處理的形狀(即扁平化為二維陣列),然後再將其轉回三維陣列以供LSTM模型使用。
  • to_categorical: 將標籤轉換為one-hot編碼,這樣每個標籤會被轉換成一個長度為5的向量,其中只有一個位置為1,其餘位置為0。

2. LSTM 模型結構設計

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, TimeDistributed, BatchNormalization
from tensorflow.keras.optimizers import Adam

# 建立Sequential模型
model = Sequential()
  • Sequential: 一種線性堆疊的模型,允許我們按順序添加每一層網絡。
# 第一層LSTM:128單元,回傳序列以便疊加多層LSTM
model.add(LSTM(128, return_sequences=True, input_shape=(time_steps, num_features)))
model.add(BatchNormalization())  # 批量正規化
model.add(Dropout(0.3))  # Dropout層,用於防止過擬合
  • LSTM(128, return_sequences=True): 第一層LSTM有128個單元。return_sequences=True表示這一層會為每個輸入時間步返回一個輸出(而不僅僅是最後一個時間步),這樣的設計允許疊加多層LSTM。
  • BatchNormalization(): 批量正規化層,用來加速模型的訓練並減少過擬合。
  • Dropout(0.3): Dropout層,在訓練過程中隨機丟棄30%的神經元,這是一種正則化技術,可以幫助防止過擬合。
# 第二層LSTM:64單元
model.add(LSTM(64, return_sequences=True))
model.add(BatchNormalization())
model.add(Dropout(0.3))

# 第三層LSTM:32單元
model.add(LSTM(32, return_sequences=True))
model.add(BatchNormalization())
model.add(Dropout(0.3))
  • 第二層和第三層LSTM:這兩層分別有64和32個單元,並且都設置了return_sequences=True,這樣每層的輸出還是序列,可以繼續作為下一層的輸入。
# TimeDistributed全連接層,輸出每個時間步對應的行為類別
model.add(TimeDistributed(Dense(64, activation='relu')))
model.add(Dropout(0.3))

# 最後一層TimeDistributed全連接層,使用softmax進行分類
model.add(TimeDistributed(Dense(num_classes, activation='softmax')))
  • TimeDistributed(Dense(64, activation='relu')): 全連接層會對每個時間步的輸入進行獨立處理。這裡用的是ReLU激活函數來增加非線性特性。
  • TimeDistributed(Dense(num_classes, activation='softmax')): 最後一層全連接層,使用softmax進行多類別分類。
# 編譯模型,使用Adam優化器和交叉熵損失函數
model.compile(optimizer=Adam(learning_rate=0.001), 
              loss='categorical_crossentropy', 
              metrics=['accuracy'])

# 顯示模型摘要
model.summary()
  • compile: 編譯模型,選擇Adam優化器和categorical_crossentropy損失函數,這些都是多分類問題的標準選擇。metrics=['accuracy']用來衡量模型在訓練過程中的準確性。
  • summary: 顯示模型的結構,幫助我們確認每一層的輸入輸出形狀和參數量。

3. 模型訓練

from tensorflow.keras.callbacks import EarlyStopping

# 定義EarlyStopping回調函數,當驗證損失不再下降時停止訓練
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)

# 訓練模型,並使用20%的數據作為驗證集
history = model.fit(data, labels, 
                    epochs=100, 
                    batch_size=32, 
                    validation_split=0.2, 
                    callbacks=[early_stopping])
  • EarlyStopping: 一個回調函數,用於當驗證損失在多個epoch內不再減少時,提前停止訓練,從而防止過度訓練和過擬合。
  • model.fit: 開始訓練模型,epochs=100表示最多訓練100個epoch,batch_size=32表示每次更新權重時使用32個樣本,validation_split=0.2表示將20%的數據用作驗證集。

4. 訓練結果可視化

import matplotlib.pyplot as plt

# 繪製訓練與驗證損失曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

# 繪製訓練與驗證準確度曲線
plt.figure(figsize=(12, 6))
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val


### 4. 訓練結果可視化

```python
# 繪製訓練與驗證準確度曲線
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
  • 繪製訓練與驗證損失曲線:這段代碼用來顯示模型在每個epoch的訓練損失和驗證損失。這有助於判斷模型是否存在過擬合的現象。
  • 繪製訓練與驗證準確度曲線:同樣地,這段代碼用來顯示模型在每個epoch的訓練準確度和驗證準確度。這可以幫助我們了解模型在訓練過程中的表現。

總結

這個LSTM模型的設計與訓練過程中包含了多層LSTM來捕捉斑馬魚行為的時間特徵,並且利用了Dropout和Batch Normalization來防止過擬合。通過TimeDistributed層,模型能夠針對每個時間步進行分類,從而實現對每個時間點的行為進行分析。最後,模型的訓練結果通過可視化來展示,使得我們可以更好地理解模型的表現和訓練過程中的變化。


上一篇
day 25 lstm結合yolo分析斑馬魚行為模型系統
下一篇
Day 27Lstm與Yolo多斑馬魚行為分析介面mock test
系列文
LSTM結合Yolo v8對於多隻斑馬魚行為分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言