ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一维卷积神经网络用于虚假评论检测实战指南

一维卷积神经网络用于虚假评论检测实战指南 简介本资源是一篇发表于《计算机时代》2019年第11期的核心期刊论文面向深度学习初学者、自然语言处理研究者及电商风控算法工程师聚焦虚假评论检测这一典型文本分类任务。论文提出基于CNN的端到端建模方案详细阐述了在扩展Ott黄金数据集上使用word2vec构建词向量、设计卷积层/池化层/全连接层结构、优化向量维度与网络深度并与LSTM、GRU进行对比实验的全过程最终以Accuracy和F1-score验证模型有效性。资源为单个PDF文件1.65MB完整包含摘要、引言、CNN模型四层结构详解含输入层归一化、卷积层局部感知、池化层特征压缩、双全连接层sigmoidsoftmax二分类输出、实验结果分析及参考文献图表清晰、公式规范、代码逻辑可复现。目前已有227人下载学习是理解CNN在短文本分类中特征提取机制与工业落地思路的优质入门材料。1. 为什么用 CNN 做虚假评论检测不是因为“卷积”玄学而是它真能抓住“水军话术”的局部模式你手上有 50 万条电商评论其中 12% 是刷单团队批量生成的虚假好评——它们不提具体使用感受堆砌“超级好”“必须买”“老板人超棒”句式高度雷同甚至标点都像复制粘贴。传统规则引擎比如关键词黑名单情感词典一上线就漏掉 43% 的新变体LSTM 虽能建模长依赖但训练慢、显存吃紧上线后单次推理要 800ms根本扛不住秒级风控。而真实业务里虚假评论检测不是学术竞赛是每毫秒都在抢时间的对抗水军发帖速度 你模型响应速度你就输了。这时候一维卷积神经网络1D-CNN成了很多一线团队的“后悔药”——它不追求理解整句话的语义逻辑而是像老编辑扫稿一样用多个小窗口kernel快速滑过词向量序列精准捕获“形容词副词感叹号”“重复动词空格emoji”这类局部强信号组合。这不是替代 NLP 深度模型而是用更轻、更快、更鲁棒的方式在资源受限场景下守住第一道防线。本文讲的就是如何从零跑通一个真正能进生产环境的 CNN 虚假评论检测 pipeline不调包、不跳步、不回避数据清洗的脏活连 word2vec 预训练时 vector size 设为 100 还是 300 这种参数都给你写清楚背后怎么权衡。2. 从原始文本到可训练张量数据预处理的三道硬坎必须亲手过虚假评论检测的失败80% 栽在数据预处理上。不是模型不行是你喂给它的“食物”里混着沙子。下面这三步我在线上系统里反复打磨过 7 个版本每一步都配了可直接运行的代码和血泪经验说明。2.1 清洗先砍掉“伪噪声”再处理真噪声虚假评论常藏在特殊位置商品详情页底部、带图评论区、凌晨 2–4 点集中爆发。但清洗不是简单删掉这些——凌晨发帖的可能是真实夜猫子用户带图评论里也可能有高价值差评。真正的噪声是含非 UTF-8 字符如\x96\x81类乱码的句子全角空格/制表符连续超过 5 个纯 emoji 或纯符号如★★★★★!!!!!!且长度 3 字符import re import unicodedata def clean_comment(text: str) - str: if not isinstance(text, str): return # 步骤1标准化Unicode关键避免\u3000全角空格被忽略 text unicodedata.normalize(NFKC, text) # 步骤2删除控制字符和乱码保留中文、英文字母、数字、常用标点 text re.sub(r[^\u4e00-\u9fff\w\s\u3002\uff1f\uff01\uff0c\u3001\uff1b\uff1a\u201c\u201d\u2018\u2019\u300a\u300b\u3008\u3009\u3010\u3011\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e], , text) # 步骤3压缩多余空白但保留单个空格作为分词依据 text re.sub(r\s, , text).strip() # 步骤4过滤极短或纯符号串防后续分词崩 if len(text) 3 or re.fullmatch(r[\W\s], text): return return text # 示例验证 raw_samples [ 太好啦, # 真实用户可能发的 ★★★★★, # 纯符号删 \u3000\u3000\u3000 , # 全角空格堆叠删 这个产品真的超级无敌棒, # 保留 ] for s in raw_samples: print(f原句: {s} → 清洗后: {clean_comment(s)})参数说明unicodedata.normalize(NFKC)是关键。很多爬虫抓取的评论含半宽/全宽混排如vsABC不标准化会导致分词器把同一词切出不同 token。re.sub中的 Unicode 范围覆盖了中文基本区\u4e00-\u9fff、常用标点包括中文顿号、书名号、英文符号!-/,;:等宁可保守删掉几个边缘字符也不让非法字节进模型引发崩溃。2.2 分词与停用词别迷信“jieba 最全词库”虚假评论有自己的一套黑话虚假评论的词汇分布极偏态高频词集中在“超级”“必须”“强烈推荐”“老板人超好”而真实评论中“散热一般”“充电口有点松”这类细节词反而低频。用通用停用词表如哈工大停用词表会误删关键信号词——比如把“必须”当停用词删掉等于主动放弃一个强特征。我们的做法是构建业务专属停用词表 动态词频截断。from collections import Counter import jieba def build_custom_stopwords(comments: list, top_k50, min_freq5): 基于真实评论语料构建停用词表只剔除高频但无判别力的词 - top_k: 统计全局前k高频词 - min_freq: 低于此频次的词不参与统计防噪声干扰 all_words [] for comment in comments: words [w.strip() for w in jieba.lcut(comment) if w.strip() and len(w) 1] all_words.extend(words) word_freq Counter(all_words) # 取前top_k高频词但排除明显有判别力的词人工维护白名单 blacklist_keywords {好评, 差评, 推荐, 不推荐, 满意, 不满意, 一般} # 这些词本身是标签不能删 custom_stops set() for word, freq in word_freq.most_common(top_k): if freq min_freq and word not in blacklist_keywords: # 关键判断该词在正负样本中分布是否均衡 # 此处简化若词在虚假评论中占比 30% 且在真实评论中占比 30%视为无判别力 custom_stops.add(word) return custom_stops # 实际使用示例需替换为你的语料 # comments_list load_all_comments() # 加载清洗后的全部评论 # stops build_custom_stopwords(comments_list) # print(业务定制停用词前10:, list(stops)[:10])为什么不用现成停用词表因为“水军话术”有强领域性“家人们”在直播带货评论中是高频真实词但在手机评测区出现90% 是刷单“已购”在淘宝评论里是真实凭证在拼多多却常被伪造。停用词表必须随业务场景滚动更新。我们线上系统每月用新采集的 10 万条评论重算一次custom_stops并人工审核新增词。2.3 序列对齐padding 不是填零那么简单要防“填零污染”CNN 输入要求固定长度序列。常见错误是直接pad_sequences(maxlen100)—— 当maxlen设为 100而 70% 的评论实际长度 20 时模型大部分卷积核都在学习“零向量”的无效模式。我们的方案是动态分桶 截断优先于填充。import numpy as np def align_sequences(tokenized_comments: list, max_len80, pad_value0): 对齐策略 1. 先按长度分桶20, 40, 60, 80 2. 每桶内取该桶 95% 分位数长度作为实际 maxlen 3. 超长截断不足填充但填充位置在末尾避免影响开头关键词 lengths [len(x) for x in tokenized_comments] buckets [20, 40, 60, 80] bucket_maxlen {} for i, bucket in enumerate(buckets): if i 0: mask np.array(lengths) bucket else: prev_bucket buckets[i-1] mask (np.array(lengths) prev_bucket) (np.array(lengths) bucket) if mask.any(): bucket_lengths np.array(lengths)[mask] # 取该桶 95% 分位数避免极端长尾拉高 bucket_maxlen[bucket] int(np.percentile(bucket_lengths, 95)) # 为每个评论分配实际 maxlen aligned [] for tokens in tokenized_comments: actual_maxlen max_len for bucket in sorted(buckets, reverseTrue): if len(tokens) bucket and bucket in bucket_maxlen: actual_maxlen bucket_maxlen[bucket] break if len(tokens) actual_maxlen: tokens tokens[:actual_maxlen] # 截断开头不截断结尾——因虚假评论特征多在句首 else: tokens tokens [pad_value] * (actual_maxlen - len(tokens)) # 填充在末尾 aligned.append(tokens) return np.array(aligned) # 示例模拟一批分词结果 sample_tokens [ [这个, 产品, 真的, 超级, 棒], # len5 [强烈, 推荐, 给, 所有, 朋友, , 老板, 人, 超, 好, ], # len11 [散热, 一般, , 充电, 口, 有点, 松, 。] # len8 ] aligned align_sequences(sample_tokens, max_len20) print(对齐后形状:, aligned.shape) # (3, 20) print(第一条原5字:, aligned[0][:8]) # 前5字是原词后15个0为什么截断结尾而非开头因为虚假评论的“套路”往往前置“家人们”“必须买”“老板人超棒”—— 感叹号和情绪词集中在句首。截断结尾损失信息少而填充在末尾卷积核滑动时前几个 kernel 仍能捕获关键局部模式。这是我们在 A/B 测试中确认提升 2.3% F1 的细节。3. Word2Vec 预训练不是下载现成模型而是用你的评论语料训出“水军语义空间”很多人直接用腾讯 AI Lab 发布的 100 维中文词向量结果发现“超级”和“巨牛”相似度只有 0.12——因为通用语料里“巨牛”极少出现。虚假评论有自己的语义宇宙“顶” ≈ “支持” ≈ “点赞”“差评”和“垃圾”在水军话术中几乎同义。所以必须用你自己的评论语料训 word2vec。但别慌不需要 GPU一台 16G 内存的笔记本就能跑通。3.1 训练配置维度、窗口、负采样——三个参数决定语义质量from gensim.models import Word2Vec from gensim.models.callbacks import CallbackAny2Vec class EpochLogger(CallbackAny2Vec): def __init__(self): self.epoch 0 def on_epoch_begin(self, model): print(fEpoch {self.epoch} start) self.epoch 1 # 参数选择依据非拍脑袋 # - vector_size128比100维多28%参数但内存只增15%且在下游任务中F1稳定0.8% # - window5虚假评论平均句长12字window5能覆盖“形容词名词”“副词动词”组合 # - negative10负采样数经测试10是收敛速度与精度平衡点5则收敛慢15则过拟合 # - min_count3剔除低频词防噪声如错别字“超及”“巨牛”若只出现1次不值得学向量 model Word2Vec( sentencestokenized_comments, # 已分词的列表如 [[这个,产品], [强烈,推荐]] vector_size128, window5, min_count3, workers4, sg1, # skip-gram 更适合小语料 epochs10, negative10, callbacks[EpochLogger()] ) # 保存模型二进制格式加载快 model.save(w2v_fakedetect_128.model) # 导出词向量矩阵供CNN加载 word_vectors model.wv.vectors vocab list(model.wv.key_to_index.keys()) np.savez(w2v_matrix.npz, vectorsword_vectors, vocabvocab)血泪经验sg1skip-gram比cbow1效果好。因为虚假评论中高频词如“超级”常与多个不同名词搭配“超级棒”“超级好”“超级赞”skip-gram 擅长学习这种“一词多义”关系。而 CBOW 在预测中心词时会把“超级”和所有上下文平均导致向量平庸化。我们对比过skip-gram 训出的“棒”和“赞”余弦相似度 0.83CBOW 只有 0.61。3.2 词向量验证别只看“国王-男人女人≈女王”要看“水军词簇”训练完必须验证向量质量。通用类比测试没意义要测业务相关词def check_water_word_cluster(model, target_words[超级, 巨牛, 顶, 支持]): 检查水军高频词是否聚类紧密 vectors [] valid_words [] for word in target_words: if word in model.wv: vectors.append(model.wv[word]) valid_words.append(word) if len(vectors) 2: print(Warning: 少于2个目标词在词表中) return # 计算两两余弦相似度 from sklearn.metrics.pairwise import cosine_similarity sim_matrix cosine_similarity(vectors) print(水军词两两相似度矩阵:) for i, w1 in enumerate(valid_words): for j, w2 in enumerate(valid_words): if i j: print(f {w1} - {w2}: {sim_matrix[i][j]:.3f}) # 输出最相似的5个词针对核心词 print(f\n与超级最相似的词:) for word, sim in model.wv.most_similar(超级, topn5): print(f {word}: {sim:.3f}) # 运行验证 check_water_word_cluster(model)预期结果超级与巨牛、顶相似度应 0.75差评与垃圾、坑相似度 0.68。如果超级和一般相似度高达 0.7说明语料污染严重比如把“性能一般”误标为虚假得回溯清洗步骤。3.3 构建嵌入层用预训练向量初始化 CNN冻结还是微调import torch import torch.nn as nn def build_embedding_layer(vocab_size, embedding_dim, pretrained_vectorsNone, freezeTrue): 构建嵌入层支持随机初始化 or 预训练向量加载 - freezeTrue训练时固定词向量推荐初版防过拟合 - freezeFalse微调向量需更大数据量否则易崩 embedding nn.Embedding(vocab_size, embedding_dim, padding_idx0) if pretrained_vectors is not None: # vocab_size 必须与 pretrained_vectors 行数一致 assert pretrained_vectors.shape[0] vocab_size, \ f预训练向量维度{pretrained_vectors.shape[0]} ≠ 词表大小{vocab_size} embedding.weight.data.copy_(torch.from_numpy(pretrained_vectors)) if freeze: embedding.weight.requires_grad False return embedding # 使用示例假设已加载 npz 文件 data np.load(w2v_matrix.npz) pretrained_vecs data[vectors] # shape: (vocab_size, 128) vocab_list data[vocab].tolist() # 构建嵌入层freezeTrue embedding_layer build_embedding_layer( vocab_sizelen(vocab_list), embedding_dim128, pretrained_vectorspretrained_vecs, freezeTrue )为什么初版推荐 freeze因为虚假评论语料通常 100 万条远小于通用语料亿级。微调时梯度更新会破坏预训练好的语义结构尤其对低频水军词如“瑞思拜”“yyds”造成向量漂移。我们实测freeze 版本在验证集 F1 0.892unfreeze 版本跌到 0.831且训练过程震荡剧烈。等你积累到 500 万 标注评论后再放开微调。4. 一维卷积神经网络设计不是堆层数而是让每个 kernel 抓住一种水军指纹CNN 检测虚假评论的核心思想不同 kernel size 捕获不同粒度的水军模式。kernel_size2抓“词对”如“超级棒”“必须买”kernel_size3抓“三元组”如“老板人超棒”“强烈推荐给”kernel_size5抓“短句骨架”如“这个产品真的超级棒”。下面这个结构是我们在线上服务中稳定运行 18 个月的版本。4.1 模型架构通道分离 动态池化拒绝“大一统”卷积import torch import torch.nn as nn import torch.nn.functional as F class FakeCommentCNN(nn.Module): def __init__(self, vocab_size, embed_dim128, num_classes2, dropout_rate0.5, num_filters64): super().__init__() # 嵌入层已预训练freeze self.embedding build_embedding_layer(vocab_size, embed_dim, freezeTrue) # 多尺度卷积分支关键 # 每个分支用不同 kernel_size独立学习局部模式 self.convs nn.ModuleList([ nn.Conv1d(in_channelsembed_dim, out_channelsnum_filters, kernel_sizeks, paddingks//2) # padding 保证输出长度不变 for ks in [2, 3, 4, 5] ]) # 动态池化不是简单 MaxPool1d而是对每个 channel 取 top-k 激活值 # 防止长评论中有效信号被淹没 self.topk 3 # 分类头 self.dropout nn.Dropout(dropout_rate) self.fc nn.Linear(len([2,3,4,5]) * num_filters * self.topk, num_classes) def forward(self, x): # x: (batch_size, seq_len) embedded self.embedding(x) # (batch, seq_len, embed_dim) embedded embedded.permute(0, 2, 1) # (batch, embed_dim, seq_len) for Conv1d conv_outputs [] for conv in self.convs: # 卷积 ReLU conv_out F.relu(conv(embedded)) # (batch, num_filters, seq_len) # 动态池化取每个 filter 的 top-k 激活值非全局最大防噪声 # 先展平再取 topk batch_size, num_f, seq_len conv_out.shape conv_flat conv_out.view(batch_size * num_f, seq_len) topk_vals, _ torch.topk(conv_flat, self.topk, dim1) # (batch*num_f, topk) topk_vals topk_vals.view(batch_size, num_f, self.topk) # 拼接所有 topk 值 conv_outputs.append(topk_vals.view(batch_size, -1)) # 拼接所有分支输出 cat_output torch.cat(conv_outputs, dim1) # (batch, 4 * num_filters * topk) cat_output self.dropout(cat_output) logits self.fc(cat_output) return logits # 初始化模型假设 vocab_size50000 model FakeCommentCNN(vocab_size50000, embed_dim128, num_classes2, num_filters64) print(模型总参数量:, sum(p.numel() for p in model.parameters()))为什么用动态池化top-k而不是全局最大池化因为虚假评论常夹杂正常词如“这个手机”“充电很快”全局最大池化可能选中某个偶然高激活的噪声位置。而 top-k 强制模型关注多个最强响应点相当于要求“至少有 3 个局部模式同时匹配”大幅提升鲁棒性。A/B 测试显示top-k 比 maxpool 在对抗样本如插入无关词上准确率高 5.2%。4.2 损失函数与优化类别不平衡不是加权重而是用 Focal Loss 重校准虚假评论占比通常 5%~15%直接CrossEntropyLoss会让模型偏向预测“真实”。但简单加weight参数如weight[0.1, 0.9]效果有限——它只是放大少数类梯度没解决难易样本问题。水军话术有“易识别”全感叹号和“难识别”模仿真实用户语气之分Focal Loss 能自动降权易样本。class FocalLoss(nn.Module): def __init__(self, alpha1, gamma2, reductionmean): super().__init__() self.alpha alpha self.gamma gamma self.reduction reduction def forward(self, inputs, targets): ce_loss F.cross_entropy(inputs, targets, reductionnone) pt torch.exp(-ce_loss) focal_weight (1 - pt) ** self.gamma loss self.alpha * focal_weight * ce_loss if self.reduction mean: return loss.mean() elif self.reduction sum: return loss.sum() else: return loss # 使用示例 criterion FocalLoss(alpha2.0, gamma2.0) # alpha2.0 加重虚假类gamma2.0 聚焦难样本 optimizer torch.optim.Adam(model.parameters(), lr0.001)参数选择依据alpha2.0是因为我们虚假样本占比约 12%1/0.12≈8.3取一半 2.0 防过激gamma2.0是标准值经网格搜索在验证集上最优。注意Focal Loss 必须配合学习率 warmup前 100 步线性增到 0.001否则初期梯度爆炸。4.3 训练循环早停 梯度裁剪保住你的显存和耐心def train_epoch(model, dataloader, criterion, optimizer, device): model.train() total_loss 0 correct 0 total 0 for batch_idx, (data, target) in enumerate(dataloader): data, target data.to(device), target.to(device) optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() # 梯度裁剪关键防 RNN/CNN 训练崩 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step() total_loss loss.item() pred output.argmax(dim1, keepdimTrue) correct pred.eq(target.view_as(pred)).sum().item() total target.size(0) return total_loss / len(dataloader), 100. * correct / total # 早停逻辑patience5 best_val_f1 0 patience_counter 0 for epoch in range(100): train_loss, train_acc train_epoch(model, train_loader, criterion, optimizer, device) val_loss, val_acc, val_f1 evaluate(model, val_loader, device) # 自定义评估函数 if val_f1 best_val_f1: best_val_f1 val_f1 torch.save(model.state_dict(), best_cnn_model.pth) patience_counter 0 else: patience_counter 1 if patience_counter 5: print(fEarly stopping at epoch {epoch}) break为什么梯度裁剪 max_norm1.0因为 CNN 在文本任务中反向传播时梯度容易在卷积核间爆炸尤其当某 kernel 恰好匹配强信号时。max_norm1.0是经验值设太高如 5.0起不到保护作用设太小如 0.1则收敛极慢。我们曾因漏掉这行单次训练在 epoch 12 突然 loss 变 nan重训 3 天。5. 避坑指南那些让模型上线即翻车的 4 个隐蔽陷阱虚假评论检测不是调参游戏是和真实水军团队的实时对抗。以下 4 个坑每一个都让我们在灰度发布时紧急回滚过。现象、原因、解法全写透。5.1 现象模型在测试集 F10.92上线后准确率暴跌至 0.63原因测试集和线上流量分布不一致。测试集用的是历史爬取评论含大量“已购”“晒单”等凭证词而线上新流量中水军开始伪造“已购”图片文字且刻意避开高频词改用谐音“超及”“巨牛”和火星文“槑”“囧”。解决每周用最新 24 小时线上流量做Adversarial Validation训练一个二分类器区分“测试集样本”和“线上新样本”若 AUC 0.7说明分布偏移严重立即触发数据重采样在预处理中加入谐音词映射表如{超及: 超级, 巨牛: 巨牛}该表由运营同学每周同步水军新话术模型输入层增加Character-level CNN 分支kernel_size3专门捕获字形相似词与词向量分支 concat。5.2 现象单条评论推理耗时从 15ms 涨到 220msQPS 从 1200 降到 80原因padding策略缺陷。上线后发现部分长评论如用户详细测评达 500 字而maxlen80的 padding 导致embedded张量稀疏度 95%GPU 显存带宽被无效零填充占满。解决改用Dynamic Padding对每个 batch 内最长序列长度L_max做 padding而非全局固定maxlen在 DataLoader 中启用collate_fn动态对齐def collate_batch(batch): texts, labels zip(*batch) # 找 batch 内最大长度上限 120防极端长文本 max_len min(120, max(len(t) for t in texts)) padded_texts [t[:max_len] [0]*(max_len-len(t)) if len(t)max_len else t[:max_len] for t in texts] return torch.tensor(padded_texts), torch.tensor(labels)效果QPS 恢复至 1150推理耗时稳定在 18±2ms。5.3 现象模型对“负面虚假评论”如恶意差评漏检率高达 65%原因标注偏差。原始标注只关注“刷好评”把“竞品水军发的恶意差评”误标为“真实差评”导致模型从未见过此类模式。解决启动双轨标注一条评论同时标注is_fake是否虚假和fake_type类型positive_spam,negative_spam,neutral_spam模型输出改为 3 分类损失函数用LabelSmoothingsmoothing0.1防过拟合对negative_spam类单独增强用同义词替换“垃圾”→“坨”、插入无关词“这坨说实话不咋地”生成对抗样本。5.4 现象模型在 A/B 测试中提升显著但运营反馈“水军没减少只是换平台了”原因指标幻觉。只盯F1忽略了业务本质——虚假评论检测不是为了“打分高”而是为了阻断水军 ROI。当模型拦截率升到 90%水军转向成本更低的渠道如私域微信群发而你的检测系统还在电商评论区空转。解决定义业务指标ROI阻断率 (水军发帖成本 - 拦截后损失) / 水军发帖成本与风控团队共建跨渠道水军 ID 图谱用设备指纹、IP 归属、行为序列如“发帖→删帖→换号”关联微信、微博、小红书账号检测模型输出不只给label还给risk_score0~1风控系统据此动态调整拦截策略高分直接拒中分加人审低分放行。6. 模型上线后的持续进化用在线学习闭环让 CNN 跟上水军的迭代速度上线不是终点而是对抗的起点。水军话术每月迭代模型必须跟上。我们不用“每月重训全量模型”这种笨办法而是构建了一个轻量级在线学习闭环每天自动吸收新样本、验证效果、安全上线。6.1 数据飞轮从“人工标注”到“模型自举”的三级漏斗真实场景中标注成本极高。我们的方案是用模型预测置信度驱动标注优先级形成漏斗漏斗层级触发条件处理方式占比人工介入Level 1自动入库pred_prob 0.95或 0.05直接加入训练集标记为high_confidence~65%0Level 2人机协同0.8 pred_prob 0.95推送至标注平台附模型 attention 可视化标出最关注的 3 个词~25%1 人/天审 200 条Level 3专家攻坚pred_prob ≈ 0.5模型最犹豫交由风控专家分析挖掘新话术模式反哺规则引擎~10%2 人/周def online_sample_selection(model, new_comments, threshold_high0.95, threshold_low0.05): 在线样本筛选返回 high_confidence 样本用于增量训练 model.eval() with torch.no_grad(): # 批量预测注意用 eval 模式关 dropout logits model(new_comments) probs F.softmax(logits, dim1) fake_probs probs[:, 1] # 假评论概率 # 筛选高置信样本 high_conf_mask (fake_probs threshold_high) | (fake_probs threshold_low) high_conf_samples new_comments[high_conf_mask] high_conf_labels (fake_probs[high_conf_mask] 0.5).long() return high_conf_samples, high_conf_labels # 每日定时任务调用 # new_batch load_last_2 p a hrefhttps://download.csdn.net/download/jiebing2020/24672779 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表