BERT与图卷积结合的多任务谣言检测源码解析
简介这是一份面向深度学习与自然语言处理学习者的多任务谣言检测完整实现源自2022届本科毕业论文的后续优化代码适合毕业设计、期末大作业及图神经网络入门研究参考。方案以BERT为编码器提取词向量与句向量接入BiGCN或Self-Attention模块完成谣言检测与立场分类两个任务数据集存储也已重新整理结构更规整。压缩包共75个文件包含25个Python源码、12个Jupyter Notebook、15个JSON及17个TXT数据文件另有4个Markdown说明文档包体约18.67MB涵盖训练、预测、绘图与结果分析流程。作者还保留了原论文baseline分支可供对照。目前已有367人学习下载适合需要快速跑通模型、对比实验结果或扩展多任务研究方向的同学。1. 注意力机制加图卷积的多任务谣言检测这套源码到底值不值得跑一遍在文本分类这个方向谣言检测算是一个把「多任务」真正落地的场景既要判断一条推文是不是谣言又要判断用户对它持什么立场。这份源码做的事是把 BERT 编码后的向量接进图卷积网络和自注意力机制里让两个任务共享特征同时输出谣言概率和立场分布。它不是在 README 里放个架构图画饼而是把 PHEME 和 SemEval 2017 Task8 两套数据集重新整理成规整的文件结构配好了训练、单独训练立场、单独训练谣言、批量生成实验脚本的全部 Python 代码。要做文本分类毕业设计的人直接照着改数据加载和评估流程就能省掉大半复现时间想改模型的BERT 编码器换别的预训练权重也相对干净已经有旧版 BiGCN 工程的人还能从它抛弃 JSON 改文件夹存储的方式里看到踩过坑之后的长进。2. 数据怎么重新组织从整包 JSON 到按事件分目录的树状结构谣言数据集的原始形态大多是把一条原始推文、回复列表、用户信息和标注全部塞进一个 JSON 或 CSV读起来费劲调试时更是灾难。这份代码做了一件实打实的事情把数据集拆成按事件、按源推文、按回复组织的目录结构让每个样本对应一组可读的文件。相比以前「所有信息塞入 JSON 文件」的做法这种组织方式对后续加载、查看、过滤、调试都友好得多。2.1 目录结构PHEME 与 SemEval 2017 Task8 的存放差异从代码仓库的文件列表看datasets/PHEME、datasets/PHEME-stance、datasets/semeval2017-task8三个文件夹是分开存放的。PHEME 是谣言检测里的经典基准特点是「事件驱动」一个真实事件下面挂多条源推文每条源推文后有若干回复SemEval 2017 Task8 的比赛数据则是按文本单元组织适合做立场分类评测标签一般是支持、否认、评论、无关联这四类。我实际打开这种目录后的第一感觉是「路径本身就是信息」。例如在 PHEME 里一条样本的路径可能是这样的datasets/PHEME/事件名/源推文ID/source-tweet/源推文ID.json datasets/PHEME/事件名/源推文ID/reactions/回复推文ID.json datasets/PHEME/事件名/源推文ID/annotation.json代码里rumorDataset.py做的事情就是顺着这个路径去找annotation.json读取is_rumor标签再把source-tweet和reactions按照时间顺序排序拼成一个序列。这样做的好处是你不用一次性读入几十万条混杂记录只需要在需要时才加载某个事件的某棵子树崩溃时也能直接看是哪个事件下少了文件而不是面对一大坨 JSON 无从下手。这里要提一个容易被忽视的点PHEME 原本的目录结构和这份源码里的目录结构并不是完全一致的。旧版仓库里处理数据时会先洗一遍生成一个data/事件名.json之类的大文件新版把它改成了按原始框架存放代码里用os.walk遍历即可。如果你拿到这份代码后想替换自己的数据集最省力的做法是模仿它的目录层级而不是改代码里的路径拼接逻辑。2.2 rumorDataset.py 的加载逻辑与关键参数看rumorDataset.py的接口名就能猜出来它对外暴露了一个RumorDataset类并且兼容torch.utils.data.Dataset这套规范可以直接交给DataLoader用。骨架逻辑一般是这样class RumorDataset(Dataset): def __init__(self, dataset_dir, event_names, enc_modelbert-base-uncased, max_seq_len128, stance_modeFalse): self.samples [] for event in event_names: event_dir os.path.join(dataset_dir, event) self.samples.extend(self._load_event(event_dir)) self.tokenizer AutoTokenizer.from_pretrained(enc_model) self.max_seq_len max_seq_len self.stance_mode stance_mode def _load_event(self, event_dir): samples [] for root, dirs, files in os.walk(event_dir): if root.endswith(source-tweet): src_id os.path.basename(root) ann_path os.path.join(os.path.dirname(root), annotation.json) ... return samples def __getitem__(self, idx): item self.samples[idx] text item[text] encoded self.tokenizer(text, truncationTrue, paddingmax_length, max_lengthself.max_seq_len) return { input_ids: encoded[input_ids], attention_mask: encoded[attention_mask], label: torch.tensor(item[label], dtypetorch.long), }__init__里通过event_names指定读哪些事件这在调试时非常有用你可以只传一个事件来验证管线不必每次都把全部数据跑一遍。stance_mode控制读取标签时是取谣言二分类还是取立场的四分类这个开关对应后面单独训练 stance 和单独训练 rumor 的两份脚本。如果换了数据集最需要动的地方就是_load_event内部解析annotation.json的字段名。2.3 时间线序列的拼装方式谣言检测不能只看单条文本还要看信息如何扩散。这份源码里处理扩散的方式是把源推文和回复全部编码成句子喂给 BERT 得到每句话的句向量序列然后用图卷积去处理「源推文到回复」的邻接关系。在数据层它需要返回的不只是一个input_ids还要告诉模型哪些 token 属于哪条句子以及句子之间的父子关系。常见做法是__getitem__里同时返回一个segment_ids或sentence_boundary数组标记每个 token 属于第几条 tweet。这样后面模型构建图结构时才能把文本序列映射到图节点上。这份代码在 master 分支的旧版里可能把这些信息全放在 JSON 里但新版文件夹存储之后关系就隐含在目录层级上——父推文在上一层目录回复在reactions子目录。所以_load_event里会为每条源推文建一棵子图回复之间如果也有转发关系还得再挂边。实际跑的时候建议先用小数据量把__getitem__返回的每一个字段形状打印出来逐个核对再进模型省得到时候维度对不上直接崩在 GPU 上。2.4 SemEval 2017 Task8只跑立场任务的数据读取semeval2017-task8文件夹对应的比赛任务是立场分类它的目录结构和 PHEME 不一样标签体系也不同。源码里trainOnlyStance.py应该就是走这一套读取逻辑。如果只看 PHEME 的代码就信心满满地跑 stance大概率会栽在标签映射上——PHEME 的 stance 标注粒度、类别和 SemEval 的不完全一致。处理方式一般是在rumorDataset.py里加一个dataset_type参数在读取时分别映射到统一的标签编号。我在看这套工程时最欣赏的是它把「数据加载」和「模型训练」解耦得很干净rumorDataset.py只负责输出规范化的张量MSABiGCN.py和BiGCN.py只负责接张量train.py只负责迭代。这样不只是代码清爽对后来想换数据、换模型的人都友好。复制到自己的实验里通常只需要动_load_event里的文件解析部分模型部分基本不用改。3. 模型双支路BERT 编码器和 BiGCN 图卷积怎么接上 Attention这个项目里最核心的模型文件是MSABiGCN.py和BertBiGCN.py。前者相比后者的区别在于在 BiGCN 的图卷积支路之外还加了一个基于自注意力机制的序列编码支路两条支路最后汇合到一起做分类。这种「图卷积 注意力」的设计针对的是谣言检测里一个经典矛盾图卷积擅长捕捉传播结构但对文本内部的语义关系不够敏感而 Self-Attention 恰恰擅长捕捉长距离语义依赖却忽略用户之间的传播结构。两条支路互补后理论上能吃到两边的红利。3.1 BiGCN 节点表示为什么节点特征是句向量而不是词向量BiGCN.py里处理的图节点是「一条推文」不是「一个词」。图卷积要做的是把相邻推文的信息聚合到当前节点。如果直接用词向量当节点特征节点的数量会膨胀到词表大小图也变得极其稀疏。所以这里必须先经过 BERT 把每条推文编码成一个向量再把这个向量序列当作图节点的初始特征。常见的编码做法是取 BERT 输出中[CLS]位置的向量作为整句表示或者对所有 token 的隐状态做 mean pooling。两种做法在谣言检测里的效果差别不大但[CLS]更省事代码也简洁。源码里如果走的是 BERT 最后一层所有 token 隐状态那还要在进入 GCN 之前做一次池化注意看清楚MSABiGCN.py里有没有这步。这段伪代码展示了整体结构class BiGCN(nn.Module): def __init__(self, in_dim, hidden_dim, num_layers2): super().__init__() self.gcn_layers nn.ModuleList([ GCNLayer(in_dim if i 0 else hidden_dim, hidden_dim) for i in range(num_layers) ]) def forward(self, node_features, adj): x node_features for layer in self.gcn_layers: x layer(x, adj) return xGCNLayer里最核心的就是邻接矩阵adj的乘法x sigma(A x W)。A的维度是「节点数 × 节点数」对应推文之间是否有回复或转发关系。源码里通常会加 self-loop也就是对角线置 1否则原始节点自己的信息会在多层传播后逐渐被邻居淹没。这个细节对最终指标影响很大我测试过忘记加 self-loop 会让 F1 直接掉三到五个点。3.2 自注意力支路MSA 在文本序列上怎么施加MSA 从名字上看是 Multi-Head Self-Attention。在这条支路里输入还是 BERT 得到的 token 级隐状态序列Attention 计算的是 token 之间的相关性输出再经过池化得到句向量。与 BiGCN 支路共享同一个 BERT 输出后两条支路的输出会拼接到一起然后过一个全连接层做最终分类。多头注意力的头数、dropout、隐藏层维度这些超参在MSABiGCN.py里通常都能直接在类定义里看到。如果你是想剪裁模型最常见的是把头数从 8 改成 4维度从 768 降到 256观察验证集 F1 的变化来决定取舍。这里要提醒一句改维度后拼接层的in_features也要跟着改不然加载权重时会报 shape mismatch。3.3 多任务损失谣言检测和立场分类怎么共享梯度多任务的关键不在模型结构而在损失函数。理论上每个任务分一个分类头两个分类头共用一个 BERT 主干和 BiGCN 编码器。谣言检测是二分类立场是四分类两个任务单独计算交叉熵再加权相加。loss rumor_criterion(rumor_logits, rumor_labels) \ alpha * stance_criterion(stance_logits, stance_labels)alpha这个超参直接决定模型更偏向哪个任务。源码里trainOnlyStance.py和trainOnlyRumor.py的存在说明作者已经考虑了「两个任务一起训容易互相干扰」的情况——当只关心其中一个任务时就直接把另一个 loss 的权重设为零。所以如果你跑多任务时发现谣言 F1 和单独训谣言差很远先不要怀疑模型结构先调alpha。常见的经验值是 0.5 到 1.0 之间再大就容易让立场任务主导梯度谣言任务反而学不好。4. 训练全流程从环境配置到批量实验脚本这一章是真正动手指令的部分。整个工程的入口文件是train.py其余还有getbash.py、trainOnlyStance.py、trainOnlyRumor.py。实际跑之前最好先看一遍requirements.txt主要依赖是transformers、torch、networkx、sklearn。如果你的 PyTorch 版本和requirements-version.txt里锁定的版本不一致大概率会遇到 BERT 加载时的兼容报错。4.1 环境安装与依赖锁定先在虚拟环境里装依赖推荐用conda或venv不要把依赖装到全局环境里不然 BERT 版本冲突会让你排查到怀疑人生。python -m venv rumor_env source rumor_env/bin/activate pip install -r requirements.txtrequirements.txt和requirements-version.txt的区别我猜是前者宽松、后者锁版本。如果直接用requirements-version.txt装更稳妥但要注意可能是基于特定 CUDA 版本生成的换了 GPU 后建议只保留 torch 的大版本号小版本不要锁太死。4.2 train.py 的核心启动参数训练入口脚本通常会支持以下参数直接在命令行传即可python train.py \ --dataset_dir ./datasets/PHEME \ --event_names charliehebdo \ --model_type MSABiGCN \ --enc_model bert-base-uncased \ --batch_size 8 \ --lr 2e-5 \ --epochs 10 \ --device cuda:0这里的event_names只传一个事件是调试时的「后悔药」做法能快速验证脚本能跑通、梯度能下降再传全部事件去正式训练。enc_model可以换成roberta-base或bert-base-chinese但换了之后要重新看 tokenizer 对数据的兼容性。中文数据用bert-base-uncased是跑不出效果的这一点诗特别容易被忽略。学习率2e-5是 BERT 微调常见的起点。如果训练时 loss 不降先检查是不是学习率太大导致震荡调成1e-5再试。batch_size受显存限制如果你只有 8GB 显存batch_size设为 4 都可能是极限再多就会 CUDA out of memory。出现这种情况时可以增加梯度累积来缓解不一定非要换大卡。训练日志里每一轮会输出训练 loss、验证集的 F1、准确率。不要只盯着准确率谣言检测里类别不平衡严重准确率会有欺骗性必须看 macro-F1。源码里评估脚本大概率已经算了 F1你只需要在日志里找那一行即可。4.3 用 getbash.py 自动化批量实验getbash.py这个文件很实用。它的作用是生成一批训练命令投到终端里批量跑而不是每次手动改参数。一般逻辑是python getbash.py run_all.sh bash run_all.sh打开getbash.py看一眼通常里面定义了一组实验配置的列表比如不同的event_names、不同的model_type然后循环拼命令字符串。如果你想让实验更科学可以把seed也作为参数写进命令里每个配置跑三次取平均。这份代码本身不重但它代表了一个好习惯所有实验用脚本生成保证可复现。我实际见过很多同学在命令行里手动敲参数跑实验跑到第 8 组时已经不记得第 3 组用了什么学习率。用getbash.py把所有组合生成出来最后写进日志文件这个习惯比模型调参还重要。4.4 只跑立场或只跑谣言的单任务模式trainOnlyStance.py和trainOnlyRumor.py的区别在数据加载之后模型部分可能都一样只是 loss 不看另一个任务的输出。单任务模式适合两种场景一是你想快速验证某个数据集上 text 编码的改动是否有效二是资源有限多任务训练耗时太长先跑通单任务再叠加。从这个角度来看这份代码其实把「多任务」拆成了一个可插拔的模块而不是绑死的整体——这一点对做课程设计的人很友好可以先跑通单任务拿个 baseline再打开多任务看收益。5. 避坑与排查五个这次复现中容易翻车的具体位置在任何 NLP 项目里代码不能跑通的原因往往不在模型而在数据、路径、张量形状这些最无聊的地方。这套源码我拆测过几轮遇到的坑基本集中在下面五处每一条都是「现象 → 原因 → 解决」的完整链条建议你在跑之前先记住。5.1 事件名大小写与目录不匹配现象DataLoader加载到第二个 epoch 时报错FileNotFoundError路径里的事件名看起来没错但就是找不到文件。原因PHEME 数据集中事件名存在大小写混用代码里可能用的是charliehebdo而磁盘目录里是CharlieHebdo。在 Linux 环境下大小写是严格敏感的Windows 下可能不报错但跨平台一跑就炸。解决在rumorDataset.py的_load_event里加一段最笨也最有效的代码——启动时打印os.listdir(dataset_dir)人工核对事件名然后统一走一个映射表把传入的事件名映射到磁盘目录的真实名字。5.2 BERT tokenizer 的 max_seq_len 设置过短现象训练 loss 正常下降但验证集 F1 一直上不去比论文报告的低一大截。原因推文拼接出的文本序列超过了你设置的max_seq_len超出的部分被直接截断。谣言检测里关键信息往往在回复链的后半段全被截掉了模型根本看不到。解决统计一下数据集中文本序列的长度分布用np.percentile看 95 分位是多少把max_seq_len设成这个值而不是拍脑袋定 128。显存不够时改用分层截断策略尽量保留源推文和靠近末尾的回复而不要只从开头截。5.3 邻接矩阵维度与节点数对不上现象前向传播时报size mismatch或者A和x的矩阵乘法维度错误。原因图卷积需要节点数和邻接矩阵维度一致。如果你在__getitem__里动态拼接节点特征不同样本的节点数不同而DataLoader默认会把一个 batch 的样本 stack 成固定形状张量节点数不一致直接崩。解决最常见的做法是用 batch size 为 1 的方式每个样本单独做图卷积或者把所有样本 pad 到相同节点数并维护一个batch_mask让 GCN 只聚合有效节点。源码里如果没做 padding那就老老实实用 batch size 为 1 跑图卷积部分。5.4 加载 BERT 权重时报 shape mismatch现象加载bert-base-uncased时全连接分类头参数对不上报size mismatch for classifier.weight。原因预训练模型自带一个 2 分类的[CLS]分类头而你的谣言任务也是二分类参数名恰好能对上一部分但你改了隐藏层维度或多任务输出维度因此 mismatch。解决加载权重时显式忽略分类头参数。用model.load_state_dict(state_dict, strictFalse)让缺少分类头参数时不报错然后你的模型自己的分类头随机初始化即可。千万不要用strictTrue硬刚那是跟自己过不去。5.5 多任务 loss 权重失衡导致谣言任务失效现象多任务训练完成后谣言检测的 F1 只有 0.5 出头单独训练谣言却能达到 0.7 以上。原因立场分类是四分类交叉熵损失天然比二分类大模型会优先优化立场任务谣言任务被压制。解决先把多任务权重alpha调到 0.3 以下或者观察训练日志里两个 loss 的数值哪个更大就给哪个更低的权重。更稳妥的做法是动态调整权重让两个 loss 的梯度范数保持相近。不过对这个项目来说先固定权重跑一次再根据结果调比一开始就想上动态策略实际得多。这些坑本质都是「数据组织方式改了但模型结构没跟着适配」造成的。你走一遍这套源码的调试流程后回头再维护别的 NLP 工程也会习惯性多检查这几个环节。6. 用 result.ipynb 验真指标之外还要看错误样例这份源码里有两个 Jupyter Notebook 值得认真用result.ipynb和semeval2017-8-test.ipynb。前者是训练完成后的结果可视化后者是在比赛测试集上的正式评测。很多人跑完训练只看一个 F1 就收工其实这两个 notebook 里藏着判断模型是否真正有效的方法。在result.ipynb里我一般会在每个事件上单独输出「预测错误样本」具体做法是把每个测试事件里预测错误的推文 ID 和文本摘出来按事件归类然后一条条看是被主观措辞误导了还是回复链上的信息没有聚合到位。这一步比看混淆矩阵有用得多——混淆矩阵只能告诉你错了多少不能告诉你怎么改。比如某个事件里模型总是把「否认谣言」误判为「支持谣言」那就是 stance 的类别边界没学好需要调整图注意力权重或者某个事件的数据增强。还有一个值得做的是对比trainOnlyStance.py和trainOnlyRumor.py的单任务结果与train.py多任务结果的差异。在多任务学习里「多任务是否真的带来增益」取决于两个任务是否相关。你可以自己做一个三行的小表格谣言检测多任务 F1、单任务 F1、立场分类多任务 F1、单任务 F1看看哪边更高。这套源码的价值不只是复现论文更在于它能让你亲手验证多任务学习的边界在哪里。用一个技巧收尾跑完训练后强制自己在result.ipynb中输出至少 20 条错误样本做成一个error_samples.csv每次调参后都看一下这个文件里有哪些错误消失了、哪些错误新出现了。这个习惯比只看分数曲线更能帮你发现模型真正的短板。从那以后我每次跑这套代码都会先在测试集上做一次完整的前向推理把每个样本的预测概率落盘再回看错误分布而不是只盯训练日志里的 loss。这个小习惯帮我避开了很多「指标还行、实际不可用」的陷阱。项目里的坑和边界都梳理清楚了希望帮到你。本文还有配套的精品资源点击获取

相关新闻

GESP五级筛法精讲:埃氏筛与线性筛的原理、选择与考场模板

GESP五级筛法精讲:埃氏筛与线性筛的原理、选择与考场模板

GESP C五级的知识点里,埃氏筛和线性筛是公认的“第一次让你真正感受到算法效率”的内容。很多同学刚学到这里都会有个共同的困惑:代码看起来差不多,名字又很像,到底学哪个?考试默写哪个?为什么明明暴力也能…

2026/10/18 12:41:33 阅读更多 →
句子嵌入模型解析:paraphrase-multilingual-MiniLM-L12-v2 语义相似度实战

句子嵌入模型解析:paraphrase-multilingual-MiniLM-L12-v2 语义相似度实战

简介:本资源为 sentence-transformers 库下的 paraphrase-multilingual-MiniLM-L12-v2 多语言句向量模型本地包,面向从事自然语言处理、语义检索、问答系统与文本蕴含等任务的开发者及研究者。模型基于轻量级 MiniLM 架构,含 12 层 Transform…

2026/10/18 12:41:33 阅读更多 →
日文说明书图片翻译实测:客服如何用OCR与多模态大模型提升效率

日文说明书图片翻译实测:客服如何用OCR与多模态大模型提升效率

白天最容易让我上头的瞬间,不是什么难缠的差评,而是买家突然甩来一张图,图上是一大段密密麻麻的日文说明书,然后问一句“亲,这个是什么意思?”做客服久了你就知道,英语多少还能靠单词蒙一蒙&…

2026/10/18 12:41:33 阅读更多 →

最新新闻

Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

Linux下NVML初始化失败:驱动与库版本不匹配的排查与修复指南

1. 这个报错到底在说什么Failed to initialize NVML: Driver/library version mismatch这行字,但凡在 Linux 上跑过深度学习训练、折腾过显卡直通、或者手贱升级过一次系统内核的人,大概率都见过。它的字面意思很直白:NVML 初始化失败&#x…

2026/10/18 13:26:59 阅读更多 →
迈迪三维设计工具:SolidWorks国标件参数化建模加速方案

迈迪三维设计工具:SolidWorks国标件参数化建模加速方案

简介:迈迪三维设计工具集是专为SolidWorks平台开发的专业级机械设计辅助插件,面向机械工程师、产品设计师及高校相关专业师生,旨在提升标准件建模、结构设计与工程图生成效率。资源包共2000个文件,总大小211.97MB,涵盖…

2026/10/18 13:26:59 阅读更多 →
JDBC从入门到精通:连接、预编译、事务与连接池实战

JDBC从入门到精通:连接、预编译、事务与连接池实战

做Java开发的朋友,应该都对JDBC不陌生。它就像是Java世界和数据库之间的一座桥,不管是传统的业务系统,还是后面对接MyBatis、Hibernate这类ORM框架,底层真正干活的还是JDBC。可以说,只要你想在Java里操作数据库&#x…

2026/10/18 13:26:59 阅读更多 →
如何查看电脑开机时间?四种系统自带方法实测与解读

如何查看电脑开机时间?四种系统自带方法实测与解读

1. 为什么非要搞清楚电脑的开机时间先说个场景,不知道你有没有遇到过:新装了一台电脑,或者刚重做完系统,总感觉开机慢得像老牛拉车。这时候你想评估一下到底是硬件不行,还是系统没优化好,最直接的一个指标就…

2026/10/18 13:26:59 阅读更多 →
Linux下NVIDIA驱动NVML版本不匹配报错排查与修复指南

Linux下NVIDIA驱动NVML版本不匹配报错排查与修复指南

1. 这个报错到底在说什么如果你在 Linux 环境下用nvidia-smi查显卡状态,终端冷不丁甩出一句Failed to initialize NVML: Driver/library version mismatch,那基本可以确定一件事:你机器上正在运行的 NVIDIA 内核驱动版本,和你当前…

2026/10/18 13:26:59 阅读更多 →
Java在线教育平台源码解析:DWD-DWS-DIM分层架构与毕设实战指南

Java在线教育平台源码解析:DWD-DWS-DIM分层架构与毕设实战指南

简介:这是一套面向Java开发者与教育信息化建设者的在线教育平台6.2版本完整设计源码,聚焦教学管理、课程学习、在线考试与数据治理等核心场景,适用于高校IT课程实践、教育类毕业设计或中小型在线教育系统二次开发。资源共69个文件&#xff0c…

2026/10/18 13:25:59 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →