當前位置: 華文頭條 > 推薦

Netron視覺化深度學習的模型框架,大大降低了大模型的學習門檻

2024-10-02推薦

深度學習是機器學習的一個子領域,靈感來源於人腦的神經網路。深度學習透過多層神經網路自動提取數據中的高級特征,能夠處理復雜和大量的數據,尤其在影像、語音、自然語言處理等任務中表現出色。常見的深度學習模型:

  • 摺積神經網路(CNN) :專註於處理影像數據的深度學習模型,廣泛套用於電腦視覺任務,如影像分類、目標檢測等。
  • 摺積神經網路模型

  • 迴圈神經網路(RNN)和長短期記憶網路(LSTM) :用於處理序列數據(如文本、語音),擅長學習時間序列中的依賴關系。
  • RNN 迴圈神經網路模型

  • Transformer :透過自註意力機制和平行計算,在自然語言處理等任務中取得了顯著突破(如 BERT、GPT 等模型)。
  • transformer 模型框架

    學習人工智慧技術依然是當下的熱點,無論是誰,都需要學習人工智慧技術,就像當年的電腦時代一樣,每個人都需要學習了解人工智慧技術。但是學習技術的門檻比較高,特別是大模型的程式碼讓人看起來,簡直就是天書一樣,本來程式碼就長,還堆疊了 N 個模型框架,且每個輸入,輸出的數據形狀,簡直讓人頭疼。

    好在Netron把大模型的框架都使用視覺化的方式呈現了出來,從輸入,到輸出,數據的每個步驟的流動,以及每個節點的數據維度與當前時間節點的計算名稱都詳細的羅列了出來,類似摺積的操作,從輸入到輸出,都是一條直線下來,光看程式碼也比較容易清晰。

    但是碰到類似的大模型,其輸入,輸出節點如此之多,若只看程式碼的話,估計整個人都懵了。若下圖展現出來,再配合著程式碼與模型框架,再去理解模型,是不是就容易輕松了。

    Netron的官網也很簡潔,只需要把自己的模型訓練完成的模型,上傳到Netron的網站,模型框架就會自動展現出來。目前支持ONNX, TensorFlow Lite, Core ML, Keras, Caffe, Darknet, MXNet, PaddlePaddle, ncnn, MNN, TensorFlow.js, Safetensors and NumPy.

    這裏我們編寫一段 CNN 的程式碼,試試Netron視覺化模型的魅力,執行以下程式碼,然後把模型保存成 onnx格式,得到模型檔後,就可以上傳到Netron網站。

    import torchimport torch.nn as nnimport torch.onnximport torch.nn.functional as F # 假設我們有一個簡單的摺積神經網路 class SimpleCNN(nn.Module): def __init__(self): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 6, 5) self.pool = nn.MaxPool2d(2, 2) self.conv2 = nn.Conv2d(6, 16, 5) self.fc1 = nn.Linear(16 * 5 * 5, 120) # 調整全連線層的輸入維度 self.fc2 = nn.Linear(120, 84) self.fc3 = nn.Linear(84, 10) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 16 * 5 * 5) # 調整 view 的參數 x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x# 建立模型例項model = SimpleCNN()# 設定模型為評估模式model.eval()# 建立一個範例輸入張量dummy_input = torch.randn(1, 1, 32, 32) # 範例輸入尺寸 (batch_size, channels, height, width)# 匯出模型torch.onnx.export(model, # 要匯出的模型 dummy_input, # 模型的範例輸入 "simple_cnn.onnx", # 輸出檔名 export_params=True, # 是否匯出參數 opset_version=11, # ONNX 的版本 do_constant_folding=True, # 是否執行常量折疊最佳化 input_names=['input'], # 輸入節點名稱 output_names=['output'], # 輸出節點名稱 dynamic_axes={'input': {0: 'batch_size'}, # 動態軸 'output': {0: 'batch_size'}}) print("模型已成功匯出為 ONNX 格式!")'''SimpleCNN 類繼承自 nn.Module,這是所有 PyTorch 網路模型的基礎類。__init__ 方法中定義了網路的結構:self.conv1:第一個摺積層,輸入通道數為 1,輸出通道數為 6,摺積核大小為 5x5。self.pool:最大池化層,池化視窗大小為 2x2,步長為 2。self.conv2:第二個摺積層,輸入通道數為 6,輸出通道數為 16,摺積核大小為 5x5。self.fc1:第一個全連線層,輸入維度為 16 * 5 * 5,輸出維度為 120。self.fc2:第二個全連線層,輸入維度為 120,輸出維度為 84。self.fc3:輸出層,輸入維度為 84,輸出維度為 10(假設是 10 類分類任務)。 forward 方法定義了數據在模型中的流動方式:x = self.pool(F.relu(self.conv1(x))):對輸入 x 進行第一層摺積操作,然後套用 ReLU 啟用函式,再進行最大池化。x = self.pool(F.relu(self.conv2(x))):對上一步的結果進行第二層摺積操作,同樣套用 ReLU 啟用函式,再進行最大池化。x = x.view(-1, 16 * 5 * 5):將多維張量展平成一維張量,以便可以輸入到全連線層。這裏 -1 表示自動計算批次大小,16 * 5 * 5 是展平後的特征數量。x = F.relu(self.fc1(x)):透過第一個全連線層,並套用 ReLU 啟用函式。x = F.relu(self.fc2(x)):透過第二個全連線層,並套用 ReLU 啟用函式。x = self.fc3(x):透過輸出層,得到最終的輸出。'''

    Netron展示了每個節點的計算過程以及名稱,當然模型的每個步驟的數據維度,也清晰的展示了出來,這樣我們學習大模型時,可以根據模型框架以及視覺化過程來解析程式碼的執行過程,也可以透過視覺化的模型框架,來學習數據的流向,以及 debug 模型。

    https://github.com/lutzroeder/netronhttps://netron.app/