深度学习复现代码常见错误

简介

之前本来想做一个关于自己学习深度学习过程的文章,后来因为大四事比较多,就坚持了一小会,现在我想重操就业,一方面希望自己可以坚持一个有意义的事情,另一方面分享自己的学习经验希望帮助到需要帮助的人。我自己的目前的状态是学习深度学习一年多,django、flask也学习过一段时间也遇到了许多bug,前后python编程三年多,解决问题的有那么一点点长进。目前研一在读(2024/4/1),深知自己在黑暗里摸索的痛苦,自己找bug的痛苦。准备现在开始把自己遇到的bug总结在这里,供大家学习交流,希望这次可以坚持 !!

这是一个分割线
针对如何解决问题,最关键的是找到错误,然后再去解决问题,经常看到的错误是,当出现了一个bug,爆红一大片,然后对于初学者来说是无从下手的。。

先说一下怎么找错吧,总体上是这的,一般先看最后一行,会有一个报错类型,比如(TypeError、ValueError、IndexError)这个是挺关键的比如爆出了类型错误,你就知道可能是需要一个int类型,然后你给出了一个float类型,这时候你再往上翻错误,就会找到具体的出现问题的代码块(就是你写的代码对应的那行,把类型改好就可以了)这个我认为是最重要的环节,找到错误。

其实这时候,你找到了一个错误你知道报错的地方了,而且也找到具体代码块了,这个时候大部分人还是不知道怎么解决,这个时候就需要动手去百度了,一般是直接在比如这个Type Error:******* failed,一般直接把这一块直接复制就会有对应的解决方案,当然直接一次性解决也是不太可能的,可能需要多找几个方案。等到我找到合适的bug,我会演示一下。
比如以下这个bug:
在这里插入图片描述
这里可以看出这个是数据类型错误,最后一行很容易就可以看到,这个由于我是在同一py文件下随手修改的,所以相隔比较近就可以找到对应位置一般是在其他文件下,我记得在YOLOV5时就有这个bug,这个就找到对应的行
在这里插入图片描述
发现是np.int,这个时候一开始是不知道怎么解决的,就需要先去百度直接复制最后一行就ok
在这里插入图片描述

这时候我把重点标出来了,其实这样复制大部分是可以的,但是百度会给你一堆这样的情况,我看了一下第一页都是无法解决问题的。这就导致解决bug的难度大大提高,这时候发现匹配不全可以删除前边一部分
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/011928406908441697fd910a0a570a26.png在这里插入图片描述

删除后只保留重点
现在是我删除一部分,保留了最重点的可以发现解决的途径了,当然我这个例子随手举的,并不完全准确,**这里我是想说的最重要的是找到问题所在,有个很关键的问题就是搜索引擎不能搜索太长的问题,当把一大段复制粘贴就很容易找不到想要的答案!!** # 常见的bug 这里说一下常见的一些bug吧,这只是我个人认为的,因为本人实力有限,所以也不一定对!!! 这个主要是讲深度学习代码bug的,所以我主要按照实现实验来做分类
  • 版本问题(灾难区tensorflow;cuda加速)
  • 数据问题(权重文件 or 数据集)
  • 系统问题(Windows or Linux)
  • 隐形bug(找不到具体位置,深度学习不常见)
  • 代码bug(主要是改模型遇到的bug)
    这是我目前总结的,若有错误,欢迎大家指出
    在这里错误里,个人感觉最让人讨厌的就是隐形bug和版本问题,一个是你找不到错误,另一个是找不到解决方案~其他问题解决起来相对容易,代码bug需要自己有一定的改代码的基础,稍微会点也不是很难。

常见解决途径

  • Chat GPT
  • 百度
  • GitHub
  • 官方文档(不适合大部分人)
    下边是我感觉解决bug的顺序
    1、出现了问题先看Github,下载代码的issues部分可能会出一些解决方案,当然现成的解决方案是最快的也是最准确的
    2、GPT的话最容易的,基本可以解决大部分的bug。但是GPT也会胡言乱语,可能会带来更多的错误。。不过大部分都是可以解决了
    3、百度的话,主要是需要尝试,很考验从垃圾捡金子的能力,一般第一页的是可以解决的,缺点就是浪费时间,但是基本可以解决所有的问题
    4、实在解决不了只能求助官方文档了,基本需要的就是CTRL+A就可以追踪到代码位置,里边会有详细使用方式,然后自己根据断点一点点的改。当然这是一部分,另一个官方文档(线上的)会说明与之前的差距,会告诉你怎么改,但是这里涉及到了版本的问题,要改的地方十分多,我自己也没遇到过几次。一般不会到这一步,真这一步那就需要求助大佬了。。

数据集num_workers错误

这种错误是很常见,但是他不会说出具体的位置,我认为完全是自己的个人经验,一般在作者跑实验时设置的num_workers=!0的因为他们是在Linux下,自己使用Linux的情况比较少,这里推荐Windows用户第一步直接CTRL+F->num_workers=0就好了,具体的解释可以自行百度

    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

在这里插入图片描述

问题大段错误截图
2024/4/3:没想到会有这么多人看,第一次感觉这么开心,那我也会尽自己最大努力更新下去

Tensorboard

写在前边
这个东西是个让我非常伤脑筋的事,只是可视化就会遇到很多问题,先把我目前用的版本放一下

tensorboard                                  2.13.0
tensorboard-data-server                      0.7.0
tensorboard-logger                           0.1.0
tensorboard-plugin-wit                       1.8.1
tensorboardX                                 2.6.2.2
tensorflow                                   2.13.0
tensorflow-estimator                         2.13.0
tensorflow-intel                             2.13.0
tensorflow-io-gcs-filesystem                 0.31.0
tensorflow-probability                       0.21.0

首先,Tensorboard是需要和Tensorflow的版本一致的,这个tensorboardX是pytorch的,可以不用版本一致。
话不多说开始正题

tensorboard --logdir=的问题

在我所用这个版本用=是不会报错的,但是不会显示内容,所以直接(以下是例子)这里路径是直接这样的,但是“=”位置不当也是会报错的 如下所示:
“= ” 报错 :tensorboard: error: invalid choice: ‘H:\Desktop\flower_classification_experiment2’ (choose from ‘serve’, ‘dev’)
在这里插入图片描述

会有这样的一个错误No dashboards are active for the current data set导致任何数据显示不全.如下所示:
在这里插入图片描述

正确做法如下

(pytorch) H:\>tensorboard --logdir H:\Desktop\flower_classification_experiment2

目录如下所示:
在这里插入图片描述

端口占用bug

端口被占用出现下列错误

(base) H:\>tensorboard --logdir H:\Desktop\flower_classification_experiment2
2024-04-03 19:07:38.447394: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
2024-04-03 19:07:40.061305: I tensorflow/core/util/port.cc:113] oneDNN custom operations are on. You may see slightly different numerical results due to floating-point round-off errors from different computation orders. To turn them off, set the environment variable `TF_ENABLE_ONEDNN_OPTS=0`.
E0403 19:07:43.698683 58852 application.py:125] Failed to load plugin WhatIfToolPluginLoader.load; ignoring it.
Traceback (most recent call last):
  File "E:\anaconda\lib\site-packages\tensorboard\backend\application.py", line 123, in TensorBoardWSGIApp
    plugin = loader.load(context)
  File "E:\anaconda\lib\site-packages\tensorboard_plugin_wit\wit_plugin_loader.py", line 57, in load
    from tensorboard_plugin_wit.wit_plugin import WhatIfToolPlugin
  File "E:\anaconda\lib\site-packages\tensorboard_plugin_wit\wit_plugin.py", line 40, in <module>
    from tensorboard_plugin_wit._utils import common_utils
  File "E:\anaconda\lib\site-packages\tensorboard_plugin_wit\_utils\common_utils.py", line 17, in <module>
    from tensorboard_plugin_wit._vendor.tensorflow_serving.apis import classification_pb2
  File "E:\anaconda\lib\site-packages\tensorboard_plugin_wit\_vendor\tensorflow_serving\apis\classification_pb2.py", line 15, in <module>
    from tensorboard_plugin_wit._vendor.tensorflow_serving.apis import input_pb2 as tensorflow__serving_dot_apis_dot_input__pb2
  File "E:\anaconda\lib\site-packages\tensorboard_plugin_wit\_vendor\tensorflow_serving\apis\input_pb2.py", line 37, in <module>
    _descriptor.FieldDescriptor(
  File "E:\anaconda\lib\site-packages\google\protobuf\descriptor.py", line 561, in __new__
    _message.Message._CheckCalledFromGeneratedFile()
TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
 1. Downgrade the protobuf package to 3.20.x or lower.
 2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).

默认是6006,只需要--port=6007

tensorboard --logdir H:\Desktop\flower_classification_experiment2 --port=6007

或者关闭那个进程,关闭进程不推荐,可能引发其他问题,推荐直接换一个端口。

关于CUDA out of Memory

最常见的一个bug就是爆显存了,这时候仅需要调整batch size就可以了,比如以下的错误

 File "/home/liu/anaconda3/envs/python10/lib/python3.10/site-packages/mamba_ssm/ops/selective_scan_interface.py", line 182, in forward
    delta = rearrange(delta_proj_weight @ x_dbl[:, :delta_rank].t(), "d (b l) -> b d l", l = L)
torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 138.00 MiB. GPU 0 has a total capacty of 6.00 GiB of which 0 bytes is free. Including non-PyTorch memory, this process has 17179869184.00 GiB memory in use. Of the allocated memory 20.09 GiB is allocated by PyTorch, and 179.72 MiB is reserved by PyTorch but unallocated. If reserved but unallocated memory is large try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF

这样明显就算显存不够用了,这样仅仅调小batch size就可以,还有一个是在读取data时候有个参数 pin_memory=True,

RuntimeError: CUDA error: out of memory
CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.

当出现这个问题时可以考虑将这个True改为False

<think>好的,我现在需要帮用户解决关于TensorFlow出现的oneDNN自定义操作警告,特别是浮点数舍入错误的问题。用户提到了TF_ENABLE_ONEDN环境变量,可能是指TF_ENABLE_ONEDNN_OPTS。首先,我需要确认这些警告的具体原因。 首先,oneDNN是Intel的深度神经网络库,TensorFlow用它来优化性能。当启用oneDNN优化后,可能会出现浮点运算精度差异的警告,这是因为不同的计算库可能在浮点运算的实现上有细微差别,导致结果略有不同。这通常在训练或推理过程中出现,尤其是使用较新版本的TensorFlow时。 接下来,用户提到的环境变量可能拼写有误,正确的应该是TF_ENABLE_ONEDNN_OPTS。这个变量控制是否启用oneDNN的自定义操作。默认情况下,TensorFlow可能已经启用了这些优化,所以用户需要了解如何调整这个设置。 解决方法方面,首先可以尝试禁用这些优化,通过设置环境变量TF_ENABLE_ONEDNN_OPTS=0。这可能会消除警告,但可能会影响性能。另外,用户需要检查TensorFlow的版本,确保使用的是官方支持的版本,并且与oneDNN兼容。如果问题依然存在,可能需要忽略警告,或者联系Intel或TensorFlow团队寻求帮助。 另外,用户可能需要考虑更新或降级TensorFlow版本,查看是否有已知的问题或修。同时,检查代码中是否有特定操作触发了这些警告,可能需要调整模型结构或使用不同的操作。 生成相关问题的时候,需要考虑用户可能的后续疑问,比如如何平衡性能与精度,其他环境变量的作用,如何验证精度差异的影响,以及如何反馈问题给开发团队。这些问题可以帮助用户更全面地理解和解决问题。</think>### TensorFlow oneDNN自定义操作警告与浮点舍入误差的解决方法 当使用TensorFlow时,如果出现类似`oneDNN custom operations are floating point rounding errors`的警告,通常与Intel的深度神经网络库(oneDNN)优化相关。以下是逐步解决方案: --- #### **1. 理解警告原因** - **oneDNN优化特性**:Intel oneDNN库通过低精度计算(如FP16/BF16)加速运算,但可能导致浮点运算结果与标准TensorFlow运算存在微小差异[^1]。 - **精度容忍度**:某些场景(如数值敏感型模型)会因精度差异触发警告,但大多数情况下不影响模型整体表现。 --- #### **2. 禁用oneDNN优化(临时方案)** 通过环境变量`TF_ENABLE_ONEDNN_OPTS`控制oneDNN优化: ```bash # Linux/macOS export TF_ENABLE_ONEDNN_OPTS=0 # Windows命令行 set TF_ENABLE_ONEDNN_OPTS=0 # Windows PowerShell $env:TF_ENABLE_ONEDNN_OPTS=0 ``` 此操作会禁用oneDNN优化,可能降低计算速度但消除警告。 --- #### **3. 检查TensorFlow版本兼容性** - 使用**官方编译版本**:确保TensorFlow版本与oneDNN兼容(推荐2.5+)。 - 升级/降级版本: ```bash pip install tensorflow==2.13.0 # 指定版本 ``` --- #### **4. 忽略警告(非敏感任务)** 若精度差异可接受,可通过代码过滤警告: ```python import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 仅显示ERROR日志 import tensorflow as tf ``` --- #### **5. 反馈与调试** - 提交问题至[TensorFlow GitHub Issues](https://github.com/tensorflow/tensorflow/issues),附警告日志和复现代码。 - 使用调试模式定位具体操作: ```bash TF_CPP_MIN_VLOG_LEVEL=1 python your_script.py ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值