深度学习基础:从入门到理解核心概念

news2025/4/18 18:44:01

引言

        近年来,深度学习(Deep Learning)已成为人工智能领域最热门的研究方向之一。从AlphaGo战胜人类围棋冠军,到ChatGPT等大型语言模型的惊艳表现,深度学习技术正在深刻改变我们的生活和工作方式。本文将系统介绍深度学习的基础知识,帮助初学者建立对这一领域的全面认识。

 一、什么是深度学习?

       深度学习是机器学习的一个子领域,它通过模拟人脑神经元的工作方式,构建多层的神经网络模型,从数据中自动学习特征表示并进行预测或决策。

1.1 深度学习与机器学习的关系

- 传统机器学习:依赖人工特征工程,模型相对简单
- 深度学习:自动学习特征表示,模型复杂度高,需要大量数据

1.2 深度学习的特点

1.层次化特征学习:通过多层网络逐步提取从低级到高级的特征
2. 端到端学习:直接从原始数据学习到最终输出
3.强大的表示能力:能够建模复杂的非线性关系
4. 大数据依赖性:通常需要大量标注数据才能取得良好效果

二、神经网络基础

 2.1 感知机:最简单的神经网络

感知器是神经网络的基本单元,其数学模型为:


y = f(w·x + b)
 

其中:
- x:输入向量
- w:权重向量
- b:偏置项
- f:激活函数

2.2 激活函数的作用

激活函数为神经网络引入非线性,常见的激活函数包括:

1. Sigmoid:σ(x) = 1/(1+e^-x),输出范围(0,1)
2. Tanh:tanh(x) = (e^x - e^-x)/(e^x + e^-x),输出范围(-1,1)
3. ReLU:f(x) = max(0,x),目前最常用的激活函数
4. Leaky ReLU:f(x) = max(αx,x),解决ReLU的"神经元死亡"问题

2.3 神经网络的结构

典型的神经网络包含:
- 输入层:接收原始数据
- 隐藏层:进行特征变换和学习
- 输出层:产生最终预测结果

 三、深度学习的核心概念

3.1 前向传播与反向传播

1. 前向传播:数据从输入层流向输出层,计算预测值
2. 反向传播:根据预测误差,从输出层反向调整网络参数

 3.2 损失函数

衡量模型预测与真实值差异的函数,常见的有:
- 均方误差(MSE):用于回归问题
- 交叉熵(Cross-Entropy):用于分类问题

 3.3 优化算法

最常用的是梯度下降及其变种:
1. 随机梯度下降(SGD)
2. 动量法(Momentum)
3. Adam:结合了动量法和自适应学习率

3.4 正则化技术

防止过拟合的方法:
1. L1/L2正则化:在损失函数中添加参数惩罚项
2. Dropout:训练时随机丢弃部分神经元
3. Batch Normalization:规范化层输入,加速训练

 四、常见的深度学习模型

4.1 卷积神经网络(CNN)

特别适合处理图像数据,核心组件:
- 卷积层:提取局部特征
- 池化层:降维,保持平移不变性
- 全连接层:最终分类

典型结构:LeNet-5, AlexNet, VGG, ResNet等

4.2 循环神经网络(RNN)

处理序列数据的网络,具有"记忆"能力:
- 基本RNN
- LSTM:解决长程依赖问题
- GRU:LSTM的简化版

应用领域:自然语言处理、语音识别、时间序列预测

 4.3 生成对抗网络(GAN)

由生成器和判别器组成:
- 生成器:生成假数据
- 判别器:区分真假数据

应用:图像生成、风格迁移、数据增强

4.4 Transformer

基于自注意力机制的模型,已成为NLP领域的主流架构:
- 核心组件:Self-Attention, Multi-Head Attention
- 典型模型:BERT, GPT系列

实例

1、导入必要的模块:

import torch
print(torch.__version__)

# 导入必要的模块
from torch import nn  # 神经网络模块
from torch.utils.data import DataLoader  # 数据加载器
from torchvision import datasets  # 视觉数据集
from torchvision.transforms import ToTensor  # 将图像转换为张量

2、加载数据集:

# 下载训练数据集
training_data = datasets.MNIST(
    root='data',           # 数据保存路径
    train=True,            # 加载训练集
    download=True,         # 如果本地没有则下载
    transform=ToTensor(),  # 转换为张量
)

# 下载测试数据集
test_data = datasets.MNIST(
    root='data',
    train=False,          # 加载测试集
    download=True,
    transform=ToTensor(),
)

print(len(training_data))  # 输出训练集大小(60000)

3、数据可视化

from matplotlib import pyplot as plt

# 创建图像窗口
figure = plt.figure()

# 显示最后9张训练图像
for i in range(9):
    img, label = training_data[i+59000]  # 获取图像和标签
    
    # 添加子图
    figure.add_subplot(3, 3, i+1)
    plt.title(label)  # 设置标题为标签值
    plt.axis("off")  # 不显示坐标轴
    plt.imshow(img.squeeze(), cmap="gray")  # 显示灰度图像
    
    # squeeze()移除长度为1的维度
    a = img.squeeze()

plt.show()  # 显示图像

4、创建数据加载器:

# 创建训练数据加载器
train_dataloader = DataLoader(training_data, batch_size=64)

# 创建测试数据加载器
test_dataloader = DataLoader(test_data, batch_size=64)

5、设置计算设备:

# 检测可用设备
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
print(f"Using {device} device")

6、定义神经网络:

class NeuralNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        # 定义网络层
        self.flatten = nn.Flatten()  # 展平层(28*28 -> 784)
        self.hidden1 = nn.Linear(28*28, 128)  # 全连接层1
        self.hidden2 = nn.Linear(128, 256)    # 全连接层2
        self.out = nn.Linear(256, 10)         # 输出层
    
    def forward(self, x):
        # 定义前向传播
        x = self.flatten(x)
        x = self.hidden1(x)
        x = torch.relu(x)  # ReLU激活函数
        x = self.hidden2(x)
        x = torch.relu(x)
        x = self.out(x)
        return x

# 创建模型实例并移动到设备
model = NeuralNetwork().to(device)
print(model)

7、定义训练和测试函数:

def train(dataloader, model, loss_fn, optimizer):
    model.train()  # 设置为训练模式
    batch_size_num = 1
    
    for X, y in dataloader:  # 遍历数据批次
        X, y = X.to(device), y.to(device)  # 数据移动到设备
        
        # 前向传播
        pred = model(X)  # 计算预测值
        loss = loss_fn(pred, y)  # 计算损失
        
        # 反向传播
        optimizer.zero_grad()  # 梯度清零
        loss.backward()        # 计算梯度
        optimizer.step()       # 更新参数
        
        # 打印训练信息
        loss_value = loss.item()
        if batch_size_num % 100 == 0:
            print(f'loss:{loss_value:>7f} [number:{batch_size_num}]')
        batch_size_num += 1


def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)  # 数据集大小
    num_batches = len(dataloader)   # 批次数量
    model.eval()  # 设置为评估模式
    
    test_loss, correct = 0, 0
    
    with torch.no_grad():  # 禁用梯度计算
        for X, y in dataloader:
            X, y = X.to(device), y.to(device)
            pred = model(X)  # 计算预测
            
            # 累计损失和正确预测数
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1) == y).type(torch.float).sum().item()
    
    # 计算平均损失和准确率
    test_loss /= num_batches
    correct /= size
    print(f'Test result: \n Accuracy: {(100*correct)}%, Avg loss: {test_loss}')

8、模型的训练和评估:

# 定义损失函数和优化器
loss_fn = nn.CrossEntropyLoss()  # 交叉熵损失
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)  # Adam优化器

# 训练多个epoch
epochs = 16
for epoch in range(epochs):
    print(f"Epoch {epoch+1}\n-------------------------------")
    train(train_dataloader, model, loss_fn, optimizer)
    test(test_dataloader, model, loss_fn)

print("Done!")

结果显示:

结语

        深度学习作为人工智能的核心技术,正在各个领域展现出强大的能力。掌握深度学习的基础知识是进入这一领域的第一步。希望本文能为初学者提供一个系统的知识框架,更多深入的内容还需要在实践中不断学习和探索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2336415.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

科技项目验收测试报告有哪些作用?需要多长时间和费用?

在当今快速发展的科技环境中,科技项目的有效验收至关重要。对于公司、开发团队以及客户来说,科技项目验收测试报告更是一个不可缺少的一项重要环节。 科技项目验收测试报告是对一个项目在开发完成后所进行的一系列测试结果的总结。这份报告不仅用于证明…

CCLinkIE转ModbusTCP借网关之力打破组态王与三菱PLC通讯隔阂​

在某自动化生产线项目中,客户采用了三菱PLC作为现场控制核心,该PLC支持CCLinkIE现场总线协议。同时,客户希望使用组态王上位机软件进行生产过程的监控与管理,然而组态王上位机更擅长与ModbusTCP协议设备进行通讯。为了解决这一协议…

Linux网络编程第一课:深入浅出TCP/IP协议簇与网络寻址系统

知识点1【网络发展简史】 **网络节点:**路由器和交换机组成 交换机的作用:拓展网络接口 路由:网络通信路径 1、分组交换 分组的目的: 数据量大,不能一次型传输,只能分批次传输,这里的每一批…

GESP2023年12月认证C++七级( 第三部分编程题(2)纸牌游戏)

参考程序&#xff1a; #include <iostream> #include <cstring> // for memset #include <vector> using namespace std;const int max_n 1005; int n; int a[max_n], b[max_n], c[max_n]; // a[]: 得分系数&#xff1b;b[]: 换牌惩罚&#xff1b;c[]: …

HarmonyOS学习 实验九:@State和@Prop装饰器的使用方法

HarmonyOS应用开发&#xff1a;父子组件状态管理实验报告 引言 在HarmonyOS应用开发领域&#xff0c;组件之间的状态管理是一个至关重要的概念。通过有效的状态管理&#xff0c;我们可以确保应用的数据流动清晰、可预测&#xff0c;从而提升应用的稳定性和可维护性。本次实验…

【Ai】MCP实战:手写 client 和 server [Python版本]

什么是mcp MCP 是一个开放协议&#xff0c;它为应用程序向 LLM 提供上下文的方式进行了标准化。你可以将 MCP 想象成 AI 应用程序的 USB-C 接口。就像 USB-C 为设备连接各种外设和配件提供了标准化的方式一样&#xff0c;MCP 为 AI 模型连接各种数据源和工具提供了标准化的接口…

Java与C在典型场景下的性能对比深度剖析

&#x1f381;个人主页&#xff1a;User_芊芊君子 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 &#x1f50d;系列专栏&#xff1a;AI 【前言】 在计算机编程领域&#xff0c;Java和C语言都是举足轻重的编程语言。Java以其跨平台性、自动内存管理和丰富…

多智能体 AI 游戏框架(开源程序):竞争、发展、适应

一、软件介绍 文末提供程序和源码下载 SamoAI 在人类和 AI 之间创建了一个无缝的多代理叙事层&#xff0c;实现了跨多个平台的自然协作。通过一致的身份保留和情境记忆&#xff0c;它允许通过一系列行动随着时间的推移而演变的交互&#xff0c;就像人际关系一样。 二、核心概念…

java实现二叉树的前序、中序、后序遍历(递归和非递归方式)以及层级遍历

java实现二叉树的前序、中序、后序遍历以及层级遍历 一、二叉树节点定义二、递归方式1.前序遍历2.中序遍历3.后序遍历 三、非递归方式1.前序遍历2.中序遍历3.后序遍历4.层级遍历5.分层打印 四、测试用例 一、二叉树节点定义 class TreeNode {int val;TreeNode left;TreeNode r…

Solr admin 更新文档

<add><doc><field name"id">1904451090351546368</field><field name"companyName" update"set">测试科技有限公司</field></doc> </add>

【Netty篇】EventLoopGroup 与 EventLoop 详解

目录 开场白&#xff1a;话说 Netty 江湖第一段&#xff1a;EventLoopGroup——“包工头”的角色第二段&#xff1a;EventLoop——“身怀绝技的工人”第三段&#xff1a;EventLoop 如何处理 I/O 事件、普通任务和定时任务第四段&#xff1a;Handler 执行中如何换人&#xff1f;…

操作系统之shell实现(上)

&#x1f31f; 各位看官好&#xff0c;我是maomi_9526&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C语言的相关知识。 &#x1f44d; 如果觉得这篇文章有帮助&#xff0c;欢迎您一键三连&#xff0c;分享给更…

数据结构与算法——链表OJ题详解(2)

文章目录 一、前言二、OJ续享2.1相交链表2.2环形链表12.2环形链表2 三、总结 一、前言 哦了兄弟们&#xff0c;咱们上次在详解链表OJ题的时候&#xff0c;有一部分OJ题呢up并没有整理完&#xff0c;这一个星期呢&#xff0c;up也是在不断的学习并且沉淀着&#xff0c;也是终于…

Linux 基础知识详解

Linux 基础知识详解 一、快照与克隆 1. &#x1f4f8;快照&#xff08;Snapshot&#xff09; 快照是虚拟机当前运行状态的一次“瞬间拷贝”&#xff0c;包括内存、磁盘、配置等信息。这使得管理员能够快速恢复到某个特定的时间点。 用途&#xff1a; 安全实验前保存状态&am…

centOs7配置有限网络

最简单快速的是使用nmtui命令&#xff0c;采用图形页面修改。 点击编辑连接并回车&#xff1a; 选中编辑然后回车&#xff1a; 千万记住DNS服务器就是子网掩码&#xff0c;不是常说的DNS域名。把地址&#xff0c;网关&#xff0c;子网掩码配置好。只要ip不冲突&#xff0c;网…

C语言 —— 指尖跃迁 刻印永恒 - 文件操作

目录 1. 什么是文件 1.1 程序文件 1.2 数据文件 1.3 文件名 2. 二进制文件和文本文件 3. 文件的打开与关闭 3.1 流和标准流 3.2 文件指针 3.3 文件的打开与关闭 fopen fclose 4. 文件的顺序读写 4.1 fgetc和fputc fgetc fputc 4.2 fgets和fputs fgets fputs…

网络安全与信息安全的区别​及共通

在数字化时代&#xff0c;网络安全与信息安全已成为保障个人、企业乃至国家正常运转的重要防线。尽管二者紧密相关且常被混为一谈&#xff0c;但实则存在显著差异。当然&#xff0c;它们也有一些相同点&#xff0c;比如都以保障数字环境下的安全为核心目标&#xff0c;均需要通…

【愚公系列】《Python网络爬虫从入门到精通》052-Scrapy 编写 Item Pipeline

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…

【AI News | 20250416】每日AI进展

AI Repos 1、Tutorial-Codebase-Knowledge 自动分析 GitHub 仓库并生成适合初学者的通俗易懂教程&#xff0c;清晰解释代码如何运行&#xff0c;还能生成可视化内容来展示核心功能。爬取 GitHub 仓库并从代码中构建知识库&#xff1b;分析整个代码库以识别核心抽象概念及其交互…

GIS开发笔记(6)结合osg及osgEarth实现半球形区域绘制

一、实现效果 输入中心点坐标及半径&#xff0c;绘制半球形区域&#xff0c;地下部分不显示。 二、实现原理 根据中心点及半径绘制半球形区域&#xff0c;将其挂接到地球节点。 三、参考代码 void GlobeWidget::drawSphericalRegion(osg::Vec3d point,double radius) {// 使…