AI入门指南:李宏毅吴恩达李飞飞李沐四门课程学习路线

📅 2026/7/22 14:38:52 👁️ 阅读次数 📝 编程学习
AI入门指南:李宏毅吴恩达李飞飞李沐四门课程学习路线

很多刚接触AI的同学会觉得这个领域门槛很高,需要深厚的数学基础和编程能力才能入门。但实际上,通过系统学习几位顶尖专家的课程,完全可以在短时间内掌握人工智能的核心概念和实践技能。本文将围绕李宏毅的机器学习、吴恩达的深度学习、李飞飞的计算机视觉以及李沐的PyTorch实战这四门经典课程,为你提供一条清晰的AI入门路径。

1. 人工智能学习路线概述

1.1 为什么选择这四位专家的课程

这四位专家在AI领域都有着深厚的学术背景和丰富的教学经验,他们的课程各有侧重,形成了一个完整的学习体系:

  • 李宏毅机器学习:以生动有趣的方式讲解机器学习基础概念,适合零基础入门
  • 吴恩达深度学习:系统性地介绍神经网络和深度学习原理,建立完整的知识框架
  • 李飞飞计算机视觉:专注于图像识别和处理,是CV领域的权威课程
  • 李沐PyTorch实战:通过实际代码演示,教会你如何用PyTorch实现AI模型

1.2 学习路径规划建议

对于零基础的学习者,建议按照以下顺序进行学习:

  1. 先学习李宏毅的机器学习课程,建立基本概念
  2. 接着学习吴恩达的深度学习专项课程
  3. 然后学习李飞飞的计算机视觉课程
  4. 最后通过李沐的PyTorch课程进行实战练习

整个学习周期大约需要3-6个月,每天投入2-3小时的学习时间。

2. 李宏毅机器学习课程精讲

2.1 课程核心内容梳理

李宏毅教授的机器学习课程以其幽默风趣的讲解风格著称,特别适合初学者。课程主要涵盖以下内容:

  • 机器学习基本概念:什么是机器学习、监督学习、无监督学习、强化学习
  • 回归问题:线性回归、多项式回归、正则化
  • 分类问题:逻辑回归、支持向量机、决策树
  • 深度学习基础:神经网络的基本原理和结构

2.2 重点知识点详解

2.2.1 线性回归实战

线性回归是机器学习中最基础的算法,李宏毅教授通过生动的例子讲解了其数学原理和实现方法:

import numpy as np import matplotlib.pyplot as plt # 生成模拟数据 np.random.seed(42) X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) # 使用正规方程求解 X_b = np.c_[np.ones((100, 1)), X] # 添加偏置项 theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y) print("模型参数:", theta_best) # 预测新数据 X_new = np.array([[0], [2]]) X_new_b = np.c_[np.ones((2, 1)), X_new] y_predict = X_new_b.dot(theta_best) # 可视化结果 plt.plot(X, y, "b.") plt.plot(X_new, y_predict, "r-") plt.xlabel("X") plt.ylabel("y") plt.axis([0, 2, 0, 15]) plt.show()
2.2.2 梯度下降算法

梯度下降是优化机器学习模型的关键算法:

def gradient_descent(X, y, theta, learning_rate, iterations): m = len(y) cost_history = np.zeros(iterations) for i in range(iterations): # 计算梯度 gradients = theta - (1/m) * X.T.dot(X.dot(theta) - y) # 更新参数 theta = theta - learning_rate * gradients # 记录损失值 cost_history[i] = compute_cost(X, y, theta) return theta, cost_history def compute_cost(X, y, theta): m = len(y) predictions = X.dot(theta) return (1/(2*m)) * np.sum(np.square(predictions - y))

2.3 学习建议和常见问题

  • 数学基础要求:只需要高中水平的数学知识即可理解大部分内容
  • 编程实践:建议边看课程边动手实现代码
  • 常见误区:不要过分追求数学推导的完美,先理解概念再深入细节

3. 吴恩达深度学习专项课程

3.1 课程体系结构

吴恩达的深度学习专项课程分为5个部分,系统性地介绍了深度学习的各个方面:

  1. 神经网络和深度学习:基础概念和实现
  2. 改善深层神经网络:超参数调试、正则化、优化算法
  3. 结构化机器学习项目:机器学习策略和项目管理
  4. 卷积神经网络:图像处理专用网络结构
  5. 序列模型:RNN、LSTM等时序数据处理模型

3.2 神经网络基础实现

3.2.1 简单神经网络实现
import numpy as np def initialize_parameters(layer_dims): parameters = {} L = len(layer_dims) for l in range(1, L): parameters[f'W{l}'] = np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01 parameters[f'b{l}'] = np.zeros((layer_dims[l], 1)) return parameters def forward_propagation(X, parameters): caches = [] A = X L = len(parameters) // 2 for l in range(1, L): A_prev = A Z = np.dot(parameters[f'W{l}'], A_prev) + parameters[f'b{l}'] A = relu(Z) caches.append((A_prev, parameters[f'W{l}'], parameters[f'b{l}'], Z)) ZL = np.dot(parameters[f'W{L}'], A) + parameters[f'b{L}'] AL = sigmoid(ZL) caches.append((A, parameters[f'W{L}'], parameters[f'b{L}'], ZL)) return AL, caches def relu(Z): return np.maximum(0, Z) def sigmoid(Z): return 1 / (1 + np.exp(-Z))
3.2.2 反向传播实现
def backward_propagation(AL, Y, caches): grads = {} L = len(caches) m = AL.shape[1] Y = Y.reshape(AL.shape) dAL = - (np.divide(Y, AL) - np.divide(1 - Y, 1 - AL)) current_cache = caches[L-1] dZ = sigmoid_backward(dAL, current_cache[3]) grads[f'dW{L}'] = np.dot(dZ, current_cache[0].T) / m grads[f'db{L}'] = np.sum(dZ, axis=1, keepdims=True) / m dA_prev = np.dot(current_cache[1].T, dZ) for l in reversed(range(L-1)): current_cache = caches[l] dZ = relu_backward(dA_prev, current_cache[3]) grads[f'dW{l+1}'] = np.dot(dZ, current_cache[0].T) / m grads[f'db{l+1}'] = np.sum(dZ, axis=1, keepdims=True) / m dA_prev = np.dot(current_cache[1].T, dZ) return grads def relu_backward(dA, Z): dZ = np.array(dA, copy=True) dZ[Z <= 0] = 0 return dZ def sigmoid_backward(dA, Z): s = 1 / (1 + np.exp(-Z)) dZ = dA * s * (1 - s) return dZ

3.3 实践项目:手写数字识别

通过MNIST数据集实践神经网络的应用:

from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical # 加载数据 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 数据预处理 X_train = X_train.reshape(X_train.shape[0], -1).T / 255.0 X_test = X_test.reshape(X_test.shape[0], -1).T / 255.0 y_train = to_categorical(y_train).T y_test = to_categorical(y_test).T print(f"训练集形状: {X_train.shape}") print(f"测试集形状: {X_test.shape}")

4. 李飞飞计算机视觉课程

4.1 计算机视觉基础概念

李飞飞教授的CS231n课程是计算机视觉领域的经典课程,主要内容包括:

  • 图像分类:K最近邻、线性分类器、支持向量机
  • 神经网络基础:前向传播、反向传播、激活函数
  • 卷积神经网络:卷积层、池化层、全连接层
  • CNN架构:LeNet、AlexNet、VGG、GoogLeNet、ResNet
  • 目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO
  • 图像分割:语义分割、实例分割

4.2 卷积神经网络实现

4.2.1 简单的CNN实现
import torch import torch.nn as nn import torch.nn.functional as F class SimpleCNN(nn.Module): def __init__(self, num_classes=10): super(SimpleCNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.pool = nn.MaxPool2d(2, 2) self.fc1 = nn.Linear(64 * 7 * 7, 128) self.fc2 = nn.Linear(128, num_classes) self.dropout = nn.Dropout(0.5) def forward(self, x): x = self.pool(F.relu(self.conv1(x))) x = self.pool(F.relu(self.conv2(x))) x = x.view(-1, 64 * 7 * 7) x = F.relu(self.fc1(x)) x = self.dropout(x) x = self.fc2(x) return x # 模型实例化 model = SimpleCNN() print(model)
4.2.2 数据加载和训练
from torchvision import datasets, transforms from torch.utils.data import DataLoader # 数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 加载数据 train_dataset = datasets.MNIST('./data', train=True, download=True, transform=transform) test_dataset = datasets.MNIST('./data', train=False, transform=transform) train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False) # 训练函数 def train_model(model, train_loader, optimizer, criterion, epoch): model.train() running_loss = 0.0 for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() output = model(data) loss = criterion(output, target) loss.backward() optimizer.step() running_loss += loss.item() if batch_idx % 100 == 0: print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)}]' f' Loss: {loss.item():.6f}') return running_loss / len(train_loader)

4.3 迁移学习实践

使用预训练模型进行迁移学习:

import torchvision.models as models from torch.optim import Adam # 加载预训练模型 pretrained_model = models.resnet18(pretrained=True) # 修改最后一层 num_features = pretrained_model.fc.in_features pretrained_model.fc = nn.Linear(num_features, 10) # 假设有10个类别 # 只训练最后一层 for param in pretrained_model.parameters(): param.requires_grad = False for param in pretrained_model.fc.parameters(): param.requires_grad = True # 优化器只针对需要训练的参数 optimizer = Adam(pretrained_model.fc.parameters(), lr=0.001)

5. 李沐PyTorch入门到进阶

5.1 PyTorch基础语法

李沐的动手学深度学习课程是学习PyTorch的最佳资源,以下是核心内容:

5.1.1 张量操作基础
import torch # 创建张量 x = torch.tensor([1, 2, 3]) y = torch.tensor([4, 5, 6]) # 基本运算 z = x + y print("加法结果:", z) # 矩阵乘法 A = torch.randn(3, 4) B = torch.randn(4, 5) C = torch.mm(A, B) print("矩阵乘法结果形状:", C.shape) # 自动求导 x = torch.tensor([1.0], requires_grad=True) y = x ** 2 + 2 * x + 1 y.backward() print("x的梯度:", x.grad)
5.1.2 自动求导机制
# 更复杂的自动求导示例 x = torch.tensor([[1., 2.], [3., 4.]], requires_grad=True) y = torch.sum(x ** 2 + 3 * x + 1) y.backward() print("梯度矩阵:\n", x.grad) # 控制梯度计算 with torch.no_grad(): y = x * 2 print("无梯度计算:", y.requires_grad)

5.2 模型构建和训练

5.2.1 自定义神经网络
class CustomNet(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(CustomNet, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.fc2 = nn.Linear(hidden_size, hidden_size) self.fc3 = nn.Linear(hidden_size, output_size) self.dropout = nn.Dropout(0.3) self.batchnorm = nn.BatchNorm1d(hidden_size) def forward(self, x): x = F.relu(self.fc1(x)) x = self.batchnorm(x) x = self.dropout(x) x = F.relu(self.fc2(x)) x = self.dropout(x) x = self.fc3(x) return x # 模型实例化 model = CustomNet(784, 256, 10) print(f"模型参数数量: {sum(p.numel() for p in model.parameters())}")
5.2.2 完整的训练流程
def train_epoch(model, device, train_loader, optimizer, criterion): model.train() total_loss = 0 correct = 0 for data, target in train_loader: data, target = data.to(device), target.to(device) optimizer.zero_grad() # 前向传播 output = model(data) loss = criterion(output, target) # 反向传播 loss.backward() optimizer.step() total_loss += loss.item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() accuracy = 100. * correct / len(train_loader.dataset) avg_loss = total_loss / len(train_loader) return avg_loss, accuracy def test_model(model, device, test_loader, criterion): model.eval() test_loss = 0 correct = 0 with torch.no_grad(): for data, target in test_loader: data, target = data.to(device), target.to(device) output = model(data) test_loss += criterion(output, target).item() pred = output.argmax(dim=1, keepdim=True) correct += pred.eq(target.view_as(pred)).sum().item() test_loss /= len(test_loader) accuracy = 100. * correct / len(test_loader.dataset) print(f'测试集平均损失: {test_loss:.4f}, 准确率: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)') return test_loss, accuracy

5.3 高级特性:自定义数据集和DataLoader

from torch.utils.data import Dataset from PIL import Image import os class CustomDataset(Dataset): def __init__(self, data_dir, transform=None): self.data_dir = data_dir self.transform = transform self.images = [] self.labels = [] # 加载数据 for label, class_name in enumerate(os.listdir(data_dir)): class_dir = os.path.join(data_dir, class_name) for img_name in os.listdir(class_dir): self.images.append(os.path.join(class_dir, img_name)) self.labels.append(label) def __len__(self): return len(self.images) def __getitem__(self, idx): img_path = self.images[idx] image = Image.open(img_path).convert('RGB') label = self.labels[idx] if self.transform: image = self.transform(image) return image, label # 使用自定义数据集 transform = transforms.Compose([ transforms.Resize((224, 224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) custom_dataset = CustomDataset('./data/train', transform=transform) data_loader = DataLoader(custom_dataset, batch_size=32, shuffle=True)

6. 综合实战项目:图像分类系统

6.1 项目需求分析

我们将构建一个完整的图像分类系统,包含以下功能:

  • 数据加载和预处理
  • 模型训练和验证
  • 模型保存和加载
  • 预测接口

6.2 完整代码实现

import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms, models from torch.utils.data import DataLoader import matplotlib.pyplot as plt import numpy as np import time import os class ImageClassifier: def __init__(self, num_classes=10, model_name='resnet18'): self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.num_classes = num_classes self.model_name = model_name self.model = self._build_model() self.criterion = nn.CrossEntropyLoss() self.optimizer = optim.Adam(self.model.parameters(), lr=0.001) self.scheduler = optim.lr_scheduler.StepLR(self.optimizer, step_size=7, gamma=0.1) def _build_model(self): if self.model_name == 'resnet18': model = models.resnet18(pretrained=True) num_features = model.fc.in_features model.fc = nn.Linear(num_features, self.num_classes) elif self.model_name == 'simple_cnn': model = SimpleCNN(self.num_classes) else: raise ValueError("不支持的模型类型") return model.to(self.device) def prepare_data(self, data_dir, batch_size=32): # 数据预处理 train_transform = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) test_transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) # 加载数据 train_dataset = datasets.ImageFolder( os.path.join(data_dir, 'train'), transform=train_transform ) test_dataset = datasets.ImageFolder( os.path.join(data_dir, 'test'), transform=test_transform ) self.train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True) self.test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False) self.class_names = train_dataset.classes print(f"类别数量: {len(self.class_names)}") print(f"训练样本数: {len(train_dataset)}") print(f"测试样本数: {len(test_dataset)}") def train(self, epochs=25): since = time.time() train_loss_history = [] train_acc_history = [] val_loss_history = [] val_acc_history = [] best_acc = 0.0 for epoch in range(epochs): print(f'Epoch {epoch}/{epochs-1}') print('-' * 10) # 每个epoch都有训练和验证阶段 for phase in ['train', 'val']: if phase == 'train': self.model.train() dataloader = self.train_loader else: self.model.eval() dataloader = self.test_loader running_loss = 0.0 running_corrects = 0 # 迭代数据 for inputs, labels in dataloader: inputs = inputs.to(self.device) labels = labels.to(self.device) self.optimizer.zero_grad() # 前向传播 with torch.set_grad_enabled(phase == 'train'): outputs = self.model(inputs) _, preds = torch.max(outputs, 1) loss = self.criterion(outputs, labels) # 反向传播+优化仅在训练阶段进行 if phase == 'train': loss.backward() self.optimizer.step() # 统计 running_loss += loss.item() * inputs.size(0) running_corrects += torch.sum(preds == labels.data) if phase == 'train': self.scheduler.step() epoch_loss = running_loss / len(dataloader.dataset) epoch_acc = running_corrects.double() / len(dataloader.dataset) print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}') # 记录历史数据 if phase == 'train': train_loss_history.append(epoch_loss) train_acc_history.append(epoch_acc.item()) else: val_loss_history.append(epoch_loss) val_acc_history.append(epoch_acc.item()) # 深度复制模型 if phase == 'val' and epoch_acc > best_acc: best_acc = epoch_acc torch.save(self.model.state_dict(), 'best_model.pth') print() time_elapsed = time.time() - since print(f'训练完成于 {time_elapsed // 60:.0f}m {time_elapsed % 60:.0f}s') print(f'最佳验证准确率: {best_acc:.4f}') # 加载最佳模型权重 self.model.load_state_dict(torch.load('best_model.pth')) return train_loss_history, train_acc_history, val_loss_history, val_acc_history def predict(self, image): self.model.eval() with torch.no_grad(): image = image.to(self.device) outputs = self.model(image) _, preds = torch.max(outputs, 1) probabilities = torch.nn.functional.softmax(outputs, dim=1) return preds, probabilities # 使用示例 if __name__ == "__main__": # 初始化分类器 classifier = ImageClassifier(num_classes=10, model_name='resnet18') # 准备数据(假设数据目录结构正确) # classifier.prepare_data('./data') # 训练模型 # history = classifier.train(epochs=25) print("图像分类系统初始化完成")

6.3 模型部署和优化

# 模型优化和量化 def optimize_model(model_path, output_path): # 加载训练好的模型 model = torch.load(model_path) model.eval() # 模型量化 quantized_model = torch.quantization.quantize_dynamic( model, {nn.Linear, nn.Conv2d}, dtype=torch.qint8 ) # 保存优化后的模型 torch.save(quantized_model.state_dict(), output_path) print(f"优化后的模型已保存到: {output_path}") # 计算模型大小 original_size = os.path.getsize(model_path) / 1024 / 1024 optimized_size = os.path.getsize(output_path) / 1024 / 1024 print(f"原始模型大小: {original_size:.2f}MB") print(f"优化后模型大小: {optimized_size:.2f}MB") print(f"压缩比例: {original_size/optimized_size:.2f}x") # 模型部署类 class ModelDeployment: def __init__(self, model_path, class_names): self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") self.model = self._load_model(model_path) self.class_names = class_names self.transform = self._get_transform() def _load_model(self, model_path): model = models.resnet18(pretrained=False) num_features = model.fc.in_features model.fc = nn.Linear(num_features, len(self.class_names)) model.load_state_dict(torch.load(model_path, map_location=self.device)) model.eval() return model.to(self.device) def _get_transform(self): return transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) def predict_image(self, image_path): image = Image.open(image_path).convert('RGB') input_tensor = self.transform(image).unsqueeze(0).to(self.device) with torch.no_grad(): output = self.model(input_tensor) probabilities = torch.nn.functional.softmax(output[0], dim=0) # 获取top-k预测结果 top3_prob, top3_catid = torch.topk(probabilities, 3) results = [] for i in range(top3_prob.size(0)): results.append({ 'class': self.class_names[top3_catid[i]], 'probability': top3_prob[i].item() }) return results

7. 学习资源获取和自学方法

7.1 课程资源链接

  • 李宏毅机器学习:B站搜索"李宏毅机器学习"有完整中文版
  • 吴恩达深度学习:Coursera平台"Deep Learning Specialization"
  • 李飞飞计算机视觉:斯坦福CS231n课程官网或B站中文翻译版
  • 李沐PyTorch:"动手学深度学习"官网或B站课程

7.2 高效自学策略

  1. 理论实践结合:看完理论立即动手写代码
  2. 项目驱动学习:每个阶段完成一个小项目
  3. 社区参与:加入相关技术社区,参与讨论
  4. 持续练习:每天保持编码习惯

7.3 常见学习障碍及解决方法

  • 数学基础不足:先掌握必要的高等数学和线性代数基础
  • 编程经验缺乏:从Python基础开始学习
  • 调试困难:学会使用调试工具和打印中间结果
  • 概念理解困难:多看不同老师的讲解,寻找适合自己的理解方式

通过系统学习这四门课程,配合实际的编码练习,完全可以在3-6个月内掌握人工智能的基础知识和实践技能。关键在于坚持实践和不断总结,遇到问题时善于利用社区资源和官方文档。