Skip to content

Repository files navigation

猫狗分类模型 - K折交叉验证实验 (优化版)

这是一个基于深度学习的猫狗图像分类项目,使用K折交叉验证进行模型训练和评估。已优化训练速度,支持快速实验模式。

项目结构

dogecat/
├── train/                      # 训练数据目录
│   ├── cat.*.jpg              # 猫的图片
│   └── dog.*.jpg              # 狗的图片
├── data_preprocessing.py       # 数据预处理模块
├── model_architecture.py      # 模型架构定义 (支持轻量级模型)
├── training_pipeline.py       # 训练管道
├── evaluation_metrics.py      # 评估指标计算
├── cross_validation.py        # 交叉验证实验
├── main_experiment.py         # 主实验脚本
├── quick_experiment.py        # 快速实验脚本 (推荐)
└── README.md                  # 项目说明

⚡ 快速开始 (推荐)

1. 快速实验模式

# 运行快速对比实验 (约5-10分钟完成)
python quick_experiment.py

# 或单独测试某个模型
python quick_experiment.py simple_cnn    # 最快,约2-3分钟
python quick_experiment.py mobilenet     # 平衡,约5-8分钟

2. 标准实验模式

# 使用默认优化参数 (约15-20分钟)
python main_experiment.py

# 自定义参数
python main_experiment.py --model_type simple_cnn --epochs 10 --n_splits 3

🚀 性能优化特性

1. 多种模型选择

  • Simple CNN: 自定义轻量级CNN,训练最快 (2-3分钟)
  • MobileNetV2: 轻量级预训练模型,平衡速度和精度 (5-8分钟)
  • VGG16/ResNet50: 传统预训练模型,精度较高但训练较慢 (15-30分钟)

2. 训练优化

  • 默认图像尺寸: 128x128 (相比224x224减少75%计算量)
  • 增大批次大小: 64 (提高GPU利用率)
  • 减少训练轮数: 15轮 (配合早停机制)
  • 简化数据增强: 减少计算开销
  • 减少交叉验证折数: 3折 (相比5折节省40%时间)

3. 模型架构优化

  • 简化分类头: 减少全连接层数量
  • 降低Dropout率: 0.3 (相比0.5减少正则化开销)
  • 提高学习率: 0.001 (加快收敛)
  • 优化回调函数: 更快的学习率调整和早停

4. 数据预处理优化

  • 简化数据增强策略
  • 增大批次大小提高效率
  • 减少图像尺寸降低内存占用

功能特性

1. 数据预处理 (data_preprocessing.py)

  • 自动加载和分析数据集
  • 优化的图像数据增强
  • K折交叉验证数据分割
  • 数据可视化和统计

2. 模型架构 (model_architecture.py)

  • 支持多种模型(Simple CNN、MobileNet、VGG16、ResNet50)
  • 迁移学习和微调
  • 轻量级分类头设计
  • 模型保存和加载

3. 训练管道 (training_pipeline.py)

  • 训练时间记录
  • 性能监控
  • 优化的回调函数管理
  • 训练历史可视化

4. 评估指标 (evaluation_metrics.py)

  • 全面的性能评估(准确率、精确度、召回率、F1分数、AUC)
  • 混淆矩阵分析
  • ROC和PR曲线
  • 交叉验证结果汇总

5. 交叉验证 (cross_validation.py)

  • 分层K折交叉验证
  • 自动化实验流程
  • 结果记录和可视化
  • 统计分析

环境要求

Python版本

  • Python 3.7+

主要依赖

tensorflow-gpu==2.10.0
scikit-learn==1.3.0
matplotlib==3.7.2
seaborn==0.13.2
pandas==2.0.3
numpy==1.24.3
pillow==10.4.0

使用方法

1. 基本使用

python main_experiment.py

2. 自定义参数 (优化版)

# 快速模式 (推荐)
python main_experiment.py \
    --model_type mobilenet \
    --n_splits 3 \
    --epochs 15 \
    --batch_size 64 \
    --img_size 128 128

# 高精度模式 (较慢)
python main_experiment.py \
    --model_type vgg16 \
    --n_splits 3 \
    --epochs 20 \
    --batch_size 32 \
    --img_size 224 224

# 超快速模式
python main_experiment.py \
    --model_type simple_cnn \
    --n_splits 3 \
    --epochs 10 \
    --batch_size 128 \
    --img_size 64 64

3. 参数说明

  • --train_dir: 训练数据目录路径
  • --model_type: 模型类型 (simple_cnn, mobilenet, vgg16, resnet50)
  • --n_splits: 交叉验证折数 (推荐3)
  • --epochs: 训练轮数 (推荐10-20)
  • --batch_size: 批次大小 (推荐64-128)
  • --img_size: 图像尺寸 [高度, 宽度] (推荐128x128)
  • --learning_rate: 初始学习率 (推荐0.001)
  • --dropout_rate: Dropout比率 (推荐0.3)
  • --output_dir: 结果输出目录

⏱️ 预期训练时间

模型类型 图像尺寸 批次大小 轮数 预期时间 (3折) 预期精度
Simple CNN 64x64 128 10 2-3分钟 80-85%
MobileNet 128x128 64 15 5-8分钟 85-90%
VGG16 128x128 64 15 10-15分钟 88-92%
VGG16 224x224 32 20 20-30分钟 90-95%

时间基于GTX 1080或同等级GPU,CPU训练时间会更长

实验输出

1. 控制台输出

  • 实时训练进度
  • 每个fold的详细结果
  • 交叉验证汇总统计
  • 时间和性能指标

2. 文件输出

results/experiment_YYYYMMDD_HHMMSS/
├── cv_results.json           # 交叉验证结果
├── experiment_report.md      # 实验报告
├── models/                   # 训练好的模型
├── plots/                    # 结果图表
└── logs/                     # 训练日志

3. 可视化图表

  • 数据分布图
  • 训练历史曲线
  • 性能指标对比
  • 混淆矩阵热力图
  • ROC曲线

实验配置:

  • 交叉验证折数: 5
  • 模型类型: vgg16
  • 随机种子: 42

总体性能指标:

  • 准确率: 0.8945 ± 0.0123
  • 损失: 0.2341 ± 0.0234
  • 精确度: 0.8923 ± 0.0145
  • 召回率: 0.8967 ± 0.0134
  • F1分数: 0.8945 ± 0.0129

时间统计:

  • 平均训练时间: 120.45 ± 5.23 秒
  • 总训练时间: 602.25 秒
  • 实验总耗时: 650.12 秒

各折详细结果: Fold 1: 准确率=0.8923, 训练时间=118.23s Fold 2: 准确率=0.9012, 训练时间=122.45s Fold 3: 准确率=0.8876, 训练时间=119.67s Fold 4: 准确率=0.8967, 训练时间=121.34s Fold 5: 准确率=0.8945, 训练时间=120.56s


## 模型性能

### 预期性能指标
- **准确率**: 85-95%
- **训练时间**: 每fold约2-5分钟(取决于硬件)
- **收敛轮数**: 通常在20-40轮内收敛

### 影响因素
- 数据质量和数量
- 模型复杂度
- 训练参数设置
- 硬件性能(GPU/CPU)
## 实验结果示例

### 快速实验模式输出

猫狗分类模型 - 快速实验模式

简单CNN模型: 平均准确率: 0.8234 平均训练时间: 45.23 秒 总实验时间: 156.78 秒 图像尺寸: (64, 64) 批次大小: 128

MobileNet轻量级模型: 平均准确率: 0.8756 平均训练时间: 89.45 秒 总实验时间: 298.67 秒 图像尺寸: (128, 128) 批次大小: 64

推荐配置: 最高准确率: MobileNet轻量级模型 (准确率: 0.8756) 最快训练: 简单CNN模型 (时间: 156.78 秒)


### 标准实验输出

交叉验证实验总结报告 (快速模式)

实验配置:

  • 交叉验证折数: 3
  • 模型类型: mobilenet
  • 随机种子: 42

总体性能指标:

  • 准确率: 0.8756 ± 0.0089
  • 损失: 0.2845 ± 0.0156
  • 精确度: 0.8734 ± 0.0098
  • 召回率: 0.8778 ± 0.0087
  • F1分数: 0.8756 ± 0.0092

时间统计:

  • 平均训练时间: 89.45 ± 3.21 秒
  • 总训练时间: 268.35 秒
  • 实验总耗时: 298.67 秒

各折详细结果: Fold 1: 准确率=0.8823, 训练时间=87.23s Fold 2: 准确率=0.8734, 训练时间=91.45s Fold 3: 准确率=0.8712, 训练时间=89.67s


## 🎯 模型性能对比

| 模型 | 准确率 | 训练时间 | 参数量 | 推荐场景 |
|------|--------|----------|--------|----------|
| Simple CNN | 80-85% | 最快 | ~500K | 快速原型、学习 |
| MobileNet | 85-90% | 快 | ~2M | 生产环境、移动端 |
| VGG16 | 88-92% | 中等 | ~15M | 高精度需求 |
| ResNet50 | 90-95% | 较慢 | ~25M | 最高精度需求 |

### 优化效果
- **训练时间减少**: 相比原版减少60-80%
- **内存占用减少**: 图像尺寸优化减少75%内存
- **精度保持**: 在合理范围内保持模型精度
- **实验效率**: 3折验证相比5折节省40%时间
================================================================================

实验配置:
- 交叉验证折数: 5
- 模型类型: vgg16
- 随机种子: 42

总体性能指标:
- 准确率: 0.8945 ± 0.0123
- 损失: 0.2341 ± 0.0234
- 精确度: 0.8923 ± 0.0145
- 召回率: 0.8967 ± 0.0134
- F1分数: 0.8945 ± 0.0129

时间统计:
- 平均训练时间: 120.45 ± 5.23 秒
- 总训练时间: 602.25 秒
- 实验总耗时: 650.12 秒

各折详细结果:
Fold 1: 准确率=0.8923, 训练时间=118.23s
Fold 2: 准确率=0.9012, 训练时间=122.45s
Fold 3: 准确率=0.8876, 训练时间=119.67s
Fold 4: 准确率=0.8967, 训练时间=121.34s
Fold 5: 准确率=0.8945, 训练时间=120.56s

模型性能

预期性能指标

  • 准确率: 85-95%
  • 训练时间: 每fold约2-5分钟(取决于硬件)
  • 收敛轮数: 通常在20-40轮内收敛

影响因素

  • 数据质量和数量
  • 模型复杂度
  • 训练参数设置
  • 硬件性能(GPU/CPU)

🔧 故障排除

常见问题及解决方案

  1. 内存不足:

    • 减小batch_size (64→32→16)
    • 使用更小图像尺寸 (128→96→64)
    • 选择simple_cnn模型
  2. 训练过慢:

    • 使用quick_experiment.py快速模式
    • 选择simple_cnn或mobilenet模型
    • 减少epochs和n_splits
    • 检查GPU配置
  3. 精度不满意:

    • 使用vgg16或resnet50模型
    • 增加图像尺寸到224x224
    • 增加训练轮数
    • 使用更多数据增强
  4. 过拟合:

    • 增加dropout率到0.5
    • 减少模型复杂度
    • 使用更多数据增强

快速调试建议

# 超快速测试 (1-2分钟)
python quick_experiment.py simple_cnn

# 检查数据加载
python data_preprocessing.py

# 测试单个模型
python -c "from model_architecture import CatDogClassifier; c=CatDogClassifier(model_type='simple_cnn'); c.create_model(); print('模型创建成功')"

性能调优建议

  • CPU训练: 使用simple_cnn + 64x64图像
  • GPU训练: 使用mobilenet + 128x128图像
  • 高精度需求: 使用vgg16 + 224x224图像
  • 快速验证: 使用n_splits=3, epochs=10

扩展功能

1. 添加新的预训练模型

model_architecture.py中添加新的模型类型

2. 自定义数据增强

data_preprocessing.py中修改数据增强策略

3. 添加新的评估指标

evaluation_metrics.py中扩展评估功能

贡献指南

  1. Fork项目
  2. 创建特性分支
  3. 提交更改
  4. 推送到分支
  5. 创建Pull Request

许可证

MIT License

联系方式

如有问题或建议,请创建Issue或联系项目维护者。

Releases

Packages

Contributors

Languages