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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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代…