HarvardX TinyML小筆記1(番外2:神經網絡)

1 介紹

圖片來自:https://zh.wikipedia.org/zh-cn/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C

神經網絡一直感覺挺神奇的,江湖也說可解釋性很差,無論如何還是學學吧。借這次學習哈佛的TinyML,也就順帶弄了。

這里沒有太多的去看神經網絡的細節,主要還是偏重使用層面(對于菜鳥來說,能用大神的庫就夠了。。。)。

在神經元中,有兩個核心變量w(Weight,權重)和b(Bias,偏置)還是要理解。以?y = w*x + b為例,w 控制輸入 x 對輸出 y 的影響程度,b用于調整模型的輸出基準。簡單來說,w 負責 “縮放” 輸入特征的影響,b 負責 “偏移” 輸出結果,兩者共同配合使模型能夠學習數據中的線性或非線性關系。在訓練過程中,模型通過反向傳播算法不斷更新 w 和 b,以最小化預測誤差。

在TinyML課程中,神經網絡的練習地址:Course | edX

練習代碼地址:https://colab.research.google.com/github/tinyMLx/colabs/blob/master/2-2-5-FirstNeuralNetworkRevisited.ipynb

2 代碼

代碼整理如下:

import sysimport numpy as np
import tensorflow as tf
from tensorflow import keras# This script requires TensorFlow 2 and Python 3.
if tf.__version__.split('.')[0] != '2':raise Exception((f"The script is developed and tested for tensorflow 2. "f"Current version: {tf.__version__}"))if sys.version_info.major < 3:raise Exception((f"The script is developed and tested for Python 3. "f"Current version: {sys.version_info.major}"))my_layer = keras.layers.Dense(units=1, input_shape=[1])
model = tf.keras.Sequential([my_layer])
model.compile(optimizer='sgd', loss='mean_squared_error')xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)model.fit(xs, ys, epochs=500)print(model.predict(np.array([10.0])))print(my_layer.get_weights())my_layer_1 = keras.layers.Dense(units=2, input_shape=[1])
my_layer_2 = keras.layers.Dense(units=1)
model = tf.keras.Sequential([my_layer_1, my_layer_2])
model.compile(optimizer='sgd', loss='mean_squared_error')xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)model.fit(xs, ys, epochs=500)print(model.predict(np.array([10.0])))print(my_layer_1.get_weights())
print(my_layer_2.get_weights())value_to_predict = 10.0layer1_w1 = (my_layer_1.get_weights()[0][0][0])
layer1_w2 = (my_layer_1.get_weights()[0][0][1])
layer1_b1 = (my_layer_1.get_weights()[1][0])
layer1_b2 = (my_layer_1.get_weights()[1][1])layer2_w1 = (my_layer_2.get_weights()[0][0])
layer2_w2 = (my_layer_2.get_weights()[0][1])
layer2_b = (my_layer_2.get_weights()[1][0])neuron1_output = (layer1_w1 * value_to_predict) + layer1_b1
neuron2_output = (layer1_w2 * value_to_predict) + layer1_b2neuron3_output = (layer2_w1 * neuron1_output) + (layer2_w2 * neuron2_output) + layer2_bprint(neuron3_output)

首先導入的keras的庫。

Keras 是一個高級神經網絡 API(應用程序編程接口),它用 Python 編寫,旨在讓深度學習模型的構建、訓練和部署變得更加簡單、直觀和高效。

?

它的主要特點包括:

?
  • 用戶友好:提供了簡潔易懂的接口,使得開發者能夠快速構建復雜的神經網絡模型,而無需過多關注底層實現細節。
  • 模塊化:將神經網絡的各個組成部分(如層、激活函數、優化器等)設計為獨立的模塊,便于組合和復用。
  • 可擴展性:支持自定義層、損失函數等,以滿足特定的業務需求。
  • 多后端支持:最初可以在 TensorFlow、CNTK、Theano 等深度學習框架上運行,后來成為了 TensorFlow 的官方高級 API(即 tf.keras)。
?

Keras 廣泛應用于學術研究、工業界開發等領域,特別適合快速原型設計、教學和解決實際的深度學習問題。無論是簡單的全連接神經網絡,還是復雜的卷積神經網絡(CNN)、循環神經網絡(RNN)等,都可以通過 Keras 便捷地實現。

之后檢查TensorFlow和Python的版本。

之后使用了1層神經網絡和2層神經網絡。最后使用同樣的數據集對模型進行了驗證。

3 代碼細節

1層神經網絡

通過數據可以看出,關系是y = 2x - 1。

核心代碼是:

my_layer = keras.layers.Dense(units=1, input_shape=[1])
model = tf.keras.Sequential([my_layer])
model.compile(optimizer='sgd', loss='mean_squared_error')xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)model.fit(xs, ys, epochs=500)

訓練 500 次,優化器是隨機梯度下降(SGD),損失函數是均方誤差(MSE)。units=1表示使用了1個神經元。

上一篇說的梯度下降,就封裝在model.fit中。

之后預測輸入值10,按照關系,應該值是19。

一開始的訓練情況:

Epoch 1/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 482ms/step - loss: 1.8166

Epoch 2/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 87ms/step - loss: 1.5706

Epoch 3/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 136ms/step - loss: 1.3741

最后是訓練情況:

Epoch 498/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 64ms/step - loss: 2.4299e-05

Epoch 499/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 70ms/step - loss: 2.3800e-05

Epoch 500/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 139ms/step - loss: 2.3311e-05

此時的預測結果是[[18.985914]]

最后計算出來的參數:

[array([[1.9979583]], dtype=float32), array([-0.99367034], dtype=float32)]

感覺神經網絡計算的參數,只能無限逼近真實值,而且有一定的上限范圍。

2層神經網絡

代碼如下:

my_layer_1 = keras.layers.Dense(units=2, input_shape=[1])
my_layer_2 = keras.layers.Dense(units=1)
model = tf.keras.Sequential([my_layer_1, my_layer_2])
model.compile(optimizer='sgd', loss='mean_squared_error')xs = np.array([-1.0,  0.0, 1.0, 2.0, 3.0, 4.0], dtype=float)
ys = np.array([-3.0, -1.0, 1.0, 3.0, 5.0, 7.0], dtype=float)model.fit(xs, ys, epochs=500)

可以看到,和上面單層神經網絡基本差不多,就只是增加了一層。這里第一層是units=2,使用了兩個神經元。第二層是units=1,使用了一個神經元。

用的數據集也是一致。

開始的訓練情況:

Epoch 1/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 301ms/step - loss: 37.9950

Epoch 2/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 53ms/step - loss: 19.0502

Epoch 3/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 55ms/step - loss: 11.7038

最后的訓練情況:

Epoch 498/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 117ms/step - loss: 3.2211e-13

Epoch 499/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 61ms/step - loss: 3.2211e-13

Epoch 500/500 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 68ms/step - loss: 3.2211e-13

最后計算出來的參數:

1層:[array([[-0.10459945, -1.3529563 ]], dtype=float32), array([-0.07518195, 0.46336478], dtype=float32)]

2層:[array([[ 0.554448 ], [-1.5211095]], dtype=float32), array([-0.2534862], dtype=float32)]

可以看到,此時的參數和原始參數2和-1相去甚遠。

可以使用print(model.predict(np.array([10.0])))查看輸出。

預測結果是[[18.999998]]

也可以手算,過程是:

neuron1_output = (layer1_w1 * value_to_predict) + layer1_b1

neuron2_output = (layer1_w2 * value_to_predict) + layer1_b2

neuron3_output = (layer2_w1 * neuron1_output) + (layer2_w2 * neuron2_output) + layer2_b

預測結果也是[[18.999998]]

可以看出,2層神經網絡的效果比1層好出了一個數量級。上限也更高一些。。

4 課后問題

4.1 怎么判斷層數和神經元?

層數:

輸入是低維數值(比如溫度、房價預測):隱藏層很少(1~3層)就行。
輸入是高維結構化數據(比如圖像 224×224×3):通常會用很多層(10層甚至100層)。

神經元:

輸入層神經元數 = 輸入特征數(這個是固定的)。
輸出層神經元數 = 任務要求(分類數、回歸目標數)。
隱藏層神經元數:常見初始值,介于輸入層和輸出層之間。

例子:

房價預測(10個特征):
輸入層:10
隱藏層1:16
輸出層:1(回歸)
層數:2 隱藏層足夠。

手寫數字識別(28×28=784特征):
輸入層:784
隱藏層:128 → 64
輸出層:10(分類)
層數:2~3 隱藏層。

圖像分類(224×224×3):
通常直接用 CNN 多層(幾十層以上),每層的卷積核數逐漸增多。

調試技巧:

欠擬合 → 增加層數或神經元
過擬合 → 減少層數或神經元,或加正則化(Dropout、L2)
訓練慢 → 先簡化模型找方向,再加復雜度

這些就是所謂調參俠核心技能吧?

4.2 調參俠速查

調參俠速查表:


🛠 調參俠速查表

現象 / 問題可能原因調整方向(超參數 & 結構)
訓練集和驗證集都準確率低 / loss 高(欠擬合)模型容量不足 / 學習率太低 / 數據特征不足1?? 增加層數或神經元數量2?? 換更復雜模型(CNN, LSTM, Transformer)3?? 提高學習率或用自適應優化器(Adam, RMSProp)4?? 增加特征工程或用更豐富的輸入數據
訓練集準確率高,驗證集準確率低(過擬合)模型太復雜 / 訓練時間太長 / 數據不足1?? 減少層數或神經元2?? 增加正則化(L1/L2、Dropout)3?? 數據增強(圖像翻轉、噪聲等)4?? 提前停止(Early Stopping)
loss 不下降 / 降得很慢學習率太低 / 梯度消失 / 數據歸一化問題1?? 提高學習率或用學習率調度器2?? 換激活函數(ReLU、LeakyReLU)3?? 數據標準化(StandardScaler / BatchNorm)
loss 一開始就很大且不變學習率太高 / 參數初始化不當1?? 降低學習率2?? 換權重初始化方法(He、Xavier)
結果震蕩學習率太高 / 批大小太小1?? 降低學習率2?? 增大 batch size
訓練速度太慢模型過大 / I/O 瓶頸 / 硬件不足1?? 減少模型規模2?? 用 GPU/TPU3?? 數據緩存(prefetch, cache)

📏 推薦初始架構 & 神經元數量參考

  • 輸入特征 ≤ 20:12 隱藏層,每層 1664 神經元

  • 輸入特征 20200:24 隱藏層,每層 64~256 神經元

  • 高維數據(圖像/音頻):用 CNN/RNN,通道數隨層數增加

  • 輸出層:分類數(分類任務)或 1(回歸任務)


🔄 調參流程建議

  1. 小模型快速驗證可行性(先證明能學到東西)

  2. 逐步增加復雜度(層數、神經元)

  3. 觀察驗證集(避免過擬合)

  4. 優化訓練策略(學習率、正則化)

  5. 自動調參(Optuna、Ray Tune、Keras Tuner)

4.3 LLM大語言模型和神經網絡的關系

神經網絡 → 是通用技術框架。
Transformer → 是一種特定神經網絡架構,擅長處理序列。
LLM → 是基于 Transformer 的、專門用大規模文本訓練的神經網絡。

LLM(如 GPT-4、Claude、LLaMA、GLM)本質是 超大規模的 Transformer 神經網絡,層數可能幾十層甚至上百層,參數量可以到 百億 ~ 萬億級。僅此而已。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92475.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡 第2章通信基礎(竟成)

第 2 章 物理層【考綱內容】1.通信基礎 (1) 信道、信號、帶寬、碼元、波特、速率、信源與信宿等基本概念 (2) 奈奎斯特定理與香農定理 (3) 編碼與調制 (4) 電路交換、報文交換與分組交換 (5) 數據報與虛電路2.傳輸介質 (1) 雙絞線、同軸電纜、光纖與無線傳輸介質&#xff1b;(2…

2025-08-09通過授權碼的方式給exe程序充值

2025-08-09通過授權碼的方式給exe程序充值主要點&#xff1a; 一次性授權機制&#xff1a; 新增 .used_licenses 文件記錄所有已使用的授權碼 每次激活前檢查授權碼是否在已使用列表中 激活成功后立即將授權碼標記為已使用 時效性驗證&#xff1a; 授權碼包含過期時間戳&#x…

工具類-高效集合差異計算工具DiffWrapper

集合差異工具類-DiffWrapper 原因 在編輯過程中&#xff0c;肯定會存在對于子表的更新操作&#xff0c;這種更新分為三種&#xff1a; 要加的&#xff0c; 要刪的&#xff0c;要更新的&#xff0c;并且傳參只有一個modifyVO的, 每一個都寫有點過于冗余&#xff0c;故考慮提取一…

SimBA算法實現過程

文章目錄添加噪聲衡量擾動示例數值總結高級索引變量名代碼總體代碼添加噪聲 操作&#xff1a;將頻率擾動通過trans( )轉為像素域擾動加到原始圖像上&#xff08;trans返回頻率域轉換為像素域的結果&#xff09; expanded (images_batch[remaining_indices] # 原始圖像&…

【面試題】cookie和session 的區別

文章目錄一、核心定義與存儲位置二、關鍵區別對比三、典型使用場景四、關聯與依賴總結在Web開發中&#xff0c; Cookie和 Session是兩種常用的狀態管理機制&#xff0c;用于在無狀態的HTTP協議中保存用戶信息&#xff08;如登錄狀態、偏好設置等&#xff09;。二者的核心區別體…

【機器學習】算法調參的兩種方式:網格搜索(枚舉)、隨機搜索

文章目錄一、網格搜索&#xff1a;窮舉式的最優解尋找1、數學推導過程1. 搜索空間的數學結構2. 優化問題的數學性質3. 收斂性分析4. 誤差分析2、為什么網格搜索有效&#xff1f;1. 全局最優性保證2. 可重現性與穩定性3. 參數敏感性分析3、適用場景與局限性二、隨機搜索&#xf…

免費PDF翻譯 離線自建

https://github.com/Byaidu/PDFMathTranslate/blob/main/docs/README_zh-CN.md https://github.com/Byaidu/PDFMathTranslate/releases 方法 針對不同的使用案例&#xff0c;我們提供不同的方法來使用我們的程序&#xff1a;1. UV 安裝 安裝 Python (3.10 < 版本 < 3.12)…

DeepSeek智能考試系統智能體

一、deepseek-app-1.0 1、系統要求 CentOS 7.9Python 3.8Node.js 16MySQL 8.0 2、部署步驟 運行初始化腳本&#xff1a;./scripts/setup.sh初始化數據庫&#xff1a;mysql -u root -p < scripts/init_db.sql啟動服務&#xff1a;./scripts/start.sh 3、訪問地址 前端&…

4深度學習Pytorch-神經網絡--損失函數(sigmoid、Tanh、ReLU、LReLu、softmax)

目錄 激活函數 1. Sigmoid 2. Tanh 函數&#xff08;雙曲正切&#xff09; 3. ReLU 函數 4. Leaky ReLU (LReLU) 5. Softmax 總結對比表 損失函數選擇 激活函數 激活函數是神經網絡中每個神經元&#xff08;節點&#xff09;的核心組成部分。它接收上一層所有輸入的加權…

探索Trae:使用Trae CN爬取 Gitbook 電子書

在以前使用過Cursor&#xff0c;但是后期由于試用資源很少&#xff0c;免費資源用完我就卸載掉啦&#xff0c;最近又需要開展相關工作&#xff0c;因此下載了最新版的Trae。Trae 2.0最近很火&#xff0c;我正好想要爬取某一個Gitbook 電子書&#xff0c;因此嘗試使用Trae和Pyth…

嵌入式知識日常問題記錄及用法總結(一)

文章目錄摘要問題一、內核啟動流程1.1 ARM內核上電復位與BootROM執行?啟動代碼&#xff08;Startup Code&#xff09;執行跳轉到用戶程序1.2 內存管理問題二、C語言基礎2.1 常量指針和指針常量區別2.2.函數指針和指針函數區別2.3 關鍵字Volatile2.4 隊列結構體數據摘要 嵌入式…

使用Navicat備份數據庫MySQL、PostGreSQL等

Navicat 支持多種數據庫系統&#xff0c;可通過手動或自動方式進行數據備份&#xff0c;整個過程還是相對簡單且直觀&#xff0c;比自己敲命令行方便多了。一、備份步驟1.1、手動備份1、打開Navicat并連接數據庫&#xff1a;首先&#xff0c;啟動Navicat并連接到您的MySQL數據庫…

Web3: 用ERC-1400革新公司股權激勵

大家好&#xff01;今天&#xff0c;我們來聊一個非常酷的話PEG話題&#xff1a;如何利用Web3技術&#xff0c;特別是ERC-1400證券型代幣標準&#xff0c;來革新傳統的公司股權激勵模式。 大家是否想過&#xff0c;派發給員工的期權或限制性股票&#xff08;RSU&#xff09;可以…

【Python 高頻 API 速學 ④】

一、為什么是這 4 個&#xff1f; 列表&#xff08;list&#xff09;是 Python 最常用的可變序列&#xff0c; 90 % 的操作可以濃縮成 「增、并、刪、排」 四個字&#xff0c; 而這四個字正好對應 append / extend / pop / sort。二、四劍客一覽方法作用原地&#xff1f;返回值…

K8S的POD數量限制

#k8s-v1.11.11.查詢當前節點的最大pod數kubectl describe nodes | grep pods2.編輯配置文件把單臺的pod數量調到150個vim /etc/systemd/system/kubelet.service #添加最大數量--maxPods: 1503.加載配置重啟服務systemctl daemon-reload systemctl restart kubelet#k8s-v1.21.41…

OpenAI開源大模型 GPT-OSS 開放權重語言模型解析:技術特性、部署應用及產業影響

注&#xff1a;此文章內容均節選自充電了么創始人&#xff0c;CEO兼CTO陳敬雷老師的新書《GPT多模態大模型與AI Agent智能體》&#xff08;跟我一起學人工智能&#xff09;【陳敬雷編著】【清華大學出版社】 清華《GPT多模態大模型與AI Agent智能體》書籍配套視頻課程【陳敬雷…

CSS--后端也有自己的CSS要學

CSS,即Cascading Style Sheets,它描述了網頁的表現與展示效果 為了演示CSS,我寫了一個簡單的index.html 為了使用控制變量法,一開始我先不寫style.css文件的內容 右鍵在默認瀏覽器里查看頁面,看看效果 1-選擇器 根據標簽名進行匹配,所以也叫元素選擇器 頁面效果: 根據…

Docker swarm 常用的命令集合

#docker swarm## 初始化單節點Swarm docker swarm init# 部署測試服務 docker service create --name web --publish 8080:80 --replicas 3 nginx:alpine# Manager節點初始化&#xff08;指定IP&#xff09; docker swarm init --advertise-addr 192.168.1.100# 獲取加入令牌 M…

231. 2 的冪

Problem: 231. 2 的冪 文章目錄思路解題過程復雜度Code思路 2的冪 n 的二進制只有一個1&#xff0c;而 n - 1的二進制則是把 n 的二進制1變0, 0變1。 例&#xff1a;2^24100,34-1011. 解題過程 n & n - 1 0 復雜度 時間復雜度: O(1)O(1)O(1)空間復雜度: O(1)O(1)O(1) Co…

淺嘗AI輔助C轉Verilog方法

一、常規算法模塊的開發流程日常芯片開發工作中&#xff0c;挺多看工作是把C語言轉verilog。例如ISP的代碼&#xff0c;都很先由算法進行C model的開發&#xff0c;驗證完性能后&#xff0c;輸出算法原理文檔和c代碼&#xff1b;數字設計接手&#xff0c;把C語言轉換為verilog代…