已解决:Strict Standards: Non-static method cls_image::gd_version() should not be called statically in.....

本文详细介绍了在使用PHP5.4及以上版本安装Ecshop时遇到的兼容性问题,并提供了具体的解决方案,包括修改代码使其支持静态方法调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在安装Ecshop的时候,遇到两个⚠️问题:

Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /install/includes/lib_installer.php on line 31
Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /install/includes/lib_installer.php on line 31

原因:
PHP升级到5.4X以后的兼容性语法问题

解决:
找到install/includes/lib_installer.php中的第31行 return cls_image::gd_version(); 然后在找到include/cls_image.php中的678行,发现gd_version()方法未声明静态static,所以会出错。这时候只要:   

1)将function gd_version()改成static function gd_version()即可。
2)或者将install/includes/lib_installer.php中的第31行return cls_image::gd_version();改成:
$p = new cls_image();
return $p->gd_version();

  http://www.cnblogs.com/thinksasa/archive/2013/03/12/2955922.html

http://www.zoneself.org/2014/08/04/content_2691.html

https://cn.bing.com/search?q=Strict+Standards%3A+Non-static+method+cls_image%3A%3Agd_version%28%29+should+not+be+called+statically+in&qs=n&form=QBLH&sp=-1&pq=strict+standards%3A+non-static+method+cls_image%3A%3Agd_version%28%29+should+not+be+called+statically+in&sc=0-0&sk=&cvid=9104382167244E548249B952C20EEA6B

转载于:https://www.cnblogs.com/Beyron/p/6209777.html

<think>嗯,用户遇到了加载BiRefNet模型时出现的错误,具体是“Value not in list”,也就是模型文件未找到或不在预期列表中。我需要帮他解决这个问题。首先,我应该回忆一下PyTorch加载模型的基本流程和相关错误处理。根据用户提供的引用,PyTorch保存和加载模型权重的方法可能涉及到模型结构的匹配问题。 首先,可能的原因是模型文件路径不正确。用户可能输入的路径有误,或者文件名拼写错误。这时候需要检查路径是否正确,绝对路径和相对路径的使用是否正确。比如,如果脚本和模型文件不在同一目录,使用相对路径可能导致找不到文件。此外,文件扩展名是否正确,比如是否写成了.pth还是其他格式。 其次,如果路径正确,但加载时出现键不匹配的问题,可能是因为模型保存时和加载时的结构不一致。例如,用户可能保存了模型的state_dict,但在加载时没有先实例化模型对象,或者模型类的定义发生了变化。这时候需要确保加载模型时,模型的结构和保存时的结构完全一致,包括类的定义和参数名称。 另外,用户可能使用了多GPU训练保存的模型,而加载时没有正确处理“module.”前缀。比如,保存时模型是在DataParallel中,而加载时没有使用,导致键名不一致。这时候可以使用torch.load的map_location参数,或者在加载state_dict时去掉前缀。 还有可能是PyTorch版本的问题。不同版本的PyTorch可能在保存和加载模型时有兼容性问题。用户需要确认保存和加载时使用的PyTorch版本是否一致,或者尝试升级/降级版本。 可能的解决步骤包括:检查文件路径和权限,确认模型结构匹配,处理多GPU保存的键名,检查PyTorch版本,尝试加载整个模型而不仅仅是state_dict,以及打印state_dict的键来对比差异。 需要提醒用户逐步排查这些可能性,比如先验证文件是否存在,再检查模型定义是否一致,处理键名前缀,版本兼容性等。同时,建议用户在加载时使用严格模式为False,但要注意这可能导致参数不匹配影响模型性能。 此外,用户可能需要检查文件是否损坏,使用MD5校验。还有环境配置是否正确,比如CUDA版本是否匹配,是否需要在CPU上加载等。 总结起来,解决步骤应该是:1.检查文件路径和权限;2.确认模型结构匹配;3.处理多GPU前缀;4.检查PyTorch版本;5.尝试加载整个模型;6.打印键名对比差异。同时注意异常处理和可能的文件损坏情况。</think>针对加载BiRefNet模型时出现的"Value not in list"错误,请按照以下步骤排查和解决: ### 1. 验证文件路径有效性 - **检查路径拼写**:确认路径中的大小写和特殊字符(如空格、中文路径) ```python import os print(os.path.exists("BiRefNet-general-epoch_244.pth")) # 应返回True ``` - **使用绝对路径**:尝试`/home/user/models/BiRefNet-general-epoch_244.pth`格式 - **检查文件权限**:`os.access("path/to/file", os.R_OK)`验证读取权限 ### 2. 模型结构匹配验证 ```python # 加载前必须实例化相同结构的模型 from BiRefNet import BiRefNet # 假设模型定义在这个模块 model = BiRefNet() # 加载时指定map_location参数 checkpoint = torch.load("path/to/model.pth", map_location=torch.device('cpu')) model.load_state_dict(checkpoint) ``` ### 3. 处理多GPU训练保存的键名 ```python # 移除module.前缀(如果是多GPU训练保存的) state_dict = torch.load("model.pth") new_state_dict = {k.replace("module.", ""): v for k, v in state_dict.items()} model.load_state_dict(new_state_dict) ``` ### 4. 版本兼容性检查 ```python # 查看保存时的环境信息 checkpoint = torch.load("model.pth", map_location='cpu') print(checkpoint['torch_version']) # 应显示保存时使用的PyTorch版本 # 当前环境版本验证 import torch print(torch.__version__) # 应与保存环境一致 ``` ### 5. 完整模型加载方法 ```python # 直接加载整个模型(需要模型类已定义) model = torch.load("path/to/model.pth", map_location=torch.device('cpu')) model.eval() ``` ### 6. 键名对比调试 ```python # 打印模型期望的键 print(model.state_dict().keys()) # 打印检查点中的键 checkpoint = torch.load("model.pth", map_location='cpu') print(checkpoint.keys()) # 寻找差异键 model_keys = set(model.state_dict().keys()) checkpoint_keys = set(checkpoint.keys()) print("Missing keys:", model_keys - checkpoint_keys) print("Unexpected keys:", checkpoint_keys - model_keys) ``` ### 异常处理建议 ```python try: model.load_state_dict(checkpoint) except KeyError as e: print(f"Key error: {str(e)}") # 自动修复常见前缀差异 from collections import OrderedDict new_checkpoint = OrderedDict() for k, v in checkpoint.items(): name = k[7:] if k.startswith('module.') else k new_checkpoint[name] = v model.load_state_dict(new_checkpoint) ``` ### 其他注意事项 1. **文件完整性检查**:使用`md5sum BiRefNet-general-epoch_244.pth`验证文件哈希值 2. **CUDA版本兼容**:确认保存/加载时使用的CUDA版本一致 3. **自定义层处理**:检查模型是否包含自定义实现的网络层 如果仍然报错,建议使用`torch.load(..., strict=False)`暂时忽略不匹配参数,但需注意: $$ \text{准确率} = f(\theta_{matched}) + \epsilon(\theta_{missing}) $$ 其中$\theta_{matched}$表示匹配的参数,$\epsilon$表示未加载参数的影响[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值