ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

MoSE4MKGC代码运行

MoSE4MKGC代码运行 1.代码链接https://github.com/OreOZhao/MoSE4MKGC方法1使用cd ..最常用bashcd ..这会带你到当前目录的上一级目录。方法2退回到多级上级目录比如要退回到1级上级目录cd ..2级上级目录cd ../..3级上级目录cd ../../..根据你的路径从当前位置cd ..→ 到src_datacd ../..→ 到Baselinecd ../../..→ 到MaWentingcd ../../../..→ 到Zhaoshuyua3.learn阶段很重要的模型解释与参数说明根据数据集特点选择参数命令写法https://chat.deepseek.com/share/93nldtcnxfyd8jclxa最好用ComplExMDR方法要不然下一阶段集成学习会受限制cd /data/ZhaoShuyuan/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/srcCUDA_VISIBLE_DEVICES1 python learn.py \--model ComplExMDR \--dataset Wiki \--modality_split False \--fusion_img False \--fusion_dscp False \--max_epochs 104.验证阶段boosting_inference.py集成学习3方法解释命令https://chat.deepseek.com/share/ilw6332k4chdrmilbx5.用wiki数据跑图像特征1. 新代码 vs 原版代码区别在哪里改动并没有改变“核心算法”或“配置”而是修复了让代码跑不起来的工程 Bug。你可以放心地用它它生成的.pickle文件与原版要求的格式是完全一致的。特性原版代码 (img_encoder.py)修复版代码 (img_fixed_encoder.py)影响文件读取逻辑Bug: 假设图片是扁平的或者逻辑混乱无法进入子文件夹。Fix: 自动识别是文件夹还是文件能进入Wiki/实体名/目录下找图片。关键能读到图片了。ID文件解析Bug: 用空格切割 (split())遇到带空格的实体名如dead ringers (1988)直接崩。Fix: 强制用 Tab 切割 (split(\t))。关键程序不会半路崩溃。字典匹配 KeyBug: 存的是文件路径取的时候用实体名。导致匹配率为 0。Fix: 存的时候清洗出实体名。关键能正确匹配上图片和 ID。模型配置ViT-B/16 (ImageNet-1k)ViT-B/16 (ImageNet-1k)无区别保持原味。输出维度1000 维1000 维无区别保持原味。结论新代码生成的img_feature.pickle是原版代码“梦寐以求”想要生成但没生成出来的那个文件。你完全尊重了源代码的配置。2. 如何解读你的运行结果让我们逐行分析你的日志找到 10779 个实体文件夹说明你的img_data/Wiki目录下确实有 10779 个文件夹。提取完成共获得 10101 个实体的图片特征这意味着有678个文件夹可能是空的或者里面的图片全损坏了。这很正常Wiki 数据集经常有坏图。代码自动跳过了它们没有报错崩溃非常棒。特征维度检测为: 1000这点很重要。这意味着模型输出的是 ImageNet 的1000 类分类概率向量而不是 768 维的隐藏层特征。虽然从深度学习角度看 768 维特征可能更好但原版代码设计就是 1000 维。为了“尊重源代码配置”我们保持这个 1000 维是对的。MoSE 的models.py里肯定有对应的全连接层把 1000 维映射过去。对齐完成覆盖率 10023/10768这是最核心的指标。Wiki 的知识图谱ent_id里一共有10,768个实体。我们成功匹配到了10,023张图片覆盖率93%。剩下的745个实体10768 - 10023代码已经自动用随机噪声np.random.normal填充了。3. 下一步做什么既然你已经有了结构数据DuEE,Wiki,GDELT的结构.pickle由之前的脚本生成。图片数据Wiki 的img_feature.pickle刚刚生成成功的。文本数据(如果没有ent_dscp.txt就暂时用随机生成的dscp_vec.pickle或者关掉文本融合)。你现在可以正式开始跑 Wiki 的多模态训练了运行命令建议WikiBashcd src # 运行 Wiki 数据集 # --dataset Wiki: 指定数据集 # --fusion_img True: 开启图片融合 (因为你刚辛苦生成了图片特征) # --fusion_dscp False: 暂时关闭文本 (除非你也有文本特征否则设为False或用假特征) # --img_info ../data/Wiki/img_feature.pickle: 指定你刚生成的图片特征路径(注意如果你在之前的步骤里生成了假的dscp_vec.pickle你也可以把--fusion_dscp设为True并指向那个文件但图片特征一定要用刚生成的这个真家伙)python learn.py --dataset Wiki --model ComplExMDR --modality_split True --fusion_img True --fusion_dscp False --img_info ../data/Wiki/img_feature.pickle正确运行的命令 结构图像python learn.py --dataset GDELT --model ComplExMDR --modality_split True --fusion_img True --fusion_dscp True --img_info ../data/Wiki/img_feature.pickle--dscp_info ../data/Wiki/text_feature.pickle (正确运行的命令 结构图像文本出现显卡内存不足换显卡# 或者使用 GPU 2 CUDA_VISIBLE_DEVICES2 python learn.py --dataset GDELT问题图像实体下有的没有对应的照片---》随机向量填充。见 img_fixed_encoder.py文字编码源代码有逻辑漏洞修改见text_encoder_robust.py匹配不上的在随机向量填充数据集json中提取描述生成dscp,出现的问题根本原因GDELT 数据集的 JSON 格式和 Wiki 数据集的 JSON 格式完全不同但你用处理 Wiki 的代码去硬套 GDELT导致所有数据都被判定为“格式错误”并跳过了。我们来看一下真相Wiki 的格式 (信息全在 Value 里)Key:ID...(没用)Value:头实体 \t 关系 \t 尾实体 \t 时间 \t 描述文本你的代码逻辑parts value.split(\t)长度 5所以能跑通。GDELT 的格式 (信息藏在 Key 里)Key:头实体 \t 关系 \t 尾实体 \t 时间Value:新闻原文句子(比如 The alliance filed suit...)你的代码逻辑parts value.split(\t)。结果因为 Value 只是一个纯句子没有 Tab 分隔len(parts)等于 1。致命一击代码里的if len(parts) 5: continue直接把这条数据扔了。60万条数据全被你扔了所以最后是 0。DuEE 的数据结构确实又不一样了它有一个显著的特点描述Value可能是字符串也可能是字符串列表List。1. DuEE 数据结构分析我们来看你提供的这两条典型数据情况 AValue 是字符串JSON公安人员\t拘捕\t社会大众\t2019-10-28: 央视网消息近日云南省红河州...这很简单直接取 Value 作为描述即可。情况 BValue 是列表JSON中国政府人员\t死亡\t北京\t2019-10-28: [ 2019年10月28日23时许..., 公安部宣传局官方微博消息... ]这里 Value 是一个包含多条新闻的列表。策略我们需要把这个列表里的字符串拼接起来或者取第一条作为该实体的上下文描述。拼接通常更好因为信息量大。2. 解决方案DuEE 专用提取脚本针对 DuEE 的这些特点Key 藏实体Value 有列表我为你编写了专用的generate_duee_text.py。脚本逻辑解析 Key按\t切分第 0 个是头实体第 2 个是尾实体。请在src目录下新建generate_duee_text.py处理 Value如果是list用空格把它们连成一个长字符串。如果是str直接使用。清洗去掉换行符和 Tab。去重保留该实体对应的最长那一文本作为描述。4.MOse效果1.AI平均融合。python boosting_inference.py --model_path ../ckpt/1/m-20260318_1418-n-None.pth --dataset DuEE --boosting False(EMOE) ZhaoShuyuansugon-X640-G40:~/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/src$ python boosting_inference.py --model_path ../ckpt/1/m-20260318_1418-n-None.pth --data set DuEE --boosting False running setting args: Namespace(datasetDuEE, model_path../ckpt/1/m-20260318_1418-n-None.pth, boostingFalse) ../ckpt/1/m-20260318_1418-n-None.pth 100%|█████████████████████████████████████████| 148/148 [00:0300:00, 45.44it/s] 100%|████████████████████████████████████████| 148/148 [00:0000:00, 152.63it/s] 100%|███████████████████████████████████████| 240/240 [00:0000:00, 1043.57it/s] 100%|████████████████████████████████████████| 240/240 [00:0000:00, 385.71it/s] rhs 100%|████████████████████████████████████████| 240/240 [00:0000:00, 499.53it/s] lhs 100%|███████████████████████████████████████| 240/240 [00:0000:00, 1905.99it/s] {rhs: 6.987500190734863, lhs: 7.691666603088379} {rhs: 0.7790718674659729, lhs: 0.7710148692131042} {rhs: tensor([0.7333, 0.7875, 0.8750]), lhs: tensor([0.7292, 0.7792, 0.8583])} {MR: 7.339583396911621, MRR: 0.7750433683395386, hits[1,3,10]: [0.7312500476837158, 0.7833333015441895, 0.8666666746139526]} done (EMOE) ZhaoShuyuansugon-X640-G40:~/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/src$2.BI:增强推理。python boosting_inference.py --model_path ../ckpt/1/m-20260318_1418-n-None.pth --dataset DuEE --boosting True(EMOE) ZhaoShuyuansugon-X640-G40:~/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/src$ python boosting_inference.py --model_path ../ckpt/1/m-20260318_1418-n-None.pth --dataset DuEE --boosting True running setting args: Namespace(datasetDuEE, model_path../ckpt/1/m-20260318_1418-n-None.pth, boostingTrue) ../ckpt/1/m-20260318_1418-n-None.pth 100%|█████████████████████████████████████████| 148/148 [00:0300:00, 39.63it/s] 100%|███████████████████████████████████████| 148/148 [00:0000:00, 4561.40it/s] 100%|████████████████████████████████████████| 240/240 [00:0000:00, 688.78it/s] 100%|████████████████████████████████████████| 240/240 [00:0000:00, 241.47it/s] rhs 100%|██████████████████████████████████████████| 41/41 [00:0000:00, 419.89it/s] 100%|██████████████████████████████████████████| 41/41 [00:0000:00, 297.16it/s] 100%|███████████████████████████████████████| 240/240 [00:0000:00, 1803.53it/s] lhs 100%|███████████████████████████████████████████| 41/41 [00:0000:00, 86.58it/s] 100%|███████████████████████████████████████████| 41/41 [00:0000:00, 86.36it/s] 100%|███████████████████████████████████████| 240/240 [00:0000:00, 7664.33it/s] {rhs: 7.008333206176758, lhs: 7.391666889190674} {rhs: 0.7806851267814636, lhs: 0.7803593277931213} {rhs: tensor([0.7292, 0.8000, 0.8792]), lhs: tensor([0.7417, 0.7875, 0.8667])} {MR: 7.200000047683716, MRR: 0.7805222272872925, hits[1,3,10]: [0.7354166507720947, 0.7937500476837158, 0.8729166984558105]} done (EMOE) ZhaoShuyuansugon-X640-G40:~/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/src$3.MI元学习推理python meta_learner.py --model_path ../ckpt/1/m-20260318_1418-n-None.pth --dataset DuEETEST: {MR: 11.662499904632568, MRR: 0.7771585881710052, hits[1,3,10]: [0.7291666865348816, 0.800000011920929, 0.8729166984558105]} 19 train loss: 100%|██████████████████| 148/148 [00:0000:00, 47480.27ex/s, loss2] train loss: 100%|██████████████████| 148/148 [00:0000:00, 56090.81ex/s, loss2] 100%|███████████████████████████████████████| 240/240 [00:0000:00, 1789.11it/s] 100%|███████████████████████████████████████| 240/240 [00:0000:00, 1820.84it/s] TEST: {MR: 11.695833206176758, MRR: 0.7771010994911194, hits[1,3,10]: [0.7291666865348816, 0.800000011920929, 0.875]} done (EMOE) ZhaoShuyuansugon-X640-G40:~/Zhaoshuyuan/MaWenting/Baseline/MoSE4MKGC/src$5.Mose跑Wiki数据集1.Wiki数据集问题没有 NaN这是一个好消息排除了原始数据损坏导致报错的可能性。数值范围Range图像特征范围在[-4.9, 17.0]之间。文本特征范围在[-10.7, 1.8]之间。关键问题两个模态的特征分布不一致且最大值偏大。 在深度学习中未经归一化的特征尤其是最大值达到 17在经过ComplExMDR里的矩阵乘法self.img_vec.mm(self.img_post_mats)时数值会迅速放大。如果post_mats初始化得不够小第一轮迭代产生的梯度就会非常巨大导致你看到的 Loss 从 28 猛降到 15 然后直接溢出变成NaN。2.解决1. 修改models.py实现自动归一化请打开models.py找到class ComplExMDR的__init__构造函数。在加载img_vec和dscp_vec的地方大约在 230 行和 240 行附近添加以下代码2.AI代码python boosting_inference.py --model_path ../ckpt/Wiki/0/m-20260319_1152-n-None.pth --dataset Wiki --boosting Falsepython meta_learner.py --model_path ../ckpt/Wiki/0/m-20260319_1152-n-None.pth --dataset Wiki
返回列表