尧图精选

TensorFlow 2.x 实战指南:从环境配置到图像分类模型全流程

🕒 发布时间:2026/10/1 6:19:59 📁 来源:尧图网络
TensorFlow这个名字在深度学习圈子里晃了快十年了到现在还是绕不开。我不管是在公司带项目还是私下帮朋友看代码遇到新手问的第一个框架基本就是它。2024年再看TensorFlow 2.x 已经非常成熟了跟 PyTorch 的竞争也进入了稳定格局。很多人纠结到底学哪个其实不如先搞清楚 TensorFlow 到底能干什么、怎么把它用顺手。这篇内容我会从实际干活的角度出发把它们从安装开始到核心概念再到一个能跑的图像分类项目完整过一遍。过程中也会把我踩过的坑、走过弯路的地方原原本本分享出来。不管你是刚入门想找个方向还是已经在用其他框架想了解 TensorFlow这篇文章都应该能给你一些实实在在的参考。1. 为什么 2024 年还在聊 TensorFlow它到底解决了什么问题很多人一上来就问“TensorFlow 和 PyTorch 哪个好”说实话这个问题已经问了三年了但答案一直没变各有各的战场。我需要先说清楚 TensorFlow 这几年经历了什么因为你不了解它的演变就很容易被网上那些过时的教程带偏导致第一步就装错版本、跑不起来。1.1 从静态图到动态图TensorFlow 2.x 最大的改变2015 年 TensorFlow 刚出来的时候用的是静态图模式。所谓静态图就是你先定义好整个计算的“图纸”再丢进去数据执行。这种做法在生产部署上有优势因为图结构确定容易优化和跨平台运行。但对研究者和刚入门的人来说简直是灾难。你想打印中间结果不行。你想用 Python 的 if 语句根据不同情况走不同分支很麻烦。调试体验差到了极点每一步都像隔着玻璃看操作。TensorFlow 2.0 在 2019 年把默认模式彻底换成了动态图也就是 Eager Execution跟 PyTorch 的哲学对齐了。现在你写tf.matmul(a, b)它会立刻执行并返回结果跟写普通 Python 没有任何区别。这一步转型让 TensorFlow 的学习曲线一下子降了下来。我可以负责任地说现在学 TensorFlow 2.x比学 TensorFlow 1.x 的难度低了一个量级。但要注意TensorFlow 仍然保留了静态图的能力只是换了一种更优雅的姿势。你可以用tf.function把一段 Python 函数编译成静态图获得更好的性能。这就相当于给了你两把武器平时调试用动态图上线加速用静态图。我在实际项目中通常是先用动态图把算法跑通再给关键路径加上tf.function装饰器做性能优化这个后面会有代码示例。1.2 Keras 成为官方高级接口不用再从底层造轮子TensorFlow 2.x 另一个大动作是把 Keras 正式吸收进来并作为官方高级 API。在 1.x 时代你要写一个全连接网络得自己定义 Variable、初始化器、优化器、session然后一步步执行。现在用 Keras 的Sequential模型十来行代码就可以堆出一个能跑的神经网络模型编译和训练也都是现成的。这里有个容易被新手忽略的点Keras 尽管用起来简单但它底层的每个组件都是用 TensorFlow 原生 API 实现的。所以你可以随时跳到大坑里自定义底层逻辑比如自定义一个损失函数、一个训练循环。这就像你开车时既能用自动挡也能切到手动挡。很多项目之所以“跑通容易调好难”就是因为只满足于自动挡遇到问题时不知道怎么切到手动挡排查。1.3 谁在用它、适合谁学从研究到生产的全景图从我的观察来看2024 年 TensorFlow 的使用者主要集中在几个场景。一是工业界存量项目特别是 Google 系或者早期就选了 TensorFlow 的公司大量线上模型已经是 TF Serving 在提供服务了。二是移动端和嵌入式端TensorFlow Lite 在这个领域仍然是重要选择很多手机 App 里跑的人脸检测、语音唤醒模型都是用它转换的。三是需要分布式训练的场景TensorFlow 的分布式策略在超大规模任务上打磨多年确实稳。Python 语言本身的简洁加上 TF Serving 一键部署的体验让不少对后端部署能力要求高的团队依然离不开它。如果你是要找一份算法工程师的工作TensorFlow 和 PyTorch 至少得通一个另一个也要能看懂。如果你是想快速验证一个想法或者做科研实验PyTorch 可能更顺手但 TensorFlow 的 Keras 接口也完全不拖后腿。2. 环境准备从零开始安装 TensorFlow 并跑通第一个示例我见过太多人卡在环境上明明代码很简单却因为版本不对、CUDA 不匹配、Python 版本过新这些问题一卡就是一整天。说实话深度学习里最没技术含量却最劝退的环节就是环境配置。所以这块我会写得非常具体每一步的坑都给你指出来。2.1 先搞清楚你的硬件再决定装什么版本TensorFlow 的安装分为 CPU 版和 GPU 版核心区别就在你有没有 NVIDIA 显卡。如果只是学习入门CPU 版本跑小模型完全够用因为我下面的示例在 CPU 上跑也就一两分钟时间。如果你要做正经训练那就需要 GPU 版本了。安装之前要做的第一件事是检查显卡。在命令行输入nvidia-smi如果能显示出显卡信息说明驱动已经装好了。这里有个非常关键的信息驱动版本决定你能用多新的 CUDA而 CUDA 版本又决定你能用哪个版本的 TensorFlow。TensorFlow 和 CUDA 的版本匹配是强制性的我见过太多人在这上面翻车了。Python 版本TensorFlow 版本对应 CUDA对应 cuDNN3.9~3.122.16.xCUDA 12.3cuDNN 8.93.8~3.112.13.xCUDA 11.8cuDNN 8.63.8~3.102.10.xCUDA 11.2cuDNN 8.1这个表格不是随便查来的是官方文档里给出的对应关系。你不一定要背下来但得知道有这个映射存在。装的时候如果报错说找不到libcudart.so基本都是这里没对上。我建议的方式是直接装最新 GPU 版 TensorFlow然后配一个能兼容它的 CUDA 和 cuDNN而不是反过来否则很容易遇到“装好了但用不了”的尴尬局面。2.2 创建独立虚拟环境别污染系统 Python用虚拟环境这点我每次都要单独拎出来说。很多人图省事直接pip install tensorflow装在系统 Python 里。短期看是方便了但用不了几次就会出问题。你的另一个项目需要 numpy 老版本这个项目要新版本pip 就会自动帮你升级或者降级结果两个项目全跑不起来了。我一直在用的是 Anaconda 或者 Miniconda 创建的虚拟环境。创建步骤如下conda create -n tf python3.10 conda activate tf pip install tensorflow这里我特意选 Python 3.10 而不是最新的 3.12原因是兼容性最稳。TensorFlow 对新版本 Python 的支持总是慢半拍挑一个经过验证的版本能少踩很多坑。哪怕你电脑上已经有其他 Python 版本了用 conda 虚拟环境也不会互相干扰环境隔离是做好深度学习项目的第一课。考虑到国内外网络环境差异如果你直接pip install速度特别慢或者超时可以换上国内镜像源比如清华源或者阿里源。我实测下来清华源的速度非常稳定pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple2.3 用 GPU 版训练关键基础设施一个都不能少GPU 版的安装相对复杂一些除了 TensorFlow 本身还要装 CUDA Toolkit 和 cuDNN。这里我给一个比较省心的方案利用 conda 自带的 cudatoolkit 和 cudnn可以避免手动配置系统环境变量的麻烦。conda create -n tf-gpu python3.10 conda activate tf-gpu conda install -c conda-forge cudatoolkit11.8 cudnn8.6 pip install tensorflow2.13装完之后验证 GPU 是否可用这是排查环境是否正确配置的关键一步import tensorflow as tf print(tf.config.list_physical_devices(GPU))如果你能看到类似[PhysicalDevice(name/physical_device:GPU:0, device_typeGPU)]的输出说明 GPU 已经被正确识别了。如果输出的是空列表也不要慌张先排查驱动是否正常、CUDA 是否能被系统识别。很多时候是环境变量没生效重启终端就好了。2.4 安装过程中的常见报错与对应解法环境配置这块我把高频踩坑问题先列几个出来等你真的遇到再回来看也不迟。这几种是我在教新手时反复处理的疑难杂症值得先存下来。第一类报错是No module named tensorflow这多半是虚拟环境没激活就运行了 Python或者 pip 装到了别的环境中。用which python和which pip检查一下看看到底指向哪个环境如果没有指向当前虚拟环境就检查一下 conda activate 完成没有。第二类是内核报错Could not load dynamic library cudart64_*.dll这个就是 CUDA 版本不匹配或者环境变量没设置好。如果你是在 Windows 上手动下载 CUDA Toolkit 安装然后把安装路径下的bin目录加到系统 PATH 里重启电脑基本能解决。第三类是内存问题老电脑跑深度学习时经常报Killed或者进程直接消失这通常是内存不够训练时数据一次性加载太多导致。遇到这个就学一招用小 batch size 加model.fit(..., validation_split0.2)方式手写一个数据生成器这样就避免了内存峰值。3. 核心概念拆解看懂 TensorFlow 的基本盘才能玩得转很多教程一上来就让你跑通 demo但换了场景就抓瞎。搞懂几个核心抽象概念比你背十段代码有用得多。TensorFlow 的概念其实不多核心就四个张量、计算图、Keras 层、数据管道。我逐个给你拆开讲清楚。3.1 张量Tensor比数组多了一个“设备”的概念张量这个词听起来很高大上本质上就是多维数组。标量是 0 维张量向量是 1 维张量矩阵是 2 维张量彩色图片可以看成 3 维张量高度、宽度、通道。唯一跟普通数组有区别的地方在于张量有一个device属性可以明确地放在 CPU 或者 GPU 上。这意味着计算可以在不同设备间切换这也为分布式训练提供了底层支持。在实际操作中有几个张量的细节特别容易坑到你。比如形状shape两个矩阵相乘要求左边矩阵的列数等于右边矩阵的行数这个规则跟你调用的 API 无关纯数学约束。再比如数据类型一个tf.float32的张量和tf.int32的张量做运算经常会报错因为 TensorFlow 对类型检查非常严格。所以我建议你在处理图像数据时第一时间就转成tf.float32并归一化这能省去后面大量的调错时间。3.2 计算图从“定义即执行”到“延迟编译”TensorFlow 2.x 的动态图模式很好理解但你要理解tf.function到底做了什么才能更好地去优化模型性能。简单地讲tf.function会把 Python 函数体里的 TensorFlow 操作提取出来构建成一个静态的计算图然后对这个图做各种优化比如算子融合、内存复用、并行调度等。在这个转换过程中有一个核心坑点Python 原生对象和 Tensor 对象的处理逻辑大不相同。tf.function在追踪tracing时只会保存 Tensor 的分支逻辑Python 原生的 if 和 for 会在追踪时被静态展开。我第一次写一个基于步数控制学习率的函数时把 step 当 Tensor 用结果if step 100这个条件判断在追踪时只展开了一个分支后来换上tf.cond才恢复正常。这个点值得你留意用途很广。3.3 Keras 模型从 Sequential 到 Functional 再到 SubclassKeras 的 API 分成三个层次理解清楚他们的适用边界能让你的代码结构清晰不少。Sequential是最简单的适合堆叠线性的网络结构比如全连接网络、卷积网络层与层之间像串糖葫芦一样串起来代码最简洁。它的缺点是一旦某个层需要多输入或者多输出就无能为力了。FunctionalAPI 要灵活得多可以任意拼接、分支、合并适合处理多输入模型、残差结构等复杂情况。我写的大部分模型都用这个模式。它仍然保持了声明式的风格对新手很友好。如果你需要完全的自定义逻辑比如在call方法里写一些动态控制的逻辑那就用Subclassing方式直接继承tf.keras.Model很像在 PyTorch 里写nn.Module。这里给你一个参考建议能用Functional就不要用Sequential因为Functional是它的超集且保留了结构解析能力后续做模型可视化、特征抽取都方便。Subclassing则是“控制力优先”的选择适合研究级需求但代价是丧失了 Keras 自带的一些模型序列化便利。3.4 tf.data 管道别再写 for 循环加载数据了我见过不少人的训练代码是这么写的在 Python 里读所有图片到内存然后 for 循环喂给模型。数据量小还勉强能用一旦数据量大了这个模式不是你内存爆炸就是 GPU 利用率低到让人崩溃。TensorFlow 官方的数据解决方案是tf.data.Dataset它把数据的读取、预处理、混洗、预取都整合成一条管道。dataset tf.data.Dataset.from_tensor_slices((images, labels)) dataset dataset.map(preprocess_fn, num_parallel_callstf.data.AUTOTUNE) dataset dataset.shuffle(10000).batch(32).prefetch(tf.data.AUTOTUNE)这段代码的精妙之处在于map的预处理函数会被自动并行执行prefetch会把下一个 batch 提前加载到内存这样 GPU 在训练当前 batch 的过程中CPU 已经在准备下一个 batch 的数据了。实测下来用上这个管道之后GPU 利用率能从 40% 提升到 85% 以上。这个提升在吃数据的大任务里特别明显。4. 实操全流程用 TensorFlow 2.x 训练一个真实图像分类模型讲到实操这是最有价值的部分。我会用一个经典的 Fashion MNIST 数据集在 CPU 上就能快速训练出不错的模型。这个项目麻雀虽小但五脏俱全包含了数据准备、模型构建、训练、评估和保存的全部流程。你只要照着敲一遍就能真正体验到 TensorFlow 的开发节奏。4.1 数据准备内置数据集一行代码加载Fashion MNIST 是七万张 28×28 的灰度服饰图片一共十个类别比如 T 恤、裤子、包、靴子等。它被称为“Hello World”级别的图像分类数据集非常适合练手。加载方式异常简单import tensorflow as tf from tensorflow.keras import layers, models (train_images, train_labels), (test_images, test_labels) tf.keras.datasets.fashion_mnist.load_data() # 归一化到 [0, 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这里的归一化是必要的不是为了装模作样而是为了让梯度下降更稳定。像素值本来是 0 到 255 的整数直接喂给网络会让初始损失的数值很大训练过程容易震荡。除以 255 后数据都在 0 到 1 之间网络收敛速度明显更快。reshape 时加的通道维度也很关键因为卷积层要求的输入是(height, width, channels)灰度图只有 1 个通道没有这一维会直接报错。4.2 构建模型卷积 池化 全连接的标准套路图像分类的基线模型结构其实非常固定卷积层提取特征池化层降低空间尺寸全连接层做分类。我用一个结构简单但有效的网络来演示model models.Sequential([ layers.Conv2D(32, (3, 3), activationrelu, input_shape(28, 28, 1)), layers.MaxPooling2D((2, 2)), layers.Conv2D(64, (3, 3), activationrelu), layers.MaxPooling2D((2, 2)), layers.Flatten(), layers.Dense(128, activationrelu), layers.Dense(10, activationsoftmax) ])这个网络的核心逻辑是第一层卷积用 32 个卷积核把原始图片的局部纹理特征提取出来池化层把特征图的尺寸减半既降低计算量又增强了平移不变性第二层卷积用 64 个卷积核在上一层特征的基础上提取更抽象的模式最后用全连接层把特征映射到十个类别上。你可能会问为什么卷积核数量从 32 涨到 64 而不是保持一样这是一条实践经验随着网络深入空间尺寸会越来越小为了不损失信息量通常会增加通道数来保持特征的表达能力。相当于你用更少但更精细的网格去观察同样多的信息。4.3 编译与训练理解 optimizer、loss、metrics 三个参数模型构建完成之后编译这一步决定了你怎么去训练它。这里的关键是三个参数的选择我逐一讲透。model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy])优化器用的是adam这是目前最常用的默认选择。它结合了 Momentum 和 RMSProp 的优点对学习率不那么敏感新手用它通常能有不错的结果。sparse_categorical_crossentropy是这里唯一需要仔细理解的损失函数。它适用于标签是整数0, 1, 2...的多分类问题。如果你的标签是 one-hot 编码那就换成categorical_crossentropy两个损失函数的区别就在这里搞混了会报错或者在训练结果上出现莫名其妙的错误。训练过程直接调用fithistory model.fit(train_images, train_labels, epochs20, batch_size64, validation_split0.2)validation_split0.2的意思是拿训练集里 20% 的数据做验证集。我在训练时最关注的是验证集准确率而不是训练集准确率因为训练集准确率再高也可能是过拟合。通过观察验证损失的变化你能比模型自己更早发现它开始死记硬背了。4.4 模型评估与保存训练完不是终点能用才是终点训练完成后用测试集评估模型的泛化能力test_loss, test_acc model.evaluate(test_images, test_labels) print(fTest accuracy: {test_acc:.4f})一般来说这个简单模型跑个 20 轮测试准确率能到 92% 左右。看起来不错但你会发现验证集的准确率在后期可能开始下降了这就是过拟合的信号。改进方法有多种加 dropout 层、做数据增强、加正则化、减少 epoch 数等。我建议你尝试在模型里插入一层layers.Dropout(0.3)位置放在全连接层之后。加了之后你会发现测试准确率通常会稳定地提升 1 到 2 个百分点这在真实项目中已经是非常宝贵的收益了。保存和加载模型是上线前最重要的一步model.save(fashion_mnist_model.keras) loaded_model tf.keras.models.load_model(fashion_mnist_model.keras)这种保存方式会把模型结构、权重、优化器状态一起保存下来。你加载之后可以直接继续训练也可以直接做推理。.keras格式是 TensorFlow 推荐的新格式替代了老的.h5它对自定义层的支持更好跨版本兼容性也更强。5. 常见问题与排查技巧实录这是我踩过的坑你就不用再踩了实操过程中出现问题是常态没有谁第一次就能跑通所有流程。我把这几年遇到的高频问题挑出来按类别整理成一套速查表。每个问题都会说明原因、现象和解决办法方便你直接对标定位。5.1 安装与版本类问题问题 1安装顺利但 import tensorflow 报错。这往往是因为 Python 环境里存在多个版本的 numpy且 libcublas 相关的文件缺失。我遇到过一次很诡异的情况pip install tensorflow成功了但一 import 就闪退。最后排查发现是 conda 环境里自带了一个旧版 numpy跟 TensorFlow 要求的 numpy 2.0 冲突了。解决办法很简单先pip uninstall numpy然后用pip install numpy1.26.4装回一个兼容版本问题立刻消失。如果你在 import 时遇到DLL load failed或者undefined symbol九成也是这类版本冲突顺着这个思路排查就是了。问题 2Could not create cudnn handle: CUDNN_STATUS_NOT_INITIALIZED。这个报错既有可能是 cuDNN 版本不匹配也有可能是显卡驱动太老。一个容易被忽视的细节是如果你的显卡是 2016 年之前的旧架构TensorFlow 新版本根本不会支持。遇到这种报错第一选择是换回老版本 TensorFlow而不是去升级驱动。新驱动虽然能装上但很多老卡的性能反而会受到影响我在这上面吃过亏。5.2 数据与模型训练类问题问题 3loss 变成 NaN或者从一开始就是 NaN。这是训练中最让人头疼的问题。最常见的原因是学习率太大导致梯度爆炸。解决办法是降低学习率比如从默认的1e-3降到1e-4情况通常会有改善。还有可能是数据里有缺失值或者无穷大比如归一化时除以了零或者原始数据里有异常值。我的建议是每次训练前都对数据做一个基本的统计检查用np.isnan(data).any()扫一遍发现异常就处理掉。这是成本最低的解决方式。问题 4GPU 利用率很低训练速度上不去。如果你是 Windows 用户而且开着很多浏览器窗口显卡显存可能被占了一部分。更常见的问题是数据加载太慢GPU 在等 CPU。解决方式就是我前面说的用tf.data.Dataset加prefetch。还有一个小技巧batch_size太小时 GPU 利用率容易上不去试着把它从 32 提高到 128通常会有明显改善。但要注意batch_size过大也会导致显存溢出或收敛变差需要根据模型大小调整。问题 5模型不收敛准确率一直徘徊在低位。这个问题的原因一般有三个方向。一是数据预处理不对比如忘了归一化或者忘做标签对齐。二是网络结构有问题比如激活函数选择不当导致梯度消失。三是学习率设置不合适。我的排查顺序是先调到只跑几个 batch 看看 loss 是否下降不下降就说明代码有问题下降了但很慢再调学习率。用这种逐步排除的方式定位问题是最有效的。5.3 性能与内存优化技巧讲一个我在实际项目中反复使用的优化经验。如果你的模型结构复杂度不高但训练集非常大瓶颈往往在数据读取上。这时最好用tf.dataAPI 里的map配合num_parallel_callstf.data.AUTOTUNE这能让 CPU 多核并行处理数据。还可以用cache()把预处理好的数据缓存在内存中第二次迭代时就避免了重复计算。dataset dataset.cache() dataset dataset.map(preprocess_fn, num_parallel_callstf.data.AUTOTUNE) dataset dataset.batch(128).prefetch(tf.data.AUTOTUNE)这段代码在跑大型数据集时堪称“提速利器”。我在处理一个几百万样本的推荐模型训练任务时仅加上cache()和prefetch()两个操作训练时间就缩短了将近一半。这类优化在开始时往往不太起眼但数据的体量一大效果就非常显著。6. TensorFlow 与 PyTorch 的选择2024 年到底怎么选热搜词里“tensorflow与pytorch的流行趋势 2024年”这个话题最近确实讨论热度很高。我没有办法替你做最终决定但可以把两边的区别、各自的擅长方向以及更重要的——在不同背景下怎么选更合理都讲清楚。这个选择题因人而异、因场景而异。6.1 两个框架的核心差异到底在哪里从工程生态上看TensorFlow 更强调“生产部署”的一体化体验。你可以用同一个模型文件直接部署到云端、浏览器、手机端TF Serving 和 TensorFlow Lite 是专门的部署方案。PyTorch 在这方面虽然不断追赶但更多时候还是需要额外使用 ONNX 转换、TorchScript 或其他工具来完成部署链路。从研究灵活度上看PyTorch 的动态图机制天然对研究者友好你可以像写普通 Python 一样调试每一个细节自然而然地构建复杂的模型结构。TensorFlow 2.x 也已经是动态图模式但它在自定义训练循环、调试动态控制流时还是会比 PyTorch 多一些框架介入感。我在开发新算法时偏好用 PyTorch 做原型效率更高但到了工程落地时通常会把模型转换成 TensorFlow 部署或者直接用 PyTorch 加 ONNX 再转。6.2 什么场景坚定选 TensorFlow如果你是做推荐系统、广告点击率预估这类大规模稀疏特征场景TensorFlow 是更稳妥的选择。这是因为 TensorFlow 的分布式训练能力和对特征处理的支撑经过了长期的工程验证它的生态里有大量相关的工具链上手手边的材料也更丰富。工业界在这类场景中的存量系统很大一部分都跑在 TensorFlow 上。如果你需要把模型部署到手机端或者嵌入式设备上TensorFlow Lite 的成熟度目前仍然是超过 PyTorch Mobile 的。它支持各种量化压缩手段模型在移动端的推理延迟和内存占用都有很好的表现。我们在做端侧人脸识别项目时整个流程几乎都是用 TensorFlow 的转换工具链完成的。6.3 什么场景坚定选 PyTorch如果是在高校或者研究院做科研PyTorch 是绝对的主流。最近几年顶会论文的开源代码绝大多数都是用 PyTorch 写的你想复现别人的工作用 PyTorch 可以省去大量“翻译代码”的过程。而且 Hugging Face 等社区生态对 PyTorch 的支持更完整大模型相关的预训练权重和推理代码基本都是 PyTorch 版本的。如果你正在做大模型相关的训练和推理任务PyTorch 其实占据着明显优势。业界主流的分布式训练框架比如 DeepSpeed、Megatron-LM 等核心接口都优先面向 PyTorch 设计。在这个赛道上选 PyTorch 能直接用上大量的现成方案和社区力量。6.4 我的个人实践经历与最终建议我个人的项目经历是“研究起步用 PyTorch工程落地用 TensorFlow”两种都深度使用过。如果你是刚入门想找一个深入学习我的建议是做研究、打比赛首选 PyTorch做实际项目、需要部署到移动或服务端可以考虑 TensorFlow。不过二者并不互斥掌握一个之后转另一个的学习成本其实很低概念是相通的。如果你已经确定要学 TensorFlow就按我前面写的流程把环境装好、把核心概念吃透、把图像分类 demo 亲手跑一边尤其是把失败和报错的过程完整经历一遍。这种亲身调试的经验比你看十遍文档都管用。说到底框架只是工具真正的核心能力是你对神经网络原理的理解和动手排查问题的经验这些在任何环境下都不会过时。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →