☰
TensorFlow 2.0+Keras实战:Python深度学习入门与模型训练全解析
2026/10/1 15:21:25 网站建设 项目流程

如果你点进这篇文章,我猜你已经被“深度学习”这三个字劝退过至少一次。网上教程要么上来就是一堆矩阵求导公式,要么就是让你配环境配到怀疑人生。这门技术本身并没有那么复杂,真正拦住大部分人的是:环境装不上、代码看不懂、好不容易跑了模型结果loss不降。我当初就是被这三件事折磨过来的,所以这篇实战笔记就围绕Python深度学习入门这条路,用TensorFlow 2.0和Keras把从环境搭建到模型训练的全过程拆开讲清楚,目标是让你看完之后能自己把代码跑起来,而且知道每一步在干什么。

这篇内容面向什么样的读者?你最好有一点点Python基础——会定义变量、会写函数、知道列表和字典的区别,就足够了。完全没写过Python的话,建议先去花一两个小时熟悉下基本语法再回来,不然代码里的语法细节会分散你对深度学习核心概念的注意力。我会尽量把每个环节的“为什么这么做”讲明白,而不是丢给你一段能跑但完全看不懂的代码。项目本身用的是Fashion-MNIST图像分类,这是一个非常适合新手的入门级数据集,你的显卡是集成显卡也能跑,用CPU就够了。

1. 整体设计与思路拆解

1.1 为什么选TensorFlow 2.0/Keras而不是PyTorch

这个问题我几乎每次跟朋友聊深度学习都会被问到。前面也说了,网上到处是PyTorch的教程,GitHub上热门项目也一堆PyTorch代码。如果你关注2024年的趋势,确实能感觉到PyTorch在学术圈和AI研究领域越来越强势。但我给新手的第一建议仍然是TensorFlow 2.0搭配Keras,理由很直接。

第一个理由是学习曲线。Keras的API设计逻辑非常贴近人类的思考方式。你想搭一个神经网络,只需要像搭积木一样把层一层层叠起来,Sequential模型一目了然。而PyTorch虽然代码自由度更高,但你需要更早地理解Module、forward、optimizer.zero_grad()这些概念。这就像学开车,Keras是自动挡,你可以先把注意力放在路况上,而不是一直纠结离合和换挡时机。

第二个理由是工程生态和资料完备度。TensorFlow在生产部署、移动端推理这些方向上磨了很多年,你训练完模型之后无论想做Web端还是移动端,都能找到成熟的落地方案。最朴素的道理是:一个东西用的人足够多、时间足够久,你踩到的坑大概率已经有人踩过并且在网上写了解决方案。

第三个理由是框架迁移成本比你想象得低。深度学习核心思想就四件事:数据、模型、损失函数、优化器。你只要理解了这四者在Keras里是怎么配合的,换到PyTorch只是换了一套API表达方式,底层逻辑几乎是通用的。很多初学者总想一步到位学最“潮”的框架,反而忽略了真正重要的基础概念。

1.2 先跑通再啃理论,是我给你的核心路线

传统的学习路径是“先学理论再动手实践”——拿起一本深度学习的书,从感知机开始看,看完梯度下降推导,再看到反向传播的链式法则,大概率在第3章就放弃了,因为你不知道这些东西到底有什么用。

我的思路完全反过来:先想办法把模型跑起来,让代码给你正向反馈,看到准确率真的会随着训练提升,再回过头去补理论。这就好比你想学做菜,与其先花三周学食材的营养成分和化学反应,不如先照着菜谱做出一盘西红柿炒蛋,吃到嘴里那一刻,你对“火候”“调味”这些概念才真正有感知。深度学习也是一样,当你亲手跑完一个模型,看到loss从1.0降到0.3,这时候再去看什么是梯度下降,你能在脑子里对应上每一行代码在做的事情。

所以这篇实战的编排是:环境搭建 -> 核心概念最小讲解 -> 完整项目实操 -> 常见问题排查。环境是门槛,概念只讲够用的部分,然后把最大篇幅留给实操和踩坑经验。

1.3 路线图:数据、模型、训练、评估的闭环

任何深度学习项目,无论复杂到GPT还是简单到Fashion-MNIST分类,本质上都在跑同一个闭环:

  • 数据:准备好输入和对应的正确答案。你喂给模型的是一张图片像素矩阵,同时告诉它这张图是T恤还是裤子。
  • 模型:搭建一个神经网络结构,本质上是一堆带参数的数学函数,初始时参数是随机数,输出也是瞎猜的。
  • 训练:通过对比模型预测结果和真实答案,算出损失值,再根据这个损失值反向调整模型的参数,让它的预测越来越准。
  • 评估:用训练时没见过的数据来测试模型到底表现如何。

Keras最让我喜欢的一点是,它在代码层面把这条闭环清晰地对应起来了:load_data()负责数据,Sequential()负责模型,compile()和fit()负责训练,evaluate()负责评估。你不需要去管参数具体怎么更新,那是框架内部的事情。我们只需要在“模型结构”和“训练策略”这两个层面做好决策就行。后面实战部分你会看到,核心代码不超过三十行,就是这么简单。

2. 环境准备:Anaconda + TensorFlow安装实操

2.1 为什么必须用虚拟环境

这一部分我踩过无数坑,必须多说几句。很多人的第一步就跪在这里——直接用系统自带的Python开始pip install tensorflow,装了一堆报错之后系统Python环境全乱了,连原来正常的脚本都跑不起来。用Anaconda建独立环境是非常成熟的做法,也是我认为最稳妥的方案。

为什么需要独立环境?因为你电脑上可能有不同项目依赖不同版本的库。比如项目A要求TensorFlow 2.4,项目B要求TensorFlow 2.10,如果都装在系统Python里,早晚冲突。Anaconda给每个项目建立独立空间,互不干扰。这相当于你给每个项目都准备了一间独立的房间,而不是所有人挤在大通铺上。

安装步骤很简单。先到Anaconda官网下载对应你操作系统的安装包,一路默认安装即可。然后打开终端(Windows上打开Anaconda Prompt),执行:

conda create -n tf python=3.9

这句话的意思是创建一个名叫tf的虚拟环境,指定Python版本为3.9。为什么要指定3.9而不是最新版?因为我踩过Python 3.11、3.12版本太新导致某些库还没有预编译包的坑。TensorFlow对Python版本比较挑剔,3.9经过大量验证,兼容性最好。如果你用了新版本环境,遇到No module named tensorflow或者安装时报编译错误,大概率就是版本兼容问题。

创建好之后激活它:

conda activate tf

接下来安装TensorFlow。CPU版本最大,无需显卡也能流畅跑小数据集:

pip install tensorflow

2.2 CPU还是GPU,新手怎么选

很多新手一上来就问:我是不是必须买一张好的显卡?答案是:跑本篇的Fashion-MNIST模型,CPU完全够用,几十秒一个epoch,总共训练几个epoch也就几分钟。真正需要GPU的是大规模数据和复杂模型,那是后话。所以建议你第一步先装CPU版,把流程跑通,之后再考虑是不是要升级GPU环境。硬要在配置上较劲,反而容易卡在CUDA版本匹配这个巨大的坑里,失去入门的动力。

如果你确实有NVIDIA显卡,且以后打算跑更复杂的模型,可以装GPU版。这里有一个重要的版本知识点:TensorFlow 2.10是最后一个原生支持Windows GPU的版本,之后的版本在Windows上安装GPU支持需要走WSL2方案。我最推荐的做法是在Linux系统下搞GPU环境,坑最少。不过在入门阶段,CPU版就是最好的选择,这句话我可以负责任地说。

验证安装是否成功,在Python交互环境里执行:

import tensorflow as tf print(tf.__version__) print(tf.config.list_physical_devices())

第一行输出类似2.16.1这样的版本号,第二行能看到你的CPU设备信息。如果这两行能正常输出,说明环境已经通畅了。如果出现Could not load dynamic library 'cudart64_*.dll'之类的红色警告,不用慌,那只是提示你没有CUDA,CPU版依旧能正常工作。

2.3 用Verification代码测试环境,避免装完才发现有问题

环境装完建议立刻做个快速测试,别急着关终端。跑一个最简单的张量操作:

import tensorflow as tf a = tf.constant([[1.0, 2.0], [3.0, 4.0]]) b = tf.constant([[5.0, 6.0], [7.0, 8.0]]) c = tf.matmul(a, b) print(c.numpy())

这是一个2x2矩阵相乘,能运行就说明TensorFlow核心功能正常。这个测试比只打印版本号更有意义,因为有些安装方式版本号能打印出来,但真正运行时缺失某些组件会报错。矩阵相乘能跑,说明核心运行时没有坏。

关于IDE,我用的是VSCode,选它是因为插件生态好,在终端里选择tf这个解释器就能直接运行代码。你也可以用Anaconda自带的Jupyter Notebook,一行行执行代码看中间结果,对新手更友好。两条路都可以,不需要纠结。有一点要提醒:在VSCode里按Ctrl+Shift+P选择Python解释器时,一定要选中之前创建的那个tf环境,否则你会看到明明是同一个Python文件,别人能跑你报“找不到tensorflow”,其实就是选错了解释器。

3. 核心概念拆解:Tensor、自动求导、训练参数

3.1 Tensor:不过是带形状的多维数组

深度学习里你到处会看到Tensor这个词,听起来很唬人,但在深度学习框架的语境下,Tensor就是一个多维数组。多维数组是什么?0维是单个数字,1维是一行数字(向量),2维是一张数字表(矩阵),3维就是多张表摞在一起。下面的表把对应关系列一下:

Tensor维度形状示例生活化理解
0维(标量)()一个数,比如损失值0.54
1维(向量)(784,)一行784个像素点
2维(矩阵)(32, 784)32行、每行784个像素的表格
3维(32, 28, 28)32张28x28的图片叠在一起
4维(32, 28, 28, 1)32张28x28的图片,每张有1个颜色通道

在Fashion-MNIST实战中,一张图片是28x28像素的灰度图,单个样本的形状是(28, 28)。但训练时你不会一次只看一张图,而是把32张图组成一个批次(batch),所以送入模型的数据形状是(32, 28, 28)。Keras的模型会自动处理这个维度,你只需要在写代码时知道这一点,调试报错才能看懂。

3.2 自动求导:框架替你完成了最难的数学

传统机器学习课程里,你花大量时间推导梯度公式。深度学习的神经网络动辄几百万个参数,人肉推导根本不现实。TensorFlow 2.0引入的自动求导机制,本质就是利用链式法则,自动把损失函数对每个参数的梯度算出来。

在Keras的高层API下,你甚至不需要显式接触自动求导,因为model.fit()内部把“前向计算损失 -> 反向传播梯度 -> 更新参数”这个循环都帮你封装好了。但理解GradientTape仍然有价值,因为你要跟进深度学习话题,迟早会遇到类似with tf.GradientTape() as tape:这样的代码。它的逻辑是:在GradientTape代码块内执行的所有运算,框架都会记录计算图,然后调用tape.gradient(loss, model.trainable_variables)得到梯度,再交给优化器更新参数。你可以把它理解成一个黑箱计算器,你输入公式的每个操作它都记在小本子上,最后你要导数值,它翻小本子就能推出来。

3.3 三个必懂参数:epoch、batch_size、learning_rate

这三个参数在Keras的fit()里最常见,但很多新手对它们的理解很模糊,我帮你一次讲透。

  • epoch:全部训练数据被模型完整看一遍的次数。打个比方,你刷一本习题集,从头做到尾算一轮。做10遍就是10个epoch。每轮结束,模型应该对“见过”的题目越来越熟,loss越来越低。
  • batch_size:一次喂给模型多少个样本。如果全部60000张图一次性喂进去,内存根本扛不住,而且一次看太多,梯度更新方向不精细。通常的做法是每次喂32或64个样本,计算一次梯度,更新一次参数。所以你每看32张图,就得做一道“小测验”调整一下自己脑子里的权重。
  • learning_rate:每次更新参数的步长。参数调整是靠“当前梯度方向加上一个步长”来更新的,步长就是学习率。学习率设得太大,模型很可能在最优解附近来回震荡,loss变成nan;设得太小,训练速度慢得让人失去耐心。一般从0.001开始尝试。

这三个参数相互配合,调整它们就是入门阶段最重要的“调参”体验。你后面会看loss曲线,如果曲线像过山车一样剧烈抖动,多半是learning_rate太大;如果曲线一直平稳但下降很慢,可能是learning_rate太小或epoch不够。

3.4 澄清一个常见误解:模型参数量与显存占用

我在热搜词里看到一句话“深度学习里的parameter应该不是mb吧”,很多新手确实会把这两个概念搞混。模型参数量的单位是“个数”,比如一个模型有1.7亿个参数;而显存/内存占用的单位是字节(Byte)。一个float32类型的参数占4字节,所以1亿个参数大约占4亿字节,约400MB。但显存占用不只是参数,还包括中间激活值、梯度、优化器状态等,实际占用会比参数本身大好几倍。所以你看到“参数量”和“训练显存需求”之间没有简单的等号关系,这是正常的。

4. 实战:用Keras训练Fashion-MNIST图像分类模型

4.1 数据加载与归一化:为什么这一步不能省

Fashion-MNIST是Keras内置的数据集,包含60000张训练图片和10000张测试图片,都是28x28的灰度图,分10类:T恤、裤子、套头衫、裙子、外套、凉鞋、衬衫、运动鞋、包、踝靴。选择它而不是经典的手写数字MNIST,是因为MNIST对现代模型来说太简单了,你很难感受到模型调优的乐趣。Fashion-MNIST的难度适中,既能跑出让你有成就感的准确率,又不会简单到毫无挑战。

先把代码写出来:

import tensorflow as tf from tensorflow import keras # 1. 加载数据 (x_train, y_train), (x_test, y_test) = keras.datasets.fashion_mnist.load_data() # 2. 归一化:把像素值从0-255缩放到0-1 x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 print(x_train.shape, y_train.shape)

归一化这一步,很多教程一句话带过,但它极其重要。神经网络的训练依赖梯度计算,如果输入像素值范围在0-255,不同特征的数值尺度差距会很大,导致梯度更新不稳定,模型很难收敛。把数据缩放到0-1之间是标准做法,我见过很多新手跳过这一步,结果loss卡在0.69附近怎么都不降,到处找原因——最后发现就是没归一化。这是最简单也最容易踩的坑,请你牢牢记住。

4.2 模型搭建:Sequential三层结构逐层拆解

Keras搭建模型最常见的方式是Sequential,一层一层叠上去。代码:

model = keras.Sequential([ keras.layers.Flatten(input_shape=(28, 28)), keras.layers.Dense(128, activation='relu'), keras.layers.Dropout(0.3), keras.layers.Dense(10, activation='softmax') ]) model.summary()

逐层解释一下:

  • Flatten:把28x28的二维图片拉平成一维向量(784个数值)。这一层没有参数,它的作用就是把数据形状从(batch, 28, 28)变成(batch, 784),方便输入到全连接层。
  • Dense(128, activation='relu'):全连接层,128个神经元。每个神经元会跟上一层的784个输入做加权求和,再加一个偏置,然后过ReLU激活函数。这一层是可学习参数的大头。
  • Dropout(0.3):训练时随机让30%的神经元失活。它的作用是防止过拟合。打个比方,你让一个团队做事,如果每次固定让几个人包揽所有任务,其他人就会变懒;Dropout强迫每个人都有可能被“休假”,于是大家都会保持工作状态,模型的泛化能力更好。
  • Dense(10, activation='softmax'):输出层,10个神经元对应10个类别。Softmax把这10个原始分数转换成一个概率分布,加起来等于1,哪个类别的概率最大,模型就预测是哪个类别。

model.summary()输出里能清楚看到每一层的参数数量。我来带你算一下第一层的参数:Flatten后输入是784,输出128个神经元,每个神经元有784个权重加上1个偏置,这一层参数量就是784128+128=100480,加上输出层12810+10=1290,总参数量约101770。这个数字就是模型的“可学习参数量”,它用不着你手动指定,框架会自动初始化并更新。

4.3 编译与训练:loss下降的过程就是学习的过程

模型搭好之后,编译这一步是设定训练方式的:

model.compile( optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )

三个配置的含义:

  • optimizer='adam':优化器决定如何更新参数。Adam目前是实践中的默认选择,它自带自适应学习率能力,对新手非常友好,基本不需要手动调整太多参数。

  • loss='sparse_categorical_crossentropy':损失函数衡量模型预测和真实答案的差距。为什么是sparse?因为我们的标签是整数(比如0代表T恤),而不是独热编码的向量。如果标签是独热编码向量,就要用categorical_crossentropy。如果你传错了,Keras会明确报错。

    这里我要多说一句交叉熵。新手最容易问的一个问题是:为什么不直接用准确率作为优化目标?因为准确率是一个“非平滑”的指标——预测对了就是1,错了就是0,参数略微调整可能不会让准确率产生任何变化,梯度没法有效传导。交叉熵衡量的是“两个概率分布之间的差距”,它是平滑的,参数稍有调整,loss就会有细微变化,梯度就能沿着正确方向走。深度学习里这种“用平滑可导的损失函数代替粗暴指标”的思想贯穿始终,值得记住。

  • metrics=['accuracy']:在训练过程中额外监控准确率,方便你直观看到模型表现。

接下来开始训练:

history = model.fit( x_train, y_train, batch_size=64, epochs=10, validation_split=0.2 )

validation_split=0.2的意思是留出20%的训练数据作为验证集,在每一轮训练结束后测试模型在这批没见过(但也没参与训练)的数据上的表现。为什么要这么做?因为你要判断模型是不是在死记硬背。如果训练集准确率一直涨,但验证集准确率不涨甚至跌了,说明模型过拟合了,光背答案不会举一反三。

训练时你会看到每个epoch结束输出一行日志,类似:

Epoch 1/10 750/750 [==============================] - 5s 6ms/step - loss: 0.7483 - accuracy: 0.7301 - val_loss: 0.5053 - val_accuracy: 0.8254 Epoch 10/10 750/750 [==============================] - 5s 6ms/step - loss: 0.2887 - accuracy: 0.8952 - val_loss: 0.3446 - val_accuracy: 0.8762

我从训练经验里告诉你几个读日志的要点。第一,看loss是否在稳定下降,如果每个epoch都在降,说明模型在学习。第二,对比accuracy和val_accuracy,正常情况下训练集略高一点点是合理的;如果两者差距越来越大,比如训练集0.95、验证集0.82,就要警觉过拟合。第三,val_loss如果开始回升而loss继续下降,也是过拟合的经典信号。这个现象在实际训练里见得太多了。

4.4 评估、预测与模型保存:把你的模型变成能用的东西

训练结束后,首先用测试集评估最终效果:

test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0) print(f'测试集准确率: {test_acc:.4f}')

理论上测试集准确率会在0.87左右,这个数字对入门项目来说已经相当不错了。

如果想看模型对具体一张图片的预测:

import numpy as np predictions = model.predict(x_test[:10]) print(np.argmax(predictions, axis=1))

predict返回的是每个样本在10个类别上的概率值,np.argmax取最大概率对应的下标,就是模型认为最可能的类别。我建议你随便找几张测试图片,把模型预测的类别和真实标签打印出来对比一下,比单纯看准确率更有实感。你会看到模型有时候也会犯错,比如把运动鞋认成踝靴——人眼看来这两类确实长得挺像的。

最后是保存模型。训练好的模型就是一堆参数文件,不保存的话关掉程序就没了:

# 保存整个模型 model.save('fashion_mnist_model.keras') # 加载模型做后续预测 loaded_model = keras.models.load_model('fashion_mnist_model.keras')

不用纠结那个.keras后缀,它是Keras 3.x的标准格式。保存整个模型的好处是把网络结构代码和参数一起打包了,换台机器也能直接加载使用,不用重新定义网络结构。

5. 常见问题与排查技巧实录

5.1 环境与安装类问题速查表

我在带很多朋友入门的过程中,把最常见的报错整理成了一份速查表,遇到问题直接对照着找,效率比自己瞎试高得多。

问题现象常见原因解决办法
pip install tensorflow提示找不到对应版本Python版本太新/太旧用conda创建Python 3.9环境后再装
import tensorflow报DLL load failed缺少Visual C++运行库安装微软官方VC++ Redistributable
import tensorflow报警告CUDA/cuDNN错误装了GPU版但没有正确配置CUDA新手建议安装纯CPU版,即pip install tensorflow-cpu
Keras报错说kernel died内存不足或Jupyter内核崩溃重启内核,减少batch_size或数据量
VSCode里import tensorflow报ModuleNotFound选错了Python解释器Ctrl+Shift+P选择正确的tf环境

我特意把“CUDA相关报错”放在最后提醒一次:CPU版本跑本项目的速度完全够用,不要为了“完整”而强行上GPU,那个坑在Windows下最深。我当年在Windows下折腾CUDA,整整浪费了两天,最后直接换CPU版,五分钟跑通,当年悔得肠子都青了。

5.2 训练过程中最常见的三个诡异现象

loss一直是nan:这个现象几乎每个新手都遇到过。排查顺序从高到低:学习率太大、数据没归一化、损失函数选择错误。如果是learning_rate原因,把它从0.001降到0.0001再试试;如果没归一化,按上面讲的方法处理。nan的问题特征是“训练到一半突然变nan”,我也见过有人说前面好好的到epoch 3就nan了——那多半是中间激活值溢出,核心还是数据或学习率的问题。遇到nan不要慌,逐项排查就行。

loss不下降,卡在0.69左右:还记得前面说的交叉熵吗?对于10分类问题,随机猜测的损失大约等于log(10)≈2.30。那卡在0.69是怎么回事?0.69约等于log(2),这说明模型在输出上“犹豫不决”,一直给两类接近各50%的概率。最典型的原因就是没归一化。还有一个可能,是你用了categorical_crossentropy但标签是整数标签,格式不匹配导致训练信号混乱。遇到这种情况优先检查数据预处理和损失函数有没有配对。

显存不足(OOM):如果用的是GPU版本,tensorflow.python.framework.errors_impl.ResourceExhaustedError很可能出现。新手最容易想到的是换显卡,但其实最简单的解决方式是调小batch_size,比如从64改成32甚至16,显存占用立刻降下来。如果你确实需要更大的批次,还有梯度累积这种进阶玩法,不过那是后话。

with shape的报错:Keras的报错信息跟TensorFlow 1.x时代比已经友好太多了,但新手还是怕看。所有shape报错的排查思路就一条:检查你给模型的数据形状是否和模型第一层期望的input_shape匹配。Flatten层期望输入(batch, 28, 28),你如果传入(batch, 784),Flatten无法正确展平,就会报错。做图像任务多打印data.shape是最省事的排错手段。

5.3 不要重复造轮子,也别盲目复制代码

最后一条经验给所有自学的人。我看过太多新手在环境配置上遇到问题,第一反应是自己编译源码解决。对于入门阶段,真的不要这样。TensorFlow是成熟框架,线上有海量现成文档和可运行的例子,遇到问题先搜报错信息、先对比官方示例。我自己的习惯是:任何库用之前先去官网看三分钟“快速开始”,哪怕只复制官方代码跑通一次,也能给自己建立信心。

话说回来,也别看到别人分享的代码就无脑复制。我见过一个杭州某高校的同学复制了大神的数据增强代码,却根本不懂ImageDataGenerator是干什么的,结果模型训练出来的准确率和瞎猜差不多。所以我在上面每一段都强调“知道为什么”,这是别人帮不了你的功课。

6. 延伸建议:入门之后的路往哪走

如果你把上面整个项目亲手跑完了,我对你下一步的建议是三件事。第一,尝试调整模型结构和训练参数——把隐藏层从128改成256或512看看准确率怎么变;尝试不加Dropout,看看会不会过拟合;把learning_rate调成0.01或0.0001,观察loss曲线的变化。这些“实验”能让你真正感受到每个参数的作用,比看一百篇理论文章都实在。

第二,找一个自己感兴趣的小数据集换着跑。你学习Python如果是奔着量化交易去的,就把股市数据的回归预测代码拿来跑一跑;如果你对图像更感兴趣,就找一批自己的图片数据做分类。换数据集的意义是让你从“跟着教程走”变成“独立解决问题”,这个跨越很关键。

第三,看一眼PyTorch的基础代码。当你理解了一个模型在Keras里是怎么搭的,去看PyTorch版本的同一个模型,你会发现很多概念是相通的——无非是把Sequential换成nn.Module,把compile换成手动写训练循环。至于更高阶的Transformer、大模型,它们虽然结构复杂得多,但底层训练逻辑仍然是“数据-模型-损失-优化”这条老路,你有基础后看那些代码就不会觉得是天书了。

在我个人带新手入门的经验里,最典型的失败模式不是学不会,而是卡在环境搭建或某个莫名其妙报错上太久,失去了继续探索的欲望。如果你在实操中碰到我这里没写到的问题,先去搜索报错原文,把完整日志贴出来找答案;如果是版本相关的疑难问题,直接重新建一个干净的conda环境重来一次,往往比在坏环境里反复尝试快得多。深度学习这条路,从跑通第一个模型到理解背后的数学原理,本来就是一个漫长的过程,跑通这一小步已经是巨大的进步。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询