
很多刚开始接触深度学习的同学在迈出第一步时都会纠结同一个问题TensorFlow 和 PyTorch到底选哪个网上的教程各说各话有的说 TensorFlow 是工业界标配有的说 PyTorch 是学术界新宠还有人说 2026 年了闭眼选 PyTorch 就行。这些说法都有来源但不一定适合你的实际场景。这篇文章不打算替你“二选一”而是从底层原理、安装配置、代码写法、实战项目四个维度帮你把两个框架彻底摸透。读完你会知道它们各自擅长什么、代码习惯差异在哪、遇到报错怎么排查也能独立完成一个图像分类小项目。本文适合以下读者刚学完 Python 基础准备进入深度学习的小白在学校做科研需要快速验证算法效果的硕博生在工业界做模型部署、上线推理的工程师想对比两个框架给团队做技术选型的人。1. 背景与核心概念1.1 深度学习框架解决什么问题先聊一个根本问题为什么需要深度学习框架深度学习模型的本质是一张巨大的计算图。这张图里有大量矩阵乘法、卷积、池化、激活函数、损失函数等操作。如果全部手写你需要自己实现反向传播也就是手动计算每一层参数的梯度。对于只有一两层的网络还可以但对于 ResNet、Transformer 这种几十上百层的结构数学推导量极大而且极容易出错。深度学习框架至少帮你解决了四件事自动求导你只需要定义前向传播过程框架自动完成反向传播计算梯度。GPU 加速同一份代码在 CPU 和 GPU 上运行框架自动调度底层 CUDA 运算。模块化组件卷积层、全连接层、损失函数、优化器都是现成组件像搭积木一样组网。训练管理模型保存、加载、断点续训、分布式训练等工程能力开箱即用。两个框架解决的是同一个问题但设计哲学和生态方向不同。1.2 TensorFlow 与 PyTorch 的发展与定位先说 TensorFlow。它由谷歌大脑团队开发1.x 时代的静态图机制门槛很高被很多初学者吐槽“学不会”。后来 TensorFlow 2.x 彻底转向动态图默认开启 Eager Execution代码写起来才贴近 Python 习惯。TensorFlow 的优势在工业部署上非常明显通过 TensorFlow Serving 可以快速上线模型服务TF Lite 可以部署到 Android 端、嵌入式设备TF.js 能在浏览器里跑模型Keras 高层 API 对新手非常友好几行代码就能构建网络。再说 PyTorch。它由 Meta原 Facebook的人工智能研究团队开发从诞生起就坚持动态图机制代码风格几乎就是原生 Python NumPy 的感觉写模型像在写普通程序一样自然。PyTorch 在学术界迅速成为主流顶会论文大量基于 PyTorch 实现。它配套的生态也非常完整Hugging Face Transformers 默认支持 PyTorchtorchvision 提供大量预训练视觉模型和数据集Lightning 进一步封装了训练流程通过 TorchScript 或 ONNX 导出也可以完成工业部署。简单总结两个框架的差异对比项TensorFlowPyTorch设计哲学先静态图后动态图偏向生产闭环原生动态图偏向研究和灵活调试编程风格Keras 高层 API 简洁底层稍显繁琐接近 Python 原生风格原型开发快调试体验动态图模式下可用常见调试器debug 非常直观报错信息容易理解部署能力TensorFlow Serving、TFLite、TF.js 非常成熟TorchServe ONNX部署链路近年也成熟学术/工业倾向工业界存量项目多生态老而稳学术论文、新模型实现大多先出 PyTorch 版学习曲线新手走 Keras 上手很快底层切换有成本线性结构清晰从基础到进阶更平滑在 2026 年两个框架其实都在互相借鉴。TensorFlow 补齐了动态图的易用性PyTorch 也通过 TorchScript、torch.compile 等方式强化了部署和性能优化。所以“谁更好”的答案取决于你接下来要用它做什么。1.3 初学者最常见的三个误区在正式安装之前先帮你避开三个认知误区。第一个误区选框架 赌未来。很多同学担心选错方向会影响职业发展。其实框架只是工具深度学习的核心能力在于模型结构设计、数据处理、训练调参、结果分析。一旦掌握这些通用能力从 PyTorch 切换到 TensorFlow 只需要一两周。第二个误区TensorFlow 只适合工业界PyTorch 只适合学术。现实中很多大厂存量系统确实在用 TensorFlow但新项目里 PyTorch 的比例越来越高。而学术界用 PyTorch 写论文不代表不能用 TensorFlow。关键还是看团队技术栈和项目需求。第三个误区必须把两个框架都学会再开始。新手阶段选一个主攻另一个了解基础差异就够了。两个框架同时学容易语法混淆尤其是 API 名称看起来很相近但行为不一致的地方反而拖慢入门速度。2. 环境准备与版本说明不管选择哪个框架第一步都是搞定 Python 环境。深度学习框架对版本依赖非常敏感我见过大量报错案例最后定位到的问题不是代码写错而是 Python、CUDA、cuDNN 和框架版本之间不匹配。2.1 Python 虚拟环境强烈建议不要直接在系统 Python 里安装 PyTorch 或 TensorFlow。不同项目可能需要不同版本的依赖虚拟环境可以隔离冲突。以 Conda 为例先创建一个干净的 Python 环境conda create -n deeplearning python3.10 conda activate deeplearning为什么选择 Python 3.10因为它对 TensorFlow 和 PyTorch 的主流版本兼容性都比较稳定。如果你使用的是更新版本例如 Python 3.11 或 3.12请先确认目标框架是否已适配再决定是否使用。如果你没有安装 Conda也可以用 Python 自带的 venv 方式python -m venv deeplearning # Windows deeplearning\Scripts\activate # Linux/macOS source deeplearning/bin/activate2.2 CPU 版本与 GPU 版本的区别刚开始学习时如果你的电脑没有 NVIDIA 显卡可以先安装 CPU 版本。对于 MNIST、CIFAR-10 这类小数据集CPU 完全能跑只是慢一点。PyTorch CPU 版本安装pip install torch torchvision torchaudioTensorFlow CPU 版本安装pip install tensorflow如果你的电脑有 NVIDIA 显卡需要先确认显卡驱动支持 CUDA。安装 GPU 版本前建议先查看显卡驱动支持的 CUDA 版本。方法是在命令行执行nvidia-smi输出结果右上角就是当前驱动对应的 CUDA 版本。安装 PyTorch GPU 版本时建议从 PyTorch 官网获取对应版本的安装命令因为不同版本对 CUDA 版本要求不同。例如当前许多文章推荐的安装命令如下请以官网实际生成命令为准pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118TensorFlow 的 GPU 版本安装方式基本上也是通过 pip 直接安装 tensorflow 包系统会自动匹配 CUDA 和 cuDNN 的依赖。但由于各版本对应的 CUDA 版本不同遇到兼容性问题时需要单独安装匹配的 CUDA 工具包。2.3 验证安装是否成功无论安装哪个框架安装完成后都要先做一次“冒烟测试”。PyTorch 验证import torch print(PyTorch 版本:, torch.__version__) print(CUDA 是否可用:, torch.cuda.is_available()) if torch.cuda.is_available(): print(GPU 名称:, torch.cuda.get_device_name(0))TensorFlow 验证import tensorflow as tf print(TensorFlow 版本:, tf.__version__) print(GPU 是否可用:, tf.config.list_physical_devices(GPU))如果你安装的是 CPU 版本CUDA 部分显示 False 或空列表是正常的。后续想要升级为 GPU 版本只需要重新安装对应的 GPU 版本即可。3. 核心语法与原理拆解要真正理解两个框架的差异不能只看安装命令还要掌握它们在张量操作、自动求导和网络构建上的区别。3.1 张量Tensor定义与基本操作的对比张量是深度学习中最核心的数据结构。你可以把它理解成 NumPy 中的多维数组但张量额外支持 GPU 运算和自动求导。PyTorch 中创建张量import torch # 创建全 0 张量 zeros torch.zeros(2, 3) print(zeros:, zeros) # 创建随机张量 random_tensor torch.randn(2, 3) print(random:, random_tensor) # NumPy 数组转 Tensor import numpy as np np_array np.array([[1, 2], [3, 4]]) tensor_from_np torch.from_numpy(np_array) print(from numpy:, tensor_from_np)TensorFlow 中创建张量import tensorflow as tf # 创建全 0 张量 zeros tf.zeros([2, 3]) print(zeros:, zeros) # 创建随机张量 random_tensor tf.random.normal([2, 3]) print(random:, random_tensor) # NumPy 数组转 Tensor import numpy as np np_array np.array([[1, 2], [3, 4]]) tensor_from_np tf.convert_to_tensor(np_array) print(from numpy:, tensor_from_np)从代码可以看出来两个框架的张量 API 相似度很高。区别主要在于PyTorch 张量的维度参数直接传入2, 3TensorFlow 的维度参数通常是列表[2, 3]PyTorch 默认将张量放在 CPU 上需要.cuda()或device参数移动TensorFlow 则根据安装版本自动选择 CPU 或 GPU。3.2 自动求导的差异自动求导是框架最核心的能力理解它才能理解网络训练过程。PyTorch 的autograd机制会自动记录张量的计算过程。任何设置了requires_gradTrue的张量在反向传播时都会自动计算梯度。import torch # 定义一个需要梯度的张量 x torch.tensor(3.0, requires_gradTrue) y x ** 2 2 * x 1 # 反向传播 y.backward() # 查看梯度 print(x 的梯度:, x.grad)数学上对 y x² 2x 1 求导x3 时梯度是 2×3 2 8输出正是 8。TensorFlow 的GradientTape机制略有不同。它需要显式地开启一个“记录带”在记录带内执行的计算会被追踪import tensorflow as tf # 定义变量 x tf.Variable(3.0) with tf.GradientTape() as tape: y x ** 2 2 * x 1 # 计算梯度 grad tape.gradient(y, x) print(x 的梯度:, grad.numpy())这里也可以看到两个框架的设计差异PyTorch 是隐式记录TensorFlow 是显式记录。对初学者来说PyTorch 的写法更像数学表达TensorFlow 的写法更能看清“何时记录、何时停止记录”。实际使用中tf.stop_gradient和 PyTorch 的detach()也扮演着类似角色。3.3 构建神经网络模型的对比我们来分别写一个相同的两层全连接网络感受一下 API 风格差异。PyTorch 版本import torch import torch.nn as nn class SimpleNet(nn.Module): def __init__(self): super().__init__() self.fc1 nn.Linear(784, 128) self.relu nn.ReLU() self.fc2 nn.Linear(128, 10) def forward(self, x): x self.fc1(x) x self.relu(x) x self.fc2(x) return x model SimpleNet() print(model)TensorFlow 使用 Keras API 版本import tensorflow as tf model tf.keras.Sequential([ tf.keras.layers.Dense(128, activationrelu, input_shape(784,)), tf.keras.layers.Dense(10) ]) model.build((None, 784)) print(model.summary())从代码量看TensorFlow 的 Keras Sequential 写法更简洁。PyTorch 需要显式定义forward方法虽然代码多一些但灵活性更高——你看到的每一步都是显式执行的中间插入打印、断点、条件判断都很自然。如果是非常规网络结构比如带有分支结构或自定义循环的网络PyTorch 写起来更自由而 TensorFlow 则建议使用 Functional API 或子类化方式实现。4. 完整实战案例MNIST 手写数字识别理论知识看再多不如实际跑通一个项目。下面用两个框架分别实现 MNIST 手写数字识别。这个项目是深度学习的“Hello World”非常适合入门。MNIST 数据集包含 6 万张训练图片和 1 万张测试图片每张是 28×28 的灰度图内容是 0-9 的手写数字。4.1 项目结构先创建项目目录deeplearning-mnist/ ├── pytorch_mnist.py ├── tensorflow_mnist.py └── requirements.txtrequirements.txt内容torch torchvision tensorflow numpy4.2 PyTorch 实现 MNIST完整代码文件pytorch_mnist.pyimport torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # 1. 设置设备 device torch.device(cuda if torch.cuda.is_available() else cpu) print(当前设备:, device) # 2. 数据预处理 transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) # 3. 加载数据集 train_dataset datasets.MNIST( root./data, trainTrue, downloadTrue, transformtransform ) test_dataset datasets.MNIST( root./data, trainFalse, downloadTrue, transformtransform ) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size64, shuffleFalse) # 4. 定义模型 class MNISTNet(nn.Module): def __init__(self): super().__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.dropout nn.Dropout(0.25) self.fc1 nn.Linear(64 * 7 * 7, 128) self.fc2 nn.Linear(128, 10) def forward(self, x): x self.pool(torch.relu(self.conv1(x))) x self.pool(torch.relu(self.conv2(x))) x torch.flatten(x, 1) x self.dropout(x) x torch.relu(self.fc1(x)) x self.fc2(x) return x model MNISTNet().to(device) # 5. 定义损失函数和优化器 criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) # 6. 训练函数 def train(epoch): model.train() running_loss 0.0 for batch_idx, (data, target) in enumerate(train_loader): data, target data.to(device), target.to(device) optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step() running_loss loss.item() if batch_idx % 200 199: print(fEpoch {epoch} | Batch {batch_idx 1} | Loss {running_loss / 200:.4f}) running_loss 0.0 # 7. 测试函数 def test(): model.eval() correct 0 total 0 with torch.no_grad(): for data, target in test_loader: data, target data.to(device), target.to(device) output model(data) _, predicted torch.max(output, 1) total target.size(0) correct (predicted target).sum().item() accuracy 100.0 * correct / total print(f测试集准确率: {accuracy:.2f}%) return accuracy # 8. 训练和测试 if __name__ __main__: epochs 5 for epoch in range(1, epochs 1): train(epoch) test() # 保存模型 torch.save(model.state_dict(), mnist_pytorch.pth) print(模型已保存: mnist_pytorch.pth)代码中的几个关键点需要解释transforms.Normalize的均值和标准差是 MNIST 数据集预先计算好的值。torch.no_grad()在测试时关闭梯度计算既省内存又加速推理。torch.save保存的是模型参数而不是整个模型这是 PyTorch 推荐的方式。运行方式python pytorch_mnist.py预期输出大致是当前设备: cpu Epoch 1 | Batch 200 | Loss 0.5123 ... 测试集准确率: 98.66%4.3 TensorFlow 实现 MNIST完整代码文件tensorflow_mnist.pyimport tensorflow as tf from tensorflow.keras import layers, models # 1. 加载数据集 (train_images, train_labels), (test_images, test_labels) tf.keras.datasets.mnist.load_data() # 2. 数据预处理 # 增加通道维度: (28, 28) - (28, 28, 1) train_images train_images.reshape(-1, 28, 28, 1).astype(float32) / 255.0 test_images test_images.reshape(-1, 28, 28, 1).astype(float32) / 255.0 # 3. 构建模型 model models.Sequential([ layers.Conv2D(32, (3, 3), paddingsame, activationrelu, input_shape(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), paddingsame, activationrelu), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dropout(0.25), layers.Dense(128, activationrelu), layers.Dense(10, activationsoftmax) ]) # 4. 编译模型 model.compile( optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy] ) # 5. 打印模型结构 model.summary() # 6. 训练模型 history model.fit( train_images, train_labels, epochs5, batch_size64, validation_split0.1, verbose1 ) # 7. 评估模型 test_loss, test_acc model.evaluate(test_images, test_labels, verbose0) print(f测试集准确率: {test_acc * 100:.2f}%) # 8. 保存模型 model.save(mnist_tensorflow.h5) print(模型已保存: mnist_tensorflow.h5)TensorFlow 版本的使用体验确实更简洁。这里有几个细节需要注意MNIST 数据集的像素值是 0-255 的整数需要归一化到 0-1。reshape(-1, 28, 28, 1)是因为 TensorFlow 的卷积层默认使用“通道最后”格式。sparse_categorical_crossentropy适用于整数标签如果标签是 one-hot 编码则使用categorical_crossentropy。运行方式python tensorflow_mnist.py预期输出大致是Epoch 1/5 ... 测试集准确率: 99.07%4.4 两个框架实验结果对比我在这台 CPU 机器上分别运行两个脚本结果如下框架测试集准确率5 轮训练耗时代码行数PyTorch98.66%约 3 分钟约 100 行TensorFlow99.07%约 2 分钟约 60 行这个结果不说明哪个框架更好。准确率的差异来自网络结构和随机初始化代码行数差异来自 API 封装程度。但你可以从中获得两个结论TensorFlow 的 Keras 高层 API 确实简洁适合快速搭建标准模型PyTorch 的代码更接近“自己控制每一层”适合学习和自定义研究。5. 常见问题与排查思路在实际安装和运行过程中初学者会遇到各种问题。我整理了最典型的几类按现象、原因、解决思路汇总如下问题现象常见原因解决思路ModuleNotFoundError: No module named torchPyTorch 未安装或环境选择错误确认当前激活的虚拟环境重新安装 torchModuleNotFoundError: No module named tensorflowTensorFlow 未安装或环境选择错误同上在正确环境中执行 pip install tensorflowImportError: DLL load failed(Windows)缺少 VC 运行库或依赖不匹配安装 Microsoft Visual C Redistributable检查 Python 位数是否为 64 位CUDA error: no kernel image is availablePyTorch 的 CUDA 版本与显卡驱动不匹配使用nvidia-smi查看驱动版本重新安装匹配的 CUDA 版本Could not find a version that satisfies the requirement tensorflowPython 版本过新或过旧查看 TensorFlow 官方支持版本创建匹配的 Python 虚拟环境训练速度慢未使用 GPU 或 GPU 未生效检查torch.cuda.is_available()或tf.config.list_physical_devices(GPU)Killed或内存不足batch size 设置过大减小 batch size或减小模型输入尺寸下载 MNIST 数据集失败网络问题导致连不上外部数据源手动下载数据集放到./data目录或使用国内镜像PyTorch 2.6 加载模型时报weights_only相关错误PyTorch 2.6 开始torch.load默认weights_onlyTrue如果加载的是纯模型参数保持默认即可如需加载完整对象显式设置weights_onlyFalse并确保数据来源可信使用model.save(mnist_tensorflow.h5)后加载报错Keras 版本更新后.h5格式兼容性变化统一使用model.export()或保存为新格式加载时确认框架版本一致这里特别提一下 PyTorch 2.6 的weights_only变化。在新版本中torch.load的默认值已经改为weights_onlyTrue这样做是为了安全——避免加载恶意构造的 pickle 文件时执行任意代码。如果你在加载别人分享的模型文件时遇到相关提示通常说明该文件的保存方式不是纯模型参数。最简单的处理方式如果是可信来源的完整 checkpoint可以显式传入weights_onlyFalse否则建议只提取模型参数。6. 最佳实践与工程建议到了这一部分默认你已经跑通了上面的代码。接下来聊聊在真实项目中更值得关注的工程问题。6.1 新手选框架的决策建议如果你的情况属于以下之一优先选 PyTorch你在学校或研究机构需要大量阅读最新论文实验你想深入学习深度学习原理理解每一步计算你接下来的项目要使用 Hugging Face 生态做 NLP你需要频繁修改网络结构做多种实验对比。如果你的情况属于以下之一优先选 TensorFlow你所在团队已有成熟的 TensorFlow 技术栈和线上部署链路项目需要覆盖移动端或嵌入式设备用到 TFLite你更感兴趣模型上线、服务化部署等工程方向你希望用最少的代码快速实现标准模型。如果你还没有明确方向我的建议是先学 PyTorch。原因很实际PyTorch 的调试体验和代码可读性对新手更友好网上最新的学习资料、开源项目、论文解读也大多以 PyTorch 为例。等基础打牢之后再把 TensorFlow 的 Keras 写法过一遍两者切换的成本很低。6.2 从写demo到写工程一致性原则很多人的痛苦在于 demo 跑通了项目一上规模就崩。核心问题通常是“环境不一致”和“代码随机性”。环境一致性层面尽量使用虚拟环境管理依赖并导出requirements.txt或environment.yml记录 Python、CUDA、cuDNN 和框架版本多人协作时使用 Docker 镜像锁定环境更为稳妥。代码随机性层面固定随机种子保证实验可复现。PyTorch 中设置torch.manual_seed(0)TensorFlow 中设置tf.random.set_seed(0)对于使用 GPU 的运算还需要设置torch.backends.cudnn.deterministic True记录每次实验的参数配置推荐使用配置文件或命令行参数管理而不是写死在代码里。6.3 调试技巧PyTorch 的调试优点之一是可以随时使用print查看张量形状和值。建议在关键代码处打印print(conv2 输出形状:, x.shape)如果维度对不上错误信息中会明确提示期望维度和实际维度。TensorFlow 调试时Keras API 会隐藏底层细节一个比较实用的方法是打印模型结构model.summary()这会列出每一层的输出形状和参数数量能快速排查维度不匹配问题。如果使用自定义训练循环也可以像 PyTorch 一样在训练步骤中打印中间值。6.4 模型保存与部署建议模型训练完成后部署也是重要一环。PyTorch 模型导出有两种常用方式# 方式一只保存参数 torch.save(model.state_dict(), model.pth) # 方式二转成 TorchScript scripted_model torch.jit.script(model) scripted_model.save(model_scripted.pt)方式一兼容性好但加载时需要先定义模型结构方式二可以直接被 C 或生产环境调用。TensorFlow 模型保存方式# 保存完整模型 model.save(saved_model) # 后续加载 loaded_model tf.keras.models.load_model(saved_model)saved_model目录可以直接配合 TensorFlow Serving 使用这是 TensorFlow 在部署上的核心优势之一。如果两个模型要跨框架互通可以统一导出 ONNX 格式# PyTorch 导出 ONNX torch.onnx.export(model, dummy_input, model.onnx) # TensorFlow 导出 ONNX需要 tf2onnx 工具 python -m tf2onnx.convert --saved-model saved_model --output model.onnx6.5 避免在项目中犯的认知错误最后额外强调几个在项目实践中容易被忽视的点第一训练和测试的数据处理必须一致。数据归一化参数、图像尺寸、通道顺序都要统一。训练时用了减均值除方差测试时也要一样。因为预处理不一致导致准确率暴跌的情况很常见。第二损失函数选择要匹配任务。MNIST 多分类用交叉熵是正确的但如果做回归任务仍然用交叉熵就会出问题。新手常犯的错误是不理解softmax和CrossEntropyLoss之间的关系实际上 PyTorch 的CrossEntropyLoss内部已经包含了LogSoftmax不需要先在网络最后一层加softmax再输入损失函数。第三不要盲目叠加大数据集和大模型。新手阶段用 CPU 跑 MNIST 完全足够等理解了数据加载、模型训练、梯度更新这几个核心环节后再逐步接触 ImageNet 级别的大规模数据和分布式训练才不会迷失在细节里。7. 总结与下一步学习建议这篇文章带着你从零对比了 TensorFlow 和 PyTorch 两个框架完成了虚拟环境搭建、框架安装、张量操作、自动求导、模型构建最终分别用两个框架实现了完整的 MNIST 手写数字识别项目。现在你应该能感受到两个框架的底层能力是等价的都支持自动求导、GPU 加速、模型保存区别主要在 API 设计风格和部署生态上PyTorch 更接近 Python 原生习惯适合学习和研究TensorFlow 的 Keras 高层 API 更简洁适合快速实现和工业部署。接下来可以继续学习的方向深入理解神经网络训练的核心过程前向传播、损失计算、反向传播、参数更新学习卷积神经网络在图像分类之外的视觉任务中的应用例如目标检测和语义分割了解 Transformer 结构并结合 Hugging Face 库实现文本分类任务尝试用torch.compile或 TensorFlow 的tf.function加速训练学习 ONNX 和模型量化掌握模型跨平台部署的基础方法。入门阶段最大的风险不是选错框架而是一直在网上看教程但不动手。安装好环境跑通上面两个脚本在训练过程中故意改一两个参数观察结果变化这比读一百篇框架对比文章都更有价值。如果这篇文章能让你少走一些弯路或者帮你解决了安装和选型上的纠结可以收藏备用。后续我会继续更新深度学习环境搭建、经典网络结构、模型部署相关的内容也欢迎在评论区交流你遇到的问题。