林晨坐在書桌前,窗外是科技園不變的燈火通明,而他的電腦螢幕上,正同時開啟著兩個截然不同的程式設計環境。
那個 97.1% 準確率的 IST 模型帶來的興奮感尚未完全消退,但理性很快佔據了上風。林晨清楚,偶然的成功不能複製,要想真正把 AI 技術變成自己手中的利器,尤其是未來應用到變幻莫測的金融市場分析上,他必須系統性地掌握工具,而不僅僅是跟著教程跑通一個例子。
深度學習框架,就是這最重要的工具。
當前主流的兩大巨頭——TensorFlow 和 PyTorch,如同武林中的兩大門派,各有擁躉,各有優劣。林晨決定,花上一週時間,把這兩個框架都深入體驗一遍,再決定自己的主攻方向。
他首先打開了 TensorFlow 的官方文件。作為谷歌出品的老牌框架,TensorFlow 以其工業級的穩定性、強大的分散式訓練能力和成熟的部署生態著稱。
林晨按照指南安裝配置,開始了第一個 TensorFlow 程式——依舊是手寫數字識別。
“靜態計算圖……”林晨一邊敲程式碼,一邊琢磨著這個核心概念。
在 TensorFlow 1.x 時代,需要先定義計算圖(Graph),然後在會話(Session)中執行,這種“先構圖,後執行”的模式,對於習慣了 Python 即時執行思維的程式設計師來說,確實有些繞。
好在現在主流已是 TensorFlow 2.x,預設開啟了 Eager Execution(急切執行),像普通 Python 程式碼一樣即時執行,大大降低了入門門檻。透過高階 API tf.keras,構建模型變得相當直觀。
iort tensorflow as tf
del = tf.keras.Sequential(【
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(128, activation=relu),
tf.keras.layers.Dense(10, activation=softx)
】)
del.pile(optizer=ada loss=sparse_categorical_crossentropy, trics=【accuracy】)
程式碼簡潔明瞭。
訓練過程也順利,最終準確率跑到了 97.5%,比上次自己用“原生” PyTorch 略高一點點。但林晨在嘗試自定義一個損失函式,並想深入檢視中間某層梯度時,遇到了一些麻煩。
TensorFlow 的除錯體驗,尤其是想要深入其計算過程時,總覺得隔著一層,不如直接寫 Python 程式碼那樣透明和易於介入。它的優勢似乎更在於“生產部署”——一旦模型確定,轉換成 Saveddel 或 TFLite 格式,在各種終端和伺服器上的部署非常成熟。
“這就像一套精密的自動化生產線”,林晨在筆記上寫道,“設計好了流程,它就能穩定高效地運轉,但如果你想中途調整某個零件的加工引數,可能需要專門的工具和介面”。
接下來,他切換到了 PyTorch 的環境。
其實上一章的 IST 就是用 PyTorch 的教程完成的,但那次更多是“跟隨”。這次,他打算以“研究者”和“探索者”的心態重新審視它。
PyTorch 由 Facebook(現 ta)AI 研究院推出,核心設計哲學是“Python 優先”和動態計算圖。林晨從最基本的張量(Tensor)操作開始,感受其與 Nuy 的相似性帶來的親切感。
構建模型時,他需要自己定義一個繼承自 torch.nn.dule 的類,並在 forward 方法中明確寫出資料流動的過程。
iort torch
iort torch.nn as nn
iort torch.optias optibr>
class SileNN(nn.dule):
:)fles(__tini__ fed
__tini__.repus
nettalF.nn = nettalf.fles
(laitneuqeS.nn = kcats_uler_raenil.fles
,)821 ,82*82(raeniL.nn








