《零基础入门AI:深度学习入门(从深度学习概述到数据准备)》
一、深度学习概述
1. 什么是深度学习?
深度学习是机器学习的一个分支,它模仿人脑神经元的连接方式,通过多层次的神经网络结构来学习数据的抽象特征。就像婴儿学习识别物体一样,深度学习系统通过大量数据"学习"特征:
- 传统机器学习:需要人工设计特征,提取特征。(如提取图像的边缘)
- 深度学习:深度学习模仿人类大脑的运行方式,从大量数据中学习特征,自动学习特征。(从像素中直接学习物体形状)
机器学习是实现人工智能的一种途径,深度学习是机器学习的子集。
2. 深度学习发展简史
| 时期 | 里程碑 | 意义 |
|---|---|---|
| 1943 | McCulloch-Pitts神经元模型 | 首次模拟生物神经元 |
| 1958 | 感知机(Perceptron) | 首个可学习模型 |
| 1986 | 反向传播算法 | 解决多层网络训练问题 |
| 2012 | AlexNet在ImageNet夺冠 | 深度学习复兴的转折点 |
| 2017 | Transformer架构 | 开启大语言模型时代 |
3. 深度学习的三大优势
-
自动特征提取:无需人工设计特征,直接从原始数据学习
- 图像识别:从像素直接学习"猫"的特征
- 语音识别:从声波学习音素和单词特征
-
处理复杂数据:擅长处理高维、非结构化数据
- 医疗影像分析:CT扫描中的肿瘤检测
- 自然语言处理:理解句子情感倾向
-
持续优化能力:数据越多,性能通常越好
- 2012年ImageNet错误率:16%
- 2022年ImageNet错误率:<1%
二、神经网络基础
我们要学习的深度学习(Deep Learning)是神经网络的一个子领域,主要关注更深层次的神经网络结构,也就是深层神经网络(Deep Neural Networks,DNNs)。所以,我们需要先搞清楚什么是神经网络!
1. 感知神经网络
感知机是最简单的神经网络,由弗兰克·罗森布拉特于1958年提出。它模拟了生物神经元的工作方式:
数学表示:
output=f(∑i=1nwixi+b) output = f(\sum_{i=1}^{n} w_i x_i + b) output=f(i=1∑nwixi+b)
其中:
- xix_ixi:输入信号
- wiw_iwi:权重(控制输入重要性)
- bbb:偏置(调节激活阈值)
- fff:激活函数(如阶跃函数)
2. 人工神经网络
人工神经网络(ANN)是由多个感知机组成的网络:
组成部分:
- 输入层(Input):接收原始数据
- 隐藏层(Hidden):进行特征提取和变换(通常1-100层)
- 输出层(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=1∑nwi⋅xi+by=σ(z)
其中,σ(z)\sigma(z)σ(z) 是激活函数。
例如:
线性回归:
y=∑i=1nwi⋅xi+b y=\sum_{i=1}^nw_i\cdot x_i+b \\ y=i=1∑nwi⋅xi+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=1∑nwi⋅xi+by=σ(z)=sigmoid(z)=1+e−z1
对比生物神经元:
| 生物神经元 | 人工神经元 |
|---|---|
| 树突接收信号 | 输入数据 |
| 细胞体处理信号 | 加权求和 |
| 轴突传递信号 | 激活函数 |
| 突触连接强度 | 权重参数 |
3. 深入神经网络
神经网络是由大量人工神经元按层次结构连接而成的计算模型。每一层神经元的输出作为下一层的输入,最终得到网络的输出。
基本结构:
网络构建关键:
- 层数深度:决定特征抽象能力
- 每层宽度:决定特征丰富度
- 连接方式:全连接/局部连接

全连接神经网络(FCN):
前馈神经网络(Feedforward Neural Network,FNN)是一种最基本的神经网络结构,其特点是信息从输入层经过隐藏层单向传递到输出层,没有反馈或循环连接。
全连接神经网络(Fully Connected Neural Network,FCNN)是前馈神经网络的一种,每一层的神经元与上一层的所有神经元全连接,常用于图像分类、文本分类等任务。

-
特点:
-
全连接层: 层与层之间的每个神经元都与前一层的所有神经元相连。
-
权重数量: 由于全连接的特点,权重数量较大,容易导致计算量大、模型复杂度高。
-
学习能力: 能够学习输入数据的全局特征,但对于高维数据却不擅长捕捉局部特征(如图像就需要CNN)。
-
-
计算步骤:
- 输入数据传递到隐藏层
- 每个神经元计算:z=W⋅X+bz = W·X + bz=W⋅X+b
- 应用激活函数:a=f(z)a = f(z)a=f(z)
- 输出层生成预测
- 计算损失并反向传播更新权重
基本组件:
- 权重矩阵(W):连接强度参数
- 偏置向量(b):每个神经元的激活阈值
- 激活函数:引入非线性(如Sigmoid、ReLU)
- ReLU函数:f(x)=max(0,x)f(x) = max(0, x)f(x)=max(0,x)
三、数据准备
1. 数据加载器原理
在深度学习中,数据加载器负责:
- 批量提供数据
- 数据洗牌(随机排序)
- 并行数据加载
构建数据类:
Dataset是一个抽象类,是所有自定义数据集应该继承的基类。它定义了数据集必须实现的方法。
必须实现的方法
__len__: 返回数据集的大小__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工具类:
TensorDataset是Dataset的一个简单实现,它封装了张量数据,适用于数据已经是张量形式的情况。
特点
- 简单快捷:当数据已经是张量形式时,无需自定义Dataset类
- 多张量支持:可以接受多个张量作为输入,按顺序返回
- 索引一致:所有张量的第一个维度必须相同,表示样本数量
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. 激活函数的作用
激活函数引入非线性,使神经网络能够学习复杂模式:
- Sigmoid:f(x)=11+e−xf(x) = \frac{1}{1+e^{-x}}f(x)=1+e−x1(将输出压缩到0-1)
- ReLU:f(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σ是标准差。这有助于:
- 加速模型收敛
- 提高数值稳定性
3. 批处理(Batch)的优势
- 内存效率:避免一次性加载全部数据
- 训练稳定性:小批量梯度更稳定
- 硬件加速:利用GPU并行计算
更多推荐


所有评论(0)