You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CNN输出中生成训练与测试数据匹配度的百分比

在CNN输出中显示训练与测试数据匹配度百分比的实现方法

这里的“匹配程度”通常分为两种常见场景:测试集预测准确率(模型对测试数据的预测正确比例)和特征分布相似度(训练与测试数据的特征分布重合度),以下分别给出实现方案:

场景1:输出测试集预测准确率(最常用的匹配指标)

这是衡量模型泛化能力的核心指标,直接反映训练数据学到的模式在测试数据上的匹配效果:

  • 1. 获取预测结果与真实标签
    训练完成后,切换模型到评估模式,遍历测试集统计正确预测数:
    # 假设model是训练好的CNN,test_loader是测试数据加载器
    model.eval()
    correct_predictions = 0
    total_samples = 0
    
    with torch.no_grad():  # 关闭梯度计算,节省资源
        for batch in test_loader:
            images, true_labels = batch
            outputs = model(images)
            _, predicted_labels = torch.max(outputs, 1)  # 取概率最大的类别
            
            total_samples += true_labels.size(0)
            correct_predictions += (predicted_labels == true_labels).sum().item()
    
  • 2. 计算并输出百分比
    通过正确数与总样本数的比值计算准确率,转为百分比后输出:
    match_percentage = 100 * correct_predictions / total_samples
    print(f"训练与测试数据匹配度(测试准确率):{match_percentage:.2f}%")
    
    若要在训练过程中实时显示,可在每轮训练结束后执行上述代码,结合tqdm或日志工具输出进度。

场景2:衡量训练与测试数据的特征分布匹配度

如果需要判断训练和测试数据本身的分布一致性(而非模型泛化能力),可以通过CNN提取的特征计算分布相似度:

  • 1. 改造模型提取中间层特征
    截取CNN的特征提取部分,输出用于衡量分布的中间特征(比如全局平均池化层输出):
    import torch.nn as nn
    
    class FeatureExtractor(nn.Module):
        def __init__(self, original_cnn):
            super().__init__()
            # 假设原CNN的特征提取部分到avgpool层为止,根据你的模型结构调整
            self.feature_layers = nn.Sequential(*list(original_cnn.children())[:-1])
        
        def forward(self, x):
            features = self.feature_layers(x)
            return torch.flatten(features, 1)  # 展平为一维特征向量
    
    # 实例化特征提取器
    feature_extractor = FeatureExtractor(model)
    feature_extractor.eval()
    
  • 2. 提取训练集与测试集的特征
    分别遍历两个数据集,提取所有样本的特征:
    import torch
    
    # 提取训练集特征
    train_features = []
    with torch.no_grad():
        for batch in train_loader:
            imgs, _ = batch
            feats = feature_extractor(imgs)
            train_features.append(feats)
    train_features = torch.cat(train_features, dim=0).numpy()
    
    # 提取测试集特征
    test_features = []
    with torch.no_grad():
        for batch in test_loader:
            imgs, _ = batch
            feats = feature_extractor(imgs)
            test_features.append(feats)
    test_features = torch.cat(test_features, dim=0).numpy()
    
  • 3. 计算相似度并转为百分比
    以余弦相似度为例(值越接近1,分布越相似),计算平均相似度后转为百分比:
    from sklearn.metrics.pairwise import cosine_similarity
    
    # 计算所有训练-测试特征对的余弦相似度,取平均值
    similarity_matrix = cosine_similarity(train_features, test_features)
    avg_similarity = similarity_matrix.mean()
    similarity_percentage = avg_similarity * 100
    
    print(f"训练与测试数据特征分布匹配度:{similarity_percentage:.2f}%")
    
    若使用KL散度,需先将特征转为概率分布(如Softmax),结果越小分布越相似,可通过(1 - 归一化KL值)*100转为百分比形式。

内容的提问来源于stack exchange,提问作者Joseph Angelus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 13:06:17