AI入门指南:李宏毅吴恩达李飞飞李沐四门课程学习路线
很多刚接触AI的同学会觉得这个领域门槛很高需要深厚的数学基础和编程能力才能入门。但实际上通过系统学习几位顶尖专家的课程完全可以在短时间内掌握人工智能的核心概念和实践技能。本文将围绕李宏毅的机器学习、吴恩达的深度学习、李飞飞的计算机视觉以及李沐的PyTorch实战这四门经典课程为你提供一条清晰的AI入门路径。1. 人工智能学习路线概述1.1 为什么选择这四位专家的课程这四位专家在AI领域都有着深厚的学术背景和丰富的教学经验他们的课程各有侧重形成了一个完整的学习体系李宏毅机器学习以生动有趣的方式讲解机器学习基础概念适合零基础入门吴恩达深度学习系统性地介绍神经网络和深度学习原理建立完整的知识框架李飞飞计算机视觉专注于图像识别和处理是CV领域的权威课程李沐PyTorch实战通过实际代码演示教会你如何用PyTorch实现AI模型1.2 学习路径规划建议对于零基础的学习者建议按照以下顺序进行学习先学习李宏毅的机器学习课程建立基本概念接着学习吴恩达的深度学习专项课程然后学习李飞飞的计算机视觉课程最后通过李沐的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个部分系统性地介绍了深度学习的各个方面神经网络和深度学习基础概念和实现改善深层神经网络超参数调试、正则化、优化算法结构化机器学习项目机器学习策略和项目管理卷积神经网络图像处理专用网络结构序列模型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[fW{l}] np.random.randn(layer_dims[l], layer_dims[l-1]) * 0.01 parameters[fb{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[fW{l}], A_prev) parameters[fb{l}] A relu(Z) caches.append((A_prev, parameters[fW{l}], parameters[fb{l}], Z)) ZL np.dot(parameters[fW{L}], A) parameters[fb{L}] AL sigmoid(ZL) caches.append((A, parameters[fW{L}], parameters[fb{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[fdW{L}] np.dot(dZ, current_cache[0].T) / m grads[fdb{L}] np.sum(dZ, axis1, keepdimsTrue) / 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[fdW{l1}] np.dot(dZ, current_cache[0].T) / m grads[fdb{l1}] np.sum(dZ, axis1, keepdimsTrue) / m dA_prev np.dot(current_cache[1].T, dZ) return grads def relu_backward(dA, Z): dZ np.array(dA, copyTrue) dZ[Z 0] 0 return dZ def sigmoid_backward(dA, Z): s 1 / (1 np.exp(-Z)) dZ dA * s * (1 - s) return dZ3.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_classes10): super(SimpleCNN, self).__init__() self.conv1 nn.Conv2d(1, 32, kernel_size3, padding1) self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) 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, trainTrue, downloadTrue, transformtransform) test_dataset datasets.MNIST(./data, trainFalse, transformtransform) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size64, shuffleFalse) # 训练函数 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(fTrain 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(pretrainedTrue) # 修改最后一层 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(), lr0.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_gradTrue) y x ** 2 2 * x 1 y.backward() print(x的梯度:, x.grad)5.1.2 自动求导机制# 更复杂的自动求导示例 x torch.tensor([[1., 2.], [3., 4.]], requires_gradTrue) 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(dim1, keepdimTrue) 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(dim1, keepdimTrue) 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, accuracy5.3 高级特性自定义数据集和DataLoaderfrom torch.utils.data import Dataset from PIL import Image import os class CustomDataset(Dataset): def __init__(self, data_dir, transformNone): 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, transformtransform) data_loader DataLoader(custom_dataset, batch_size32, shuffleTrue)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_classes10, model_nameresnet18): 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(), lr0.001) self.scheduler optim.lr_scheduler.StepLR(self.optimizer, step_size7, gamma0.1) def _build_model(self): if self.model_name resnet18: model models.resnet18(pretrainedTrue) 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_size32): # 数据预处理 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), transformtrain_transform ) test_dataset datasets.ImageFolder( os.path.join(data_dir, test), transformtest_transform ) self.train_loader DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue) self.test_loader DataLoader(test_dataset, batch_sizebatch_size, shuffleFalse) 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, epochs25): 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(fEpoch {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, dim1) return preds, probabilities # 使用示例 if __name__ __main__: # 初始化分类器 classifier ImageClassifier(num_classes10, model_nameresnet18) # 准备数据假设数据目录结构正确 # classifier.prepare_data(./data) # 训练模型 # history classifier.train(epochs25) 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}, dtypetorch.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(pretrainedFalse) 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_locationself.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], dim0) # 获取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 results7. 学习资源获取和自学方法7.1 课程资源链接李宏毅机器学习B站搜索李宏毅机器学习有完整中文版吴恩达深度学习Coursera平台Deep Learning Specialization李飞飞计算机视觉斯坦福CS231n课程官网或B站中文翻译版李沐PyTorch动手学深度学习官网或B站课程7.2 高效自学策略理论实践结合看完理论立即动手写代码项目驱动学习每个阶段完成一个小项目社区参与加入相关技术社区参与讨论持续练习每天保持编码习惯7.3 常见学习障碍及解决方法数学基础不足先掌握必要的高等数学和线性代数基础编程经验缺乏从Python基础开始学习调试困难学会使用调试工具和打印中间结果概念理解困难多看不同老师的讲解寻找适合自己的理解方式通过系统学习这四门课程配合实际的编码练习完全可以在3-6个月内掌握人工智能的基础知识和实践技能。关键在于坚持实践和不断总结遇到问题时善于利用社区资源和官方文档。