这是一个基于深度学习的猫狗图像分类项目,使用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 # 项目说明
# 运行快速对比实验 (约5-10分钟完成)
python quick_experiment.py
# 或单独测试某个模型
python quick_experiment.py simple_cnn # 最快,约2-3分钟
python quick_experiment.py mobilenet # 平衡,约5-8分钟# 使用默认优化参数 (约15-20分钟)
python main_experiment.py
# 自定义参数
python main_experiment.py --model_type simple_cnn --epochs 10 --n_splits 3- Simple CNN: 自定义轻量级CNN,训练最快 (2-3分钟)
- MobileNetV2: 轻量级预训练模型,平衡速度和精度 (5-8分钟)
- VGG16/ResNet50: 传统预训练模型,精度较高但训练较慢 (15-30分钟)
- 默认图像尺寸: 128x128 (相比224x224减少75%计算量)
- 增大批次大小: 64 (提高GPU利用率)
- 减少训练轮数: 15轮 (配合早停机制)
- 简化数据增强: 减少计算开销
- 减少交叉验证折数: 3折 (相比5折节省40%时间)
- 简化分类头: 减少全连接层数量
- 降低Dropout率: 0.3 (相比0.5减少正则化开销)
- 提高学习率: 0.001 (加快收敛)
- 优化回调函数: 更快的学习率调整和早停
- 简化数据增强策略
- 增大批次大小提高效率
- 减少图像尺寸降低内存占用
- 自动加载和分析数据集
- 优化的图像数据增强
- K折交叉验证数据分割
- 数据可视化和统计
- 支持多种模型(Simple CNN、MobileNet、VGG16、ResNet50)
- 迁移学习和微调
- 轻量级分类头设计
- 模型保存和加载
- 训练时间记录
- 性能监控
- 优化的回调函数管理
- 训练历史可视化
- 全面的性能评估(准确率、精确度、召回率、F1分数、AUC)
- 混淆矩阵分析
- ROC和PR曲线
- 交叉验证结果汇总
- 分层K折交叉验证
- 自动化实验流程
- 结果记录和可视化
- 统计分析
- 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
python main_experiment.py# 快速模式 (推荐)
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--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训练时间会更长
- 实时训练进度
- 每个fold的详细结果
- 交叉验证汇总统计
- 时间和性能指标
results/experiment_YYYYMMDD_HHMMSS/
├── cv_results.json # 交叉验证结果
├── experiment_report.md # 实验报告
├── models/ # 训练好的模型
├── plots/ # 结果图表
└── logs/ # 训练日志
- 数据分布图
- 训练历史曲线
- 性能指标对比
- 混淆矩阵热力图
- 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)
-
内存不足:
- 减小batch_size (64→32→16)
- 使用更小图像尺寸 (128→96→64)
- 选择simple_cnn模型
-
训练过慢:
- 使用quick_experiment.py快速模式
- 选择simple_cnn或mobilenet模型
- 减少epochs和n_splits
- 检查GPU配置
-
精度不满意:
- 使用vgg16或resnet50模型
- 增加图像尺寸到224x224
- 增加训练轮数
- 使用更多数据增强
-
过拟合:
- 增加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
在model_architecture.py中添加新的模型类型
在data_preprocessing.py中修改数据增强策略
在evaluation_metrics.py中扩展评估功能
- Fork项目
- 创建特性分支
- 提交更改
- 推送到分支
- 创建Pull Request
MIT License
如有问题或建议,请创建Issue或联系项目维护者。