尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TensorFlow入门到实战:安装、CNN模型训练与PyTorch选型对比

TensorFlow入门到实战:安装、CNN模型训练与PyTorch选型对比 如果你今天在搜索引擎里敲下tensorflow这个词大概率会蹦出一串联想词“tensorflow安装”“tensorflow与pytorch的流行趋势 2024年”。这个现象我特别有共鸣——我最早接触 TensorFlow 是 2017 年那会儿光是装 CUDA 驱动就折腾了一个周末结果到了 2024 年环境安装依然是挡住新手的第一道门槛。这篇文章我不打算做成官方文档的复读机而是把 TensorFlow 从“它到底是什么”到“怎么装、怎么跑通第一个模型、踩过哪些印象深刻的坑”完整讲一遍最后再把大家最纠结的 TensorFlow 和 PyTorch 怎么选这件事结合 2024 年的实际趋势说透。无论你是想用 Keras 快速搭模型验证想法还是手头要维护公司的老项目这篇文章都能给你一张能照着走的地图。1. TensorFlow 到底是个什么东西从名字拆开讲1.1 张量Tensor就是装数值的多维盒子很多初学者第一次看到“TensorFlow”这个词会觉得很高深其实拆开看就两句Tensor是多维数组Flow是数据流动。你写的任何数据在 TensorFlow 里几乎都要先变成张量才能参与计算。举个直觉的例子一个数字是 0 维张量一列数是一维张量一张黑白图片是二维像素矩阵。那神经网络里最常见的彩色图片呢它的形状往往是(batch, height, width, channels)也就是四维张量——batch 是这一批有几张图height 和 width 是图片尺寸channels 是 RGB 三个通道。你后续会遇到的卷积层、池化层输入输出本质上都是这种“带形状的数值盒子”。1.2 计算图Flow像一条自动化流水线TensorFlow 最早期的设计备受争议也备受推崇的一点就是静态计算图你先定义好整个计算流程比如“输入进卷积层 → 进激活函数 → 进池化层 → 输出结果”把这个流程当成一张图纸然后 TensorFlow 再按图纸执行。好处是它可以在执行前对整个图做优化也方便在分布式集群里并行跑坏处是调试非常反人类一旦报错你面对的是一大段图结构堆栈而很难直接看到中间某个变量的值。这也是 TF 2.0 之后全面转向**动态执行模式eager execution**的原因也就是像写普通 Python 一样一条一条语句实时计算它执行到哪你就能看到哪。现在你用tf.constant做加法结果立刻能打印出来不需要再在占位符和会话里绕圈子。为了让老用户还能享受计算图优化TF 又提供了tf.function装饰器把一段 Python 函数编译成图兼顾了动态调试和静态优化的好处。打个比方静态图像把菜谱写成流程图交给中央厨房统一调度动态模式像你自己站在锅边放一勺盐看一眼效果。新手现在完全不必关心静态图先把动态模式用熟练就足够了。1.3 还要认识的几个“零件”除了张量和计算图你刚入门时会反复碰到这些关键词名称干的事直观类比tf.Variable保存可训练参数比如网络里的权重和偏置可以不断修改的记事本tf.GradientTape自动记录计算过程并求梯度帮你记下每一步操作方便倒推哪一步该调tf.data高效加载和预处理数据集生产线上的传送带tf.kerasTF 的高级 API快速搭神经网络提供现成积木的模型搭建工具tf.function把 Python 函数编译成计算图把散装步骤变成自动化工序理解这些零件之后再去看安装、训练思路会顺很多。你在网上看到的所有 TensorFlow 教程归根结底就是拿tf.data喂数据给 Keras 模型模型内部用Variable存参数用GradientTape算梯度最后更新参数让损失下降。2. 安装 TensorFlow 之前先想清楚这三件小事很多人一上来就执行pip install tensorflow装完才发现跑不动、GPU 用不上、或者跟系统里的 Python 版本冲突。安装前花十分钟想清楚下面三件事能省下后面两三天。2.1 你的硬件CPU 版和 GPU 版怎么选如果你的电脑没有 NVIDIA 显卡或者显卡显存不大比如 4GB 以内直接安装 CPU 版本就够了用来跑教程、写作业、跑小型模型完全能应付。但我要实话实说一旦你开始训练稍微像样的卷积网络CPU 和 GPU 的差距会非常夸张同样一轮训练GPU 可能几秒完成CPU 要几分钟甚至几十分钟。用 NVIDIA 显卡跑 TensorFlow 时驱动之上还需要 CUDA 工具包和 cuDNN 库。CUDA 是 NVIDIA 提供的并行计算平台cuDNN 是专门针对深度神经网络的加速库。很多新手在这里就迷路了——其实你不需要把这两者完全搞懂但你必须理解一点TensorFlow 只认特定版本的 CUDA 和 cuDNN不是越新越好而是“匹配”才是关键。如果你用的是 Apple Silicon 芯片的 Mac别对 GPU 加速抱有太高期待官方对 macOS 的 GPU 支持已经收窄最省事的方案就是装 CPU 版跑学习和原型验证真要跑大规模训练直接考虑云 GPU 或者 Linux 机器。2.2 你的 Python 环境为什么我强烈建议你建虚拟环境我在各种群里见过最多的悲剧是系统 Python 里装了一堆库某天为了装 TensorFlow 又顺手升级了numpy、protobuf结果其他项目全炸了。解决办法非常简单——每个项目建一个独立的虚拟环境。Python 官方自带的venv就够用不需要额外安装。我推荐的核心习惯是python -m venv tf_venv # Linux / macOS source tf_venv/bin/activate # Windows PowerShell tf_venv\Scripts\activate激活之后你的命令行提示符前面会出现(tf_venv)后续所有pip install都装在这块独立空间里。至于用不用 Conda我建议如果你本来就在用 Anaconda 管理数据科学环境也可以继续用它如果只是单纯想跑 TensorFlow官方venv更轻量不引入额外复杂度。2.3 版本选择别盲目追新也别抱着太老的版本不放TensorFlow 的版本号看起来眼花缭乱但 2024 年你只需要记住一件事装最新的稳定版不要碰tf-nightly或者刚才发布的 RC 候选版。稳定版的 wheel 包通常对主流 Python 版本支持得最完善。具体到 Python 小版本我实测下来 3.10 或 3.11 的兼容性最好踩坑概率最低。Python 3.12 虽然 TF 较新版本也支持了但部分依赖库的 wheel 更新会慢半拍新手没必要在这里冒险。另外注意一点TensorFlow 2.x 的 API 在 2.9、2.10、2.15 之间有一些细节变化但核心的tf.keras高层接口非常稳定你不需要过分纠结小版本差异。3. 从零开始的 TensorFlow 安装实录CPU 与 GPU 两条路说清楚了原理下面进入实操。我给到的是我在多台机器、多个系统上反复验证过的流程你可以直接照着敲。3.1 最省心的 CPU 安装pip 一行搞定如果你的目标只是学 API、跑小模型、写作业CPU 版是最快路径python -m pip install --upgrade pip pip install tensorflow如果网络下载慢可以临时加上国内镜像源比如清华 TUNA 的 PyPI 镜像pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple装完不需要任何额外配置打开 Python 验证一下import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices(CPU))正常情况下会打印出版本号和 CPU 设备列表。CPU 版“开箱即用”这一点真的比 GPU 版友好太多了。3.2 Linux 的 GPU 安装推荐tensorflow[and-cuda]如果你用的是 Linux 系统且有一块 NVIDIA 显卡2024 年最省事的 GPU 安装方式已经变成了一条命令pip install tensorflow[and-cuda]这个[and-cuda]扩展包是 TensorFlow 2.11 开始提供的机制它会把配套的 CUDA 运行库、cuDNN、NCCL 等相关二进制依赖一并装进你的 Python 环境你不需要再去 NVIDIA 官网手动下载 CUDA Toolkit 再配置一堆环境变量。注意前提条件你的操作系统里已经装好了 NVIDIA 显卡驱动并且在终端里执行nvidia-smi能正常显示显卡信息和驱动版本。驱动装好后在虚拟环境里执行上述安装命令它可能下载数 GB 的依赖耐心等待即可。装完后我用下面这段代码检查 GPU 是否被 TensorFlow 正确识别import tensorflow as tf print(可用的 GPU 数量:, len(tf.config.list_physical_devices(GPU))) print(tf.config.list_physical_devices(GPU))如果输出里能看到name: NVIDIA GeForce ...之类的内容说明 GPU 已就绪。你还可以跑一个矩阵乘法测试真实计算路径a tf.constant([[1., 2.], [3., 4.]]) b tf.constant([[5., 6.], [7., 8.]]) print(tf.matmul(a, b))能正确算出结果就说明 TensorFlow 的核心计算链路没有问题。如果想确认计算确实发生在 GPU 上可以临时执行with tf.device(/GPU:0): c tf.matmul(a, b) print(c)3.3 Windows 的 GPU 安装两条路线怎么选Windows 用户比较特殊。tensorflow[and-cuda]这个扩展目前官方主要面向 Linux 环境提供所以在 Windows 上原生 GPU 安装通常还是走老路手动下载 CUDA 工具包、cuDNN再配置 PATH 环境变量。这条路对新手来说极易出错一个版本对不上就前功尽弃。我的建议是如果你必须用 GPU 跑 TensorFlow且装的是 Windows优先考虑WSL2Windows Subsystem for Linux。在 WSL2 里装好 Ubuntu 后按上面 Linux 的流程来GPU 调用通过 WSL 透传访问 Windows 的 NVIDIA 驱动稳定性和官方支持度都更好。公司里几个同事用 Windows 机器训练模型我统一让她们走了 WSL2 路线再也没有半夜发截图求助的情况。如果你实在不想碰 WSL那 Windows 原生路线的稳定组合是安装跟 TensorFlow 版本匹配的 CUDA 工具包以 2.15 为例常见的是 CUDA 11.8 cuDNN把两个库的bin目录加入系统 PATH然后再pip install tensorflow。这需要更多耐心并且每一步都要核对版本号。3.4 安装完的“冒烟测试”别跳过很多新手装完 TensorFlow 就直接去复制别人的模型训练代码跑出满屏红字才回头排查环境。我建议你先花两分钟做一次冒烟测试把环境问题尽早暴露出来python -c import tensorflow as tf; print(tf.__version__)如果这一步就报错先看是不是 Python 版本不兼容如果这一步通过再看 GPU 列表。用一个列表把常见现象列出来现象最可能原因下一步pip install时找不到对应 wheelPython 版本太新或太旧换 Python 3.10/3.11 重新建环境import 时报 DLL 加载失败Windows 缺 CUDA/cuDNN 动态库检查 PATH 或改用 WSL2GPU列表为空但显卡驱动正常CUDA 版本与 TF 不匹配用tensorflow[and-cuda]或核对版本对照表命令行执行import tensorflow卡死机器内存不足或者和旧版 numpy 冲突升级 numpy或者查看内存占用4. 装完直接跑通第一个模型手写数字识别全流程环境就绪后我推荐你立刻动手写一个完整的模型训练流程。很多人卡在“装完不知道下一步干什么”其实最有成就感的第一步就是跑通 MNIST 手写数字识别。下面这套代码你完全可以原样照敲。4.1 数据加载与预处理为什么一定要归一化TensorFlow 自带 MNIST 数据集不需要自己找数据文件(x_train, y_train), (x_test, y_test) tf.keras.datasets.mnist.load_data()原始数据的像素值范围是 0 到 255而神经网络对较大数值范围的输入通常很敏感。把像素除以 255 变成 0 到 1 的小数既能加速收敛也避免梯度在深层传播时爆炸。MNIST 默认形状是(60000, 28, 28)表示 6 万张 28x28 的灰度图但没有通道维度。为了喂给卷积层我把它 reshape 成(60000, 28, 28, 1)最后的 1 代表灰度通道x_train x_train.reshape(-1, 28, 28, 1).astype(float32) / 255.0 x_test x_test.reshape(-1, 28, 28, 1).astype(float32) / 255.0标签y_train是 0 到 9 的整数表示每张图片是哪个数字。4.2 模型搭建与训练理解每一层在干嘛我这里的模型是一个典型的卷积识别网络model tf.keras.Sequential([ tf.keras.layers.Input(shape(28, 28, 1)), tf.keras.layers.Conv2D(32, (3, 3), activationrelu), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activationrelu), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(10, activationsoftmax) ])这里每层的思路是两个Conv2D卷积层负责提取局部特征第一个 32 个卷积核抓边缘、纹理第二个 64 个卷积核进一步组合出更抽象的图形特征。MaxPooling2D池化层下采样把特征图的尺寸缩小一半减少计算量的同时保留主要特征。Flatten把二维的特征图拉成一维向量方便后面接全连接层。Dropout(0.5)在训练时随机丢弃一半神经元的输出防止过拟合。最后的Dense(10, activationsoftmax)输出 10 个类别的概率分布。编译模型时sparse_categorical_crossentropy这个损失函数对应整数标签如果你的标签改成 one-hot 编码就要换成categorical_crossentropy。新手在这里最容易用错。model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy]) model.fit(x_train, y_train, validation_split0.1, epochs5, batch_size128)训练时观察输出loss在下降、accuracy在上升、val_accuracy也在上升这说明模型真的在学习如果val_loss一路涨而训练集准确率很高那就是过拟合了。这个简单模型跑 5 个 epoch测试准确率通常能到 99% 上下很有成就感。4.3 评估、预测与保存模型把成果留下来训练结束后先拿测试集看看真实水平test_loss, test_acc model.evaluate(x_test, y_test) print(f测试集准确率: {test_acc:.4f})然后试着自己预测几张图predictions model.predict(x_test[:10]) predicted_labels predictions.argmax(axis1) print(predicted_labels)softmax输出的 10 个概率中概率最大的索引就是模型预测的数字。最后把模型保存下来方便以后直接加载model.save(mnist_model.keras)之后换个会话想要复用一行加载loaded_model tf.keras.models.load_model(mnist_model.keras)model.save保存的不只是权重而是包括网络结构、优化器状态在内的完整模型。用.keras这个新格式比老的.h5更清晰没有兼容性糟心事。5. 安装和入门阶段最容易踩的坑我一个个说跑通第一个模型不代表就万事大吉。环境问题这东西每个人遇到的都不太一样但抛开那些千奇百怪的具体报错核心坑位其实就那几个。我把它们放在一起说是因为它们往往交替出现。5.1 版本地狱Python 版本和 TensorFlow 版本不匹配这是所有坑里出现频率最高的。最常见的剧情是用最新版 Python 装 TensorFlowpip install报错Could not find a version that satisfies the requirement tensorflow。原因很简单你当前的 Python 版本太高TensorFlow 的某个依赖还没有对应 wheel 包。我自己的经验是TensorFlow 稳定版发布一个版本往往需要几个月时间适配最新的 Python。2024 年的稳定版对 Python 3.10、3.11 支持得最充分3.12 在较新的 TF 版本里能用但如果你装的是几个月前的版本就容易踩坑。解决办法也很朴素用pyenv或 Conda 把 Python 切到 3.10 或 3.11重新建虚拟环境不要在原环境里硬碰硬。5.2 GPU 能识别但 TensorFlow 找不到多半是 CUDA 的问题很多人执行nvidia-smi看到显卡好好的但tf.config.list_physical_devices(GPU)返回的是空列表。这里千万不要怀疑显卡坏了绝大多数原因是 TensorFlow 需要在环境中找到配套的 CUDA 动态库和 cuDNN而这些库缺失或版本不匹配。Linux 下可以查一下ldconfig -p | grep cudnn如果找不到 cudnn 相关输出说明运行时依赖没有就位。手动安装那套 CUDA/cuDNN 组合是最容易让人崩溃的环节而这也是我前面强调tensorflow[and-cuda]的原因——它把配套运行库直接纳入 pip 依赖管理大幅降低环境配置的出错概率。5.3 训练时显存不够不要一上来就想着加大 batch size深度学习的显存GPU 显存是很宝贵的资源。新手训练一报 OOMout of memory第一反应常常是换更大的显卡但其实问题往往出在代码层面。TensorFlow 默认会尽量占用整张显卡的显存这会导致你明明只用了 2GB它却把 8GB 全占满别的进程就没法用了。建议在训练前加一段显存动态增长配置gpus tf.config.experimental.list_physical_devices(GPU) if gpus: try: for gpu in gpus: tf.config.experimental.set_memory_growth(gpu, True) except RuntimeError as e: print(e)这样 TensorFlow 会按需分配显存而不是一上来就占满。另外训练前可以先执行nvidia-smi看一下是不是有其他进程占着显存再把batch_size从 128 调到 64 甚至 32往往立竿见影。5.4 训练过程无预警卡死先查数据管道和磁盘有时候模型训练到一半进度条突然不动了电脑风扇狂转但 CPU 占用也不高。这个情况在传统的数据加载写法里很容易出现每次迭代都要从磁盘读图片并做实时预处理磁盘 IO 或者解码成为瓶颈。遇到这种情况我首先会检查是不是数据加载的问题而不是怀疑显卡坏了。TensorFlow 的推荐做法是用tf.dataAPI 构建数据管道并把prefetch打开让数据准备和模型训练并行起来。对于 MNIST 这种小数据集可能感受不明显换到真实图片数据集prefetch和不加的性能差距经常是天壤之别。另外如果数据集存放在机械硬盘上建议先拷到本地 SSD 再训练否则你的时间会大量花在“等数据”上。6. 2024 年 TensorFlow 与 PyTorch 的流行趋势怎么选才不亏这个话题在技术社区里几乎每周都会吵一轮。作为过来人我聊聊观察到的真实局面不给任何人制造焦虑只帮你看清楚选择背后的逻辑。6.1 研究界和工业界的“两双眼”从论文代码、GitHub 星标增速、知名开源项目的使用情况来看2024 年在研究和教学领域PyTorch 的占比已经明显压过 TensorFlow。打开近两年的热门论文复现代码PyTorch 居多许多新出的社区工具也默认优先支持 PyTorch。这不代表 TensorFlow 不行而是两个框架在用户心智里的分工发生了变化。与此同时生产部署领域完全是另一番景象TensorFlow Serving 在工业界有大量成熟落地案例TFLite / MediaPipe 在 Android 端模型部署上几乎绕不开很多公司在 2018 到 2021 年期间构建的模型服务栈底色就是 TensorFlow。这意味着存量市场非常庞大。你接手一个企业老项目时看到SavedModel格式的可能性依然很高。6.2 TensorFlow 在 2024 年依然值得学的三个理由第一Keras 的友好度仍然是一绝。如果你是第一次接触深度学习tf.keras.Sequential这种写法和文档的连贯性能把学习摩擦降到很低。PyTorch 也很直观但它的灵活是一把双刃剑新手容易在自定义训练循环里迷失。第二部署生态依然能打。做移动端或嵌入式场景TensorFlow Lite 的工具链相对成熟做服务端高性能推理TensorFlow Serving 的很多特性依然高效。PyTorch 这几年也在猛追部署能力但 TF 的先发优势还在。第三工业界存量决定了岗位需求。我刷招聘信息时观察到一个现象不少公司的 JD 里写的是“熟悉 TensorFlow 或 PyTorch 之一”。也就是说只懂一个不会没机会但两个都懂绝对是加分项。而 TensorFlow 作为“懂一个”的备选项并没有大多数人想象中那么过气。6.3 我的建议按你要去的地方选而不是按热度选我不太建议新手在入门期同时学两个框架。更合理的思路是判断你未来最可能的场景你的目标优先选原因快速上手深度学习、验证想法、交作业TensorFlow Keras上手平缓代码量少复现最新论文、进入研究组PyTorch研究生态优势明显做 Android 端或边缘设备部署TensorFlow Lite 路线部署工具链成熟做服务端模型上线接手存量系统TensorFlow TF Serving企业存量系统多只是想广泛学好框架原理任选一个概念互通张量、自动求导等核心思想一致说一个我自己的判断2024 年的局面其实不再是“谁取代谁”而是两个框架各自守住了不同的山头。你在网上看到“PyTorch 一统天下”的标题党很多但如果因此完全忽略 TensorFlow可能在面对真实企业需求时抓瞎。反过来如果只守着 TensorFlow 不看 PyTorch你也会在研究交流、论文复现时感到越来越吃力。最后分享一个我测试过多次的经验不管你先学哪一个请务必完整跑通三个以上的实际项目再考虑换框架。比如用 Keras 跑一遍 MNIST、CIFAR-10、一个简单的文本分类把数据加载、模型搭建、训练、评估、保存、部署这条链路走完。框架只是工具里面的张量运算、梯度下降、损失函数这些底层概念才是你真正要带走的东西。把其中一个框架的完整流程吃透再切到另一个框架时你通常一周以内就能上手——因为你在转的是习惯不是在补原理。
返回列表