一、深度学习概述

1. 什么是深度学习?

深度学习是机器学习的一个分支,它模仿人脑神经元的连接方式,通过多层次的神经网络结构来学习数据的抽象特征。就像婴儿学习识别物体一样,深度学习系统通过大量数据"学习"特征:

  • 传统机器学习:需要人工设计特征,提取特征。(如提取图像的边缘)
  • 深度学习:深度学习模仿人类大脑的运行方式,从大量数据中学习特征,自动学习特征。(从像素中直接学习物体形状)

机器学习是实现人工智能的一种途径,深度学习是机器学习的子集。

原始数据
浅层特征
中层特征
高级抽象
预测结果
2. 深度学习发展简史
时期 里程碑 意义
1943 McCulloch-Pitts神经元模型 首次模拟生物神经元
1958 感知机(Perceptron) 首个可学习模型
1986 反向传播算法 解决多层网络训练问题
2012 AlexNet在ImageNet夺冠 深度学习复兴的转折点
2017 Transformer架构 开启大语言模型时代
3. 深度学习的三大优势
  1. 自动特征提取:无需人工设计特征,直接从原始数据学习

    • 图像识别:从像素直接学习"猫"的特征
    • 语音识别:从声波学习音素和单词特征
  2. 处理复杂数据:擅长处理高维、非结构化数据

    • 医疗影像分析:CT扫描中的肿瘤检测
    • 自然语言处理:理解句子情感倾向
  3. 持续优化能力:数据越多,性能通常越好

    • 2012年ImageNet错误率:16%
    • 2022年ImageNet错误率:<1%

二、神经网络基础

​ 我们要学习的深度学习(Deep Learning)是神经网络的一个子领域,主要关注更深层次的神经网络结构,也就是深层神经网络(Deep Neural Networks,DNNs)。所以,我们需要先搞清楚什么是神经网络!

1. 感知神经网络

感知机是最简单的神经网络,由弗兰克·罗森布拉特于1958年提出。它模拟了生物神经元的工作方式:

权重w1
权重w2
输入1
求和
输入2
激活函数
输出

数学表示
output=f(∑i=1nwixi+b) output = f(\sum_{i=1}^{n} w_i x_i + b) output=f(i=1nwixi+b)
其中:

  • xix_ixi:输入信号
  • wiw_iwi:权重(控制输入重要性)
  • bbb:偏置(调节激活阈值)
  • fff:激活函数(如阶跃函数)
2. 人工神经网络

人工神经网络(ANN)是由多个感知机组成的网络:

组成部分

  1. 输入层(Input):接收原始数据
  2. 隐藏层(Hidden):进行特征提取和变换(通常1-100层)
  3. 输出层(Output):生成最终预测(分类或预测)

数学表示

如果有 n 个输入 x1,x2,…,xnx_1, x_2, \ldots, x_nx1,x2,,xn,权重分别为 w1,w2,…,wnw_1, w_2, \ldots, w_nw1,w2,,wn,偏置为 bbb,则神经元的输出 yyy 表示为:
z=∑i=1nwi⋅xi+by=σ(z) z=\sum_{i=1}^nw_i\cdot x_i+b \\ y=\sigma(z) z=i=1nwixi+by=σ(z)
其中,σ(z)\sigma(z)σ(z) 是激活函数。

例如:

线性回归:
y=∑i=1nwi⋅xi+b y=\sum_{i=1}^nw_i\cdot x_i+b \\ y=i=1nwixi+b
线性回归不需要激活函数,

逻辑回归:
z=∑i=1nwi⋅xi+by=σ(z)=sigmoid(z)=11+e−z z=\sum_{i=1}^nw_i\cdot x_i+b \\ y=\sigma(z)=sigmoid(z)=\frac{1}{1+e^{-z}} z=i=1nwixi+by=σ(z)=sigmoid(z)=1+ez1

对比生物神经元

生物神经元 人工神经元
树突接收信号 输入数据
细胞体处理信号 加权求和
轴突传递信号 激活函数
突触连接强度 权重参数
3. 深入神经网络

神经网络是由大量人工神经元按层次结构连接而成的计算模型。每一层神经元的输出作为下一层的输入,最终得到网络的输出。

基本结构

输入层
隐藏层1
隐藏层2
输出层

网络构建关键

  1. 层数深度:决定特征抽象能力
  2. 每层宽度:决定特征丰富度
  3. 连接方式:全连接/局部连接

在这里插入图片描述

全连接神经网络(FCN)

前馈神经网络(Feedforward Neural Network,FNN)是一种最基本的神经网络结构,其特点是信息从输入层经过隐藏层单向传递到输出层,没有反馈或循环连接

全连接神经网络(Fully Connected Neural Network,FCNN)是前馈神经网络的一种,每一层的神经元与上一层的所有神经元全连接,常用于图像分类、文本分类等任务。

在这里插入图片描述

  • 特点

    • 全连接层: 层与层之间的每个神经元都与前一层的所有神经元相连。

    • 权重数量: 由于全连接的特点,权重数量较大,容易导致计算量大、模型复杂度高。

    • 学习能力: 能够学习输入数据的全局特征,但对于高维数据却不擅长捕捉局部特征(如图像就需要CNN)。

  • 计算步骤

    1. 输入数据传递到隐藏层
    2. 每个神经元计算:z=W⋅X+bz = W·X + bz=WX+b
    3. 应用激活函数:a=f(z)a = f(z)a=f(z)
    4. 输出层生成预测
    5. 计算损失并反向传播更新权重

基本组件

  1. 权重矩阵(W):连接强度参数
  2. 偏置向量(b):每个神经元的激活阈值
  3. 激活函数:引入非线性(如Sigmoid、ReLU)
    • ReLU函数:f(x)=max(0,x)f(x) = max(0, x)f(x)=max(0,x)

三、数据准备

1. 数据加载器原理

在深度学习中,数据加载器负责:

  • 批量提供数据
  • 数据洗牌(随机排序)
  • 并行数据加载

构建数据类

Dataset是一个抽象类,是所有自定义数据集应该继承的基类。它定义了数据集必须实现的方法。

必须实现的方法

  1. __len__: 返回数据集的大小
  2. __getitem__: 支持整数索引,返回对应的样本
class CustomDataset(Dataset):
    def __init__(self, data, labels):
        self.data = data
        self.labels = labels
        
    def __len__(self):
        return len(self.data)  # 返回样本总数
    
    def __getitem__(self, idx):
        return self.data[idx], self.labels[idx]  # 返回单个样本
    
def test():
    # 简单的数据集准备
    data_x = torch.randn(666, 20, requires_grad=True, dtype=torch.float32)
    data_y = torch.randn(data_x.shape[0], 1, dtype=torch.float32)
    dataset = CustomDataset(data_x, data_y)
    # 随便打印个数据看一下
    print(dataset[0])


if __name__ == "__main__":
    test()

TensorDataset工具类

TensorDatasetDataset的一个简单实现,它封装了张量数据,适用于数据已经是张量形式的情况。

特点

  1. 简单快捷:当数据已经是张量形式时,无需自定义Dataset类
  2. 多张量支持:可以接受多个张量作为输入,按顺序返回
  3. 索引一致:所有张量的第一个维度必须相同,表示样本数量
from torch.utils.data import TensorDataset

# 创建张量
data_tensor = torch.randn(1000, 28, 28)  # 1000张28x28图像
label_tensor = torch.randint(0, 10, (1000,))  # 1000个标签

# 自动封装数据集
dataset = TensorDataset(data_tensor, label_tensor)

数据加载器(DataLoader)

在训练或者验证的时候,需要用到数据加载器批量的加载样本。

DataLoader 是一个迭代器,用于从 Dataset 中批量加载数据。它的主要功能包括:

  • 批量加载:将多个样本组合成一个批次。
  • 打乱数据:在每个 epoch 中随机打乱数据顺序。
  • 多线程加载:使用多线程加速数据加载。
from torch.utils.data import DataLoader

loader = DataLoader(
    dataset, 
    batch_size=32,  # 每批32个样本
    shuffle=True,   # 训练时打乱顺序
    num_workers=2   # 使用2个子进程加载
)
2. 数据集加载案例

加载CSV数据集

import pandas as pd

# 读取CSV
df = pd.read_csv('house_prices.csv')

# 提取特征和标签
features = df[['area', 'bedrooms']].values
labels = df['price'].values

# 转换为张量
X = torch.tensor(features, dtype=torch.float32)
y = torch.tensor(labels, dtype=torch.float32)

# 创建数据集
dataset = TensorDataset(X, y)

加载图像数据集

from torchvision import transforms
from torchvision.datasets import ImageFolder

# 定义图像变换
transform = transforms.Compose([
    transforms.Resize(256),         # 调整大小
    transforms.CenterCrop(224),     # 中心裁剪
    transforms.ToTensor(),          # 转为张量
    transforms.Normalize(           # 标准化
        mean=[0.485, 0.456, 0.406], 
        std=[0.229, 0.224, 0.225])
])

# 加载图像数据集
dataset = ImageFolder(
    root='path/to/images', 
    transform=transform
)

加载官方数据集
PyTorch内置常用数据集:

from torchvision import datasets

# MNIST手写数字
mnist = datasets.MNIST(
    root='./data', 
    train=True,        # 训练集
    download=True,     # 自动下载
    transform=transforms.ToTensor()
)

# CIFAR-10图像分类
cifar10 = datasets.CIFAR10(
    root='./data',
    train=False,       # 测试集
    download=True,
    transform=transforms.ToTensor()
)

关键概念解析

1. 激活函数的作用

激活函数引入非线性,使神经网络能够学习复杂模式:

  • Sigmoidf(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+ex1(将输出压缩到0-1)
  • ReLUf(x)=max(0,x)f(x) = max(0, x)f(x)=max(0,x)(解决梯度消失问题)
2. 数据标准化的数学原理

标准化使数据符合标准正态分布:
xnorm=x−μσ x_{\text{norm}} = \frac{x - \mu}{\sigma} xnorm=σxμ
其中μ\muμ是均值,σ\sigmaσ是标准差。这有助于:

  1. 加速模型收敛
  2. 提高数值稳定性
3. 批处理(Batch)的优势
  • 内存效率:避免一次性加载全部数据
  • 训练稳定性:小批量梯度更稳定
  • 硬件加速:利用GPU并行计算

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐