【DL】神经网络与机器学习基础知识介绍(二)【附程序】
原文:https://mengwoods.github.io/post/dl/009-dl-fundamental-2/
文章目录
- 激活函数
- 卷积神经网络
- 超参数
- 其他
- 程序
激活函数
- 激活函数的目的是在模型中引入非线性,使网络能够学习和表示数据中的复杂模式。列出常见的激活函数。
- 线性函数: y = x y=x y=x,通常只在输出层使用。
- Sigmoid函数:S形曲线, y = 1 / ( 1 + e ( − x ) ) y = 1 / (1 + e^(-x)) y=1/(1+e(−x))。它是非线性的,当X值在-2到2之间时,Y值变化非常陡峭。Y值范围是0到1。通常用于二分类的输出层,结果为0或1。
- Tanh函数:效果比Sigmoid函数更好,亦称双曲正切函数,是Sigmoid函数的数学变形。 y = t a n h ( x ) = 2 / ( 1 + e − 2 x ) − 1 y = tanh(x) = 2/(1+e^{-2x})-1 y=tanh(x)=2/(1+e−2x)−1 或 y = 2 ∗ s i g m o i d ( 2 x ) − 1 y = 2*sigmoid(2x)-1 y=2∗sigmoid(2x)−1。值范围是-1到1。通常用于网络的隐藏层,有助于通过将均值接近0来中心化数据。
- ReLU函数:修正线性单元,最广泛使用的激活函数,主要用于隐藏层。 y = m a x ( 0 , x ) y = max(0,x) y=max(0,x)。由于涉及的数学运算更简单,ReLU比Tanh和Sigmoid的计算开销更小。ReLU学习速度比Sigmoid和Tanh快得多。
- Softmax:也是一种Sigmoid函数,但适用于多分类问题。通常用于图像分类问题的输出层。理想情况下用于输出层,以输出概率来定义每个输入的类别。
基本规则:如果不知道使用哪种激活函数,可以简单地使用ReLU。对于输出层,二分类使用Sigmoid函数,多分类使用Softmax。
卷积神经网络
CNN专为处理结构化网格数据(如图像)而设计。它学习特征的空间层次,因此在图像分类、目标检测和语义分割等任务中效果显著。
-
CNN中的卷积层如何工作?
- 它对输入数据应用一组滤波器(内核),每个滤波器在输入数据上滑动,计算点积。它生成一个特征图,突出显示特定特征(如边缘或纹理)的存在。卷积操作后接一个非线性激活函数。
-
CNN的主要组成部分是什么?
- 输入层:保存图像的原始像素值。输入维度通常对应图像的高度、宽度和颜色通道。
- 卷积层:重要参数包括滤波器数量、滤波器大小、步幅和填充。
- 池化层:在保留最重要信息的同时,减少特征图的空间维度。常见类型包括最大池化和平均池化。
- 输出层:使用如Softmax用于多分类或Sigmoid用于二分类的激活函数产生每个类别的输出概率。
-
介绍一些著名的CNN网络:
- AlexNet:2012年,包含5个卷积层,一些卷积层后跟随最大池化层,三个全连接层。激活函数使用ReLU。
- VGGNet:2014年。由一系列具有小感受野(3x3)的卷积层、最大池化层和三个全连接层组成。变体包括VGG16和VGG19。它显示了网络深度是高性能的关键组成部分。
超参数
- 简要介绍神经网络训练中的关键超参数。
- 学习率Learning rate:控制每次模型更新时调整权重的幅度。较高的学习率意味着更大的步长,可以加速训练,但可能会超过最优解。较低的学习率意味着较小的步长和更精确的收敛。
- 批大小Batch size:一次前向/后向传递中使用的训练样本数量。较大的批大小提供更准确的梯度估计,但需要更多内存。较小的批大小可能导致估计更嘈杂,但有助于泛化。
- 训练轮数(Epochs):整个训练数据集通过神经网络的次数。更多的训练轮数可以更好地学习,但可能导致过拟合。
- 丢弃率Dropout rate:正则化技术,在训练期间随机忽略神经元。决定丢弃的神经元比例。通常丢弃20%的节点。
- 学习率衰减Learning rate decay:随着训练的进行,减少学习率,有助于在训练结束时更平滑地收敛。
其他
- 什么是数据归一化?
- 标准化和重构数据,是消除数据冗余的预处理步骤。将值缩放到特定范围,达到更好的收敛效果。
- 前馈神经网络和循环神经网络的区别是什么?
- 前馈网络中的信号从输入到输出单向传播,层之间没有反馈环。它不能记住先前的输入。
- 循环神经网络中的信号双向传播,形成循环网络。它在生成层输出时考虑当前输入和先前收到的输入,能够由于其内部记忆而记住过去的数据。
- 什么是批量归一化?
- 通过在每一层中归一化输入使其具有零均值和单位标准差,以提高神经网络的性能和稳定性。
- 什么是长短期记忆网络?
- 是一种特殊的RNN,能够学习长期依赖性,记住信息的时间长短是其默认行为。
程序
用PyTorch编写一个简单的神经网络,包括训练步骤和通过新输入数据进行验证。
这个脚本用于创建、训练和评估一个简单的神经网络模型。首先,您可以通过设置mode='train'
在main
函数中运行脚本来训练模型。在训练过程中,脚本将生成合成数据,定义网络结构,进行训练,并将训练后的模型保存到文件model.pth
。如果您希望评估已训练的模型,则可以将mode
设置为'eval'
,脚本将加载保存的模型并对新生成的输入数据进行预测,输出每个输入的特征和及其预测类别。通过调整mode
参数,您可以在训练和评估模式之间切换。
# 引言
# 此脚本演示了使用PyTorch创建、训练和评估一个简单的神经网络。
# 生成的合成数据根据其特征和的特定规则,网络经过训练来分类这些数据。
# 脚本是模块化的,包括生成数据、定义模型、训练和评估的函数。
# main函数控制脚本运行在训练模式还是评估模式。# 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset# 生成具有某些底层规则的合成数据的函数
def generate_synthetic_data(num_samples, input_dim, num_classes):inputs = torch.randn(num_samples, input_dim)targets = torch.empty(num_samples, dtype=torch.long)for i in range(num_samples):feature_sum = inputs[i].sum().item()# 根据特征和的范围分配目标标签if feature_sum < -10:targets[i] = 0elif feature_sum < -5:targets[i] = 1elif feature_sum < 0:targets[i] = 2elif feature_sum < 5:targets[i] = 3elif feature_sum < 10:targets[i] = 4elif feature_sum < 15:targets[i] = 5elif feature_sum < 20:targets[i] = 6elif feature_sum < 25:targets[i] = 7elif feature_sum < 30:targets[i] = 8else:targets[i] = 9return inputs, targets# 定义神经网络模型类
class SimpleNN(nn.Module):def __init__(self):super(SimpleNN, self).__init__()self.fc1 = nn.Linear(784, 128) # 全连接层,从784个神经元到128个神经元self.fc2 = nn.Linear(128, 10) # 全连接层,从128个神经元到10个神经元def forward(self, x):x = torch.relu(self.fc1(x)) # 在第一层之后应用ReLU激活函数x = self.fc2(x) # 输出层,不使用激活函数return x# 训练模型的函数
def train_model(model, dataloader, criterion, optimizer, num_epochs):for epoch in range(num_epochs):running_loss = 0.0for batch_inputs, batch_targets in dataloader:optimizer.zero_grad() # 在反向传播之前清零梯度outputs = model(batch_inputs) # 前向传播:计算输出loss = criterion(outputs, batch_targets) # 计算损失loss.backward() # 反向传播:计算梯度optimizer.step() # 更新权重running_loss += loss.item() * batch_inputs.size(0) # 累计损失以供监控epoch_loss = running_loss / len(dataloader.dataset) # 计算平均损失print(f'第 {epoch+1}/{num_epochs} 轮,损失: {epoch_loss:.4f}')print('训练完成。')# 评估模型的函数
def evaluate_model(model, inputs):model.eval() # 设置模型为评估模式with torch.no_grad(): # 在推理过程中不需要计算梯度predictions = model(inputs)for i in range(len(inputs)):print(f"输入 {i+1} 的和: {inputs[i].sum().item()}")print(f"预测 {i+1}: {predictions[i].argmax().item()}")print("-" * 50)# 主函数
def main(mode='train'):# 超参数num_samples = 1000input_dim = 784num_classes = 10batch_size = 64learning_rate = 0.001num_epochs = 100# 生成合成数据inputs, targets = generate_synthetic_data(num_samples, input_dim, num_classes)# 创建一个DataLoader以进行批处理dataset = TensorDataset(inputs, targets)dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)# 实例化模型model = SimpleNN()# 定义损失函数和优化器criterion = nn.CrossEntropyLoss() # 适用于具有多个类别的分类任务optimizer = optim.Adam(model.parameters(), lr=learning_rate) # 学习率为0.001的Adam优化器if mode == 'train':# 训练模型train_model(model, dataloader, criterion, optimizer, num_epochs)# 保存模型状态字典torch.save(model.state_dict(), 'model.pth')print("模型已保存到 'model.pth'")elif mode == 'eval':# 加载模型model.load_state_dict(torch.load('model.pth'))print("模型已从 'model.pth' 加载")# 示例新输入数据new_inputs = torch.randn(10, 784) # 10个新样本的批次,每个样本有784个特征# 评估模型evaluate_model(model, new_inputs)if __name__ == '__main__':main(mode='eval') # 根据需要设置为 'train' 或 'eval'
训练过程:
$ python pytorch.py
Epoch 1/10, Loss: 2.2189
Epoch 2/10, Loss: 1.6003
Epoch 3/10, Loss: 1.2118
Epoch 4/10, Loss: 0.8805
Epoch 5/10, Loss: 0.5897
Epoch 6/10, Loss: 0.3645
Epoch 7/10, Loss: 0.2167
Epoch 8/10, Loss: 0.1331
Epoch 9/10, Loss: 0.0879
Epoch 10/10, Loss: 0.0624
Training complete.
Model saved to 'model.pth'
使用过程:
$ python pytorch.py
Model loaded from 'model.pth'
Input 1 Sum: 39.23176193237305
Prediction 1: 4
--------------------------------------------------
Input 2 Sum: -3.4055228233337402
Prediction 2: 2
--------------------------------------------------
Input 3 Sum: 32.59678649902344
Prediction 3: 9
--------------------------------------------------
Input 4 Sum: 32.965431213378906
Prediction 4: 3
--------------------------------------------------
Input 5 Sum: -11.920291900634766
Prediction 5: 0
--------------------------------------------------
Input 6 Sum: -6.332043647766113
Prediction 6: 4
--------------------------------------------------
Input 7 Sum: -1.9515066146850586
Prediction 7: 0
--------------------------------------------------
Input 8 Sum: 7.156068801879883
Prediction 8: 5
--------------------------------------------------
Input 9 Sum: 2.85219669342041
Prediction 9: 0
--------------------------------------------------
Input 10 Sum: -20.769487380981445
Prediction 10: 3
--------------------------------------------------
相关文章:

【DL】神经网络与机器学习基础知识介绍(二)【附程序】
原文:https://mengwoods.github.io/post/dl/009-dl-fundamental-2/ 文章目录 激活函数卷积神经网络超参数其他程序 激活函数 激活函数的目的是在模型中引入非线性,使网络能够学习和表示数据中的复杂模式。列出常见的激活函数。 线性函数: y…...

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)
目录 冒泡排序算法的平均时间复杂度和最坏时间复杂度分别是多少?在什么情况下使用冒泡排序较为合适? 选择排序算法是稳定的排序算法吗?为什么? 插入排序在近乎有序的数组中表现如何?为什么? 快速排序的基本思想是什么?它在最坏情况下的时间复杂度是多少? 归并排序…...

iceberg 用户文档(持续更新)
iceberg 用户文档 表 Schema 变更查看表的元数据信息表参数变更 表 Schema 变更 Iceberg 支持使用 Alter table … alter column 语法对 Schema 进行变更,示例如下 -- spark sql -- 更改字段类型 ALTER TABLE prod.db.sample ALTER COLUMN measurement TYPE doubl…...

基于YOLOv8的船舶检测系统
基于YOLOv8的船舶检测系统 (价格85) 包含 【散货船,集装箱船,渔船,杂货船,矿砂船,客船】 6个类 通过PYQT构建UI界面,包含图片检测,视频检测,摄像头实时检测。 (该…...

使用腾讯云域名解析实现网站重定向
前言 最近,在CSDN平台上我写了一系列博客,希望能与同学分享一些技术心得。然而,每当需要向他人推荐我的博客时,那串复杂且缺乏规律的CSDN博客首页域名总让我感到不便。这让我开始思考,如果能将这一域名替换为一个既个…...

为什么相比直接使用new和std::shared_ptr构造函数,make_shared在内存分配和管理方面更为高效。
使用std::make_shared相比于直接使用new和std::shared_ptr构造函数在内存分配和管理方面更为高效,主要原因如下: 内存分配效率 std::make_shared通过一次内存分配来同时分配控制块(用于引用计数等)和对象的内存。这种方式减少了…...

7-Python数据类型——列表和元组的详解(增删改查、索引、切片、步长、循环)
一、列表 1.1 列表 list 有序且可变的容器,可以存放多个不同类型的元素 列表就是专门用来记录多个同种属性的值 列表:存储同一个类别的数据,方便操作 字符串,不可变:即:创建好之后内部就无法修改【内置…...

大数据-61 Kafka 高级特性 消息消费02-主题与分区 自定义反序列化 拦截器 位移提交 位移管理 重平衡
点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

Google Gemma2 2B:语言模型的“小时代”到来?
北京时间8月1日凌晨(当地时间7月31日下午),Google发布了其Gemma系列开源语言模型的更新,在AI领域引发了巨大的震动。Google Developer的官方博客宣布,与6月发布的27B和9B参数版本相比,新的2B参数模型在保持…...

三线程顺序打印1-100
三线程顺序打印1-100 题目 三个线程顺序打印1-100; 解题 基本思路 首先需要创建三个线程, 确定使用线程1打印 num % 3 1 的数, 线程2打印 num % 3 2 的数, 线程3打印 num % 3 0 的数;使用 synchronized 同步锁让每次只有一个线程进行打印, 每个线程打印前先判断当前数是…...

中央处理器CPU
中央处理器CPU cpu的组成(从功能方面来看)cpu的执行过程★.取指令阶段★.解码阶段★.执行阶段 重点: 1.cpu的组成 2.cpu怎么执行程序(命令) cpu的组成(从功能方面来看) 寄存器:用来临…...

用Python实现AI人脸识别
实现AI人脸识别通常涉及到使用深度学习库,如TensorFlow或PyTorch,配合预训练的人脸识别模型。以下是一个使用Python和TensorFlow框架中的tensorflow_hub模块来加载和使用一个预训练的人脸识别模型的简单示例。 步骤 1: 安装必要的库 首先,你…...

MSPM0G3507_2024电赛自动行驶小车(H题)_问题与感悟
这次电赛题目选的简单了,还规定不能使用到摄像头,这让我之前学习的Opencv 4与树莓派无用武之地了,但我当时对于三子棋题目饶有兴趣,但架不住队友想稳奖,只能选择这个H题了...... 之后我还想抽空将这个E题三子棋题目做…...

C语言:指针(2)
一.数组名 在了解数组名前我们先看一段代码 int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[0]; 根据我们上一篇学习的知识,我们知道&arr[0]是数组第一个元素的地址,这时我们再看另一段代码的运行结果。 #include <stdio.h> int ma…...

数组——二维数组
数组(中) 二维数组 定义 二维数组本质上是一个行列式的组合,也就是说二维数组是有行和列两部分构成。二维数组数据是通过行列进行解读。 二维数组可被视为一个特殊的一维数组,相当于二维数组又是一个一维数组,只不过它的元素是一维数组。 …...

深入 Vue 组件与状态管理的教程
目录 深入 Vue 组件与状态管理的教程第一部分:深入组件1. 理解插槽(Slots)的使用1.1 基础插槽示例1.2 具名插槽1.3 作用域插槽 第二部分:Vue Router1. 学习 Vue Router 的基本配置1.1 基本路由配置1.2 嵌套路由1.3 路由参数 2. 导…...

Spring Boot 实现异步处理多个并行任务
在现代Web应用开发中,异步处理和多任务并行处理对于提高系统的响应性和吞吐量至关重要。Spring Boot 提供了多种机制来实现异步任务处理,本文将介绍如何利用这些机制来优化您的应用程序性能。 1. 引言 在高负载情况下,如果所有的请求都采用…...

TiDB系列之:使用Flink TiDB CDC Connector采集数据
TiDB系列之:使用Flink TiDB CDC Connector采集数据 一、依赖项二、Maven依赖三、SQL Client JAR四、如何创建 TiDB CDC 表五、连接器选项六、可用元数据七、特征一次性处理启动阅读位置多线程读取DataStream Source 八、数据类型映射 TiDB CDC 连接器允许从 TiDB 数…...

每日一道算法题 最接近的三数之和
题目 16. 最接近的三数之和 - 力扣(LeetCode) Python class Solution:def threeSumClosest(self, nums: List[int], target: int) -> int:nums.sort()nlen(nums)ans0min_diffinf # infinite 无穷for i in range(n-2):tmpnums[i]li1rn-1while l<…...

搭建自己的金融数据源和量化分析平台(六):下载并存储沪深两市上市公司财报
基于不依赖wind、某花顺等第三方平台数据的考虑,尝试直接从财报中解析三大报表进而计算ROE等财务指标,因此需要下载沪深两市的上市公司财报数据,便于后续从pdf中解析三大报表。 深市爬虫好做,先放深市爬虫: 根据时间段…...

C语言-常见关键字详解
一、const 关键字const用于声明常量,赋值后,其值不能再被修改。 示例: const int MAX_COUNT 100; 二、static static关键字在不同情境下有不同作用: 1.函数中的静态变量:保留变量状态,仅初始化一次&a…...

异步编程之std::future(一): 使用
目录 1.概述 2.std::future的基本用法 3.使用 std::shared_future 4.std::future的使用场景 5.总结 1.概述 在编程实践中,我们常常需要使用异步调用。通过异步调用,我们可以将一些耗时、阻塞的任务交给其他线程来执行,从而保证当前线程的…...

Vue3 + JS项目配置ESLint Pretter
前言 如果在开发大型项目 同时为多人协作开发 那么 ESLint 在项目中极为重要 在使用 ESLint 的同时 也需要使用 Pretter插件 统一对代码进行格式化 二者相辅相成 缺一不可 1. 安装 VsCode 插件 在 VsCode 插件市场搜索安装 ESLint 和 Pretter 2. 安装依赖 这里直接在 pac…...

JavaScript (十四)——JavaScript typeof和类型转换
目录 JavaScript typeof, null, 和 undefined typeof 操作符 null undefined undefined 和 null 的区别 JavaScript 类型转换 JavaScript 数据类型 JavaScript 类型转换 将数字转换为字符串 将布尔值转换为字符串 将日期转换为字符串 将字符串转换为数字 一元运算符…...

CTF-web 基础
网络协议 OSI七层参考模型:一个标准的参考模型 物理层 网线,网线接口等。 数据链路层 可以处理物理层传入的信息。 网络层 比如IP地址 传输层 控制传输的内容的传输,在传输的过程中将要传输的信息分块传输完成之后再进行合并。 应用…...

CP AUTOSAR标准之ChineseV2XNetwork(AUTOSAR_SWS_ChineseV2XNetwork)(更新中……)
1 简介和功能概述 本文档指定了AUTOSAR基础软件模块中国车辆对接网络(CnV2xNet)的功能、API和配置。 中国车联网网络(CnV2xNet)与中国车联网消息(CnV2xMsg)、中国车联网管理(CnV2xMgt)、中国车联网安全(CnV2xSec)以及AUTOSAR BSW模块以太网接口(EthIf)共同构成了AUTOSAR架构…...

【hloc】 项目流程
hloc 项目流程 1. 数据集准备2. 特征提取3. 匹配特征4. 三维重建5. 定位6. 结果评估7. 示例脚本 这个项目涉及到了视觉定位和三维重建的一系列步骤,从特征提取、匹配、三维重建到定位和结果评估。通过提供的脚本文件,用户可以方便地运行整个流程。 1. 数…...

鸿蒙系统开发【应用接续】基本功能
应用接续 介绍 基于ArkTS扩展的声明式开发范式编程语言编写的一个分布式视频播放器,主要包括一个直播视频播放界面,实现视频播放时可以从一台设备迁移到另一台设备继续运行,来选择更合适的设备继续执行播放功能以及PAD视频播放时协同调用手…...

nextTick方法的作用是什么?什么时候会用到
nextTick 方法在 Vue.js 中扮演着重要的角色,它用于在下次 DOM 更新循环结束之后执行延迟回调。这主要用于确保在 Vue 完成 DOM 更新后执行依赖于 DOM 的操作。 作用 确保 DOM 更新完成:Vue 的 DOM 更新是异步的,当你修改了数据后࿰…...

多 NodeJS 环境管理
前言 对于某个项目依赖特定版本的 NodeJS,或几个项目的 NodeJS 版本冲突时,需要在系统中安装多个版本的 NodeJS,这时可以使用一些工具来进行多个 NodeJS 的管理。 有很多类似的 NodeJS 管理工具,如 nvm, nvs, n 等,接…...