# 情绪与生理状态变化预测模型 - 完整使用教程 ## 目录 1. [项目概述](#项目概述) 2. [安装指南](#安装指南) 3. [快速开始](#快速开始) 4. [数据准备](#数据准备) 5. [模型训练](#模型训练) 6. [模型推理](#模型推理) 7. [配置文件](#配置文件) 8. [命令行工具](#命令行工具) 9. [常见问题](#常见问题) 10. [故障排除](#故障排除) ## 项目概述 本项目是一个基于深度学习的情绪与生理状态变化预测模型,使用多层感知机(MLP)来预测用户情绪和生理状态的变化。 ### 核心功能 - **输入**: 7维特征(User PAD 3维 + Vitality 1维 + Current PAD 3维) - **输出**: 3维预测(ΔPAD:ΔPleasure, ΔArousal, ΔDominance) - **模型**: 多层感知机(MLP)架构 - **支持**: 训练、推理、评估、性能基准测试 ### 技术栈 - **深度学习框架**: PyTorch - **数据处理**: NumPy, Pandas - **可视化**: Matplotlib, Seaborn - **配置管理**: YAML - **命令行界面**: argparse ## 安装指南 ### 系统要求 - Python 3.8 或更高版本 - CUDA支持(可选,用于GPU加速) ### 安装步骤 1. **克隆项目** ```bash git clone cd ann-playground ``` 2. **创建虚拟环境** ```bash python -m venv venv source venv/bin/activate # Linux/Mac # 或 venv\Scripts\activate # Windows ``` 3. **安装依赖** ```bash pip install -r requirements.txt ``` 4. **验证安装** ```bash python -c "import torch; print('PyTorch version:', torch.__version__)" python -c "from src.models.pad_predictor import PADPredictor; print('Model import successful')" ``` ### 依赖包说明 核心依赖: - `torch`: 深度学习框架 - `numpy`: 数值计算 - `pandas`: 数据处理 - `matplotlib`, `seaborn`: 数据可视化 - `scikit-learn`: 机器学习工具 - `loguru`: 日志记录 - `pyyaml`: 配置文件解析 - `scipy`: 科学计算 ## 快速开始 ### 1. 运行快速开始教程 最简单的方式是运行快速开始教程: ```bash cd examples python quick_start.py ``` 这将自动完成: - 生成合成训练数据 - 训练一个基础模型 - 进行推理预测 - 解释预测结果 ### 2. 使用预训练模型 如果你有预训练的模型文件,可以直接进行推理: ```python from src.utils.inference_engine import create_inference_engine # 创建推理引擎 engine = create_inference_engine( model_path="path/to/model.pth", preprocessor_path="path/to/preprocessor.pkl" ) # 进行预测 input_data = [0.5, 0.3, -0.2, 75.0, 0.1, 0.4, -0.1] result = engine.predict(input_data) print(result) ``` ### 3. 使用命令行工具 项目提供了完整的命令行工具: ```bash # 训练模型 python -m src.cli.main train --config configs/training_config.yaml # 进行预测 python -m src.cli.main predict --model model.pth --quick 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 # 评估模型 python -m src.cli.main evaluate --model model.pth --data test_data.csv # 推理脚本 python -m src.cli.main inference --model model.pth --input-cli 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 # 性能基准测试 python -m src.cli.main benchmark --model model.pth --num-samples 1000 ``` ## 数据准备 ### 数据格式 #### 输入特征(7维) | 特征名 | 类型 | 范围 | 说明 | |--------|------|------|------| | user_pleasure | float | [-1, 1] | 用户快乐度 | | user_arousal | float | [-1, 1] | 用户激活度 | | user_dominance | float | [-1, 1] | 用户支配度 | | vitality | float | [0, 100] | 活力水平 | | current_pleasure | float | [-1, 1] | 当前快乐度 | | current_arousal | float | [-1, 1] | 当前激活度 | | current_dominance | float | [-1, 1] | 当前支配度 | #### 输出标签(3维) | 标签名 | 类型 | 范围 | 说明 | |--------|------|------|------| | delta_pleasure | float | [-0.5, 0.5] | 快乐度变化量 | | delta_arousal | float | [-0.5, 0.5] | 激活度变化量 | | delta_dominance | float | [-0.5, 0.5] | 支配度变化量 | | delta_pressure | float | [-0.3, 0.3] | 压力变化量 | | confidence | float | [0, 1] | 预测置信度 | ### 数据文件格式 #### CSV格式 ```csv user_pleasure,user_arousal,user_dominance,vitality,current_pleasure,current_arousal,current_dominance,delta_pleasure,delta_arousal,delta_dominance,delta_pressure,confidence 0.5,0.3,-0.2,80.0,0.1,0.4,-0.1,-0.05,0.02,0.03,-0.02,0.85 -0.3,0.6,0.2,45.0,-0.1,0.7,0.1,0.08,-0.03,-0.01,0.05,0.72 ... ``` #### JSON格式 ```json [ { "user_pleasure": 0.5, "user_arousal": 0.3, "user_dominance": -0.2, "vitality": 80.0, "current_pleasure": 0.1, "current_arousal": 0.4, "current_dominance": -0.1, "delta_pleasure": -0.05, "delta_arousal": 0.02, "delta_dominance": 0.03, "delta_pressure": -0.02, "confidence": 0.85 }, ... ] ``` ### 合成数据生成 项目提供了合成数据生成器: ```python from src.data.synthetic_generator import SyntheticDataGenerator # 创建数据生成器 generator = SyntheticDataGenerator(num_samples=1000, seed=42) # 生成数据 features, labels = generator.generate_data() # 保存数据 generator.save_data(features, labels, "output_data.csv", format='csv') ``` ### 数据预处理 ```python from src.data.preprocessor import DataPreprocessor # 创建预处理器 preprocessor = DataPreprocessor() # 拟合预处理器 preprocessor.fit(train_features, train_labels) # 转换数据 processed_features, processed_labels = preprocessor.transform(features, labels) # 保存预处理器 preprocessor.save("preprocessor.pkl") ``` ## 模型训练 ### 基础训练 ```python from src.models.pad_predictor import PADPredictor from src.utils.trainer import ModelTrainer from torch.utils.data import DataLoader, TensorDataset # 创建模型 model = PADPredictor( input_dim=7, output_dim=3, hidden_dims=[128, 64, 32], dropout_rate=0.3 ) # 创建数据加载器 dataset = TensorDataset( torch.FloatTensor(processed_features), torch.FloatTensor(processed_labels) ) train_loader = DataLoader(dataset, batch_size=32, shuffle=True) # 创建训练器 trainer = ModelTrainer(model, preprocessor) # 训练配置 config = { 'epochs': 100, 'learning_rate': 0.001, 'weight_decay': 1e-4, 'patience': 10, 'save_dir': './models' } # 开始训练 history = trainer.train(train_loader, val_loader, config) ``` ### 使用配置文件训练 创建训练配置文件 `my_training_config.yaml`: ```yaml training: epochs: 100 learning_rate: 0.001 weight_decay: 0.0001 batch_size: 32 optimizer: type: "Adam" lr: 0.001 weight_decay: 0.0001 scheduler: type: "ReduceLROnPlateau" patience: 5 factor: 0.5 early_stopping: patience: 10 min_delta: 0.001 data: train_ratio: 0.8 val_ratio: 0.1 test_ratio: 0.1 shuffle: True seed: 42 ``` 运行训练: ```bash python -m src.cli.main train --config my_training_config.yaml ``` ### 训练监控 训练过程中会自动保存: - 最佳模型检查点 - 训练历史记录 - 验证指标 - 学习率变化 可视化训练过程: ```python import matplotlib.pyplot as plt # 绘制损失曲线 plt.figure(figsize=(10, 6)) plt.plot(history['train_loss'], label='Training Loss') plt.plot(history['val_loss'], label='Validation Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.show() ``` ### 模型评估 ```python from src.models.metrics import RegressionMetrics # 创建指标计算器 metrics_calculator = RegressionMetrics() # 计算指标 metrics = metrics_calculator.calculate_all_metrics( true_labels, predictions ) print(f"MSE: {metrics['mse']:.4f}") print(f"MAE: {metrics['mae']:.4f}") print(f"R²: {metrics['r2']:.4f}") ``` ## 模型推理 ### 单样本推理 ```python from src.utils.inference_engine import create_inference_engine # 创建推理引擎 engine = create_inference_engine( model_path="models/best_model.pth", preprocessor_path="models/preprocessor.pkl" ) # 单样本预测 input_data = [0.5, 0.3, -0.2, 75.0, 0.1, 0.4, -0.1] result = engine.predict(input_data) print(f"ΔPAD: {result['delta_pad']}") print(f"ΔPressure: {result['delta_pressure']}") print(f"Confidence: {result['confidence']}") ``` ### 批量推理 ```python # 批量预测 batch_inputs = [ [0.5, 0.3, -0.2, 75.0, 0.1, 0.4, -0.1], [-0.3, 0.6, 0.2, 45.0, -0.1, 0.7, 0.1], [0.8, -0.4, 0.6, 90.0, 0.7, -0.3, 0.5] ] batch_results = engine.predict_batch(batch_inputs) for i, result in enumerate(batch_results): print(f"Sample {i+1}: {result}") ``` ### 从文件推理 ```python import pandas as pd # 从CSV文件读取输入 input_df = pd.read_csv('input_data.csv') results = engine.predict_batch(input_df.values.tolist()) # 保存结果 output_df = pd.DataFrame(results) output_df.to_csv('output_results.csv', index=False) ``` ### 性能优化 ```python # 预热模型(提高首次推理速度) for _ in range(5): engine.predict([0.5, 0.3, -0.2, 75.0, 0.1, 0.4, -0.1]) # 性能基准测试 stats = engine.benchmark(num_samples=1000, batch_size=32) print(f"Throughput: {stats['throughput']:.2f} samples/sec") print(f"Average latency: {stats['avg_latency']:.2f}ms") ``` ## 配置文件 ### 模型配置 (`configs/model_config.yaml`) ```yaml # 模型基本信息 model_info: name: "MLP_Emotion_Predictor" type: "MLP" version: "1.0" # 输入输出维度 dimensions: input_dim: 7 output_dim: 3 # 网络架构参数 architecture: hidden_layers: - size: 128 activation: "ReLU" dropout: 0.2 - size: 64 activation: "ReLU" dropout: 0.2 - size: 32 activation: "ReLU" dropout: 0.1 output_layer: activation: "Linear" # 初始化参数 initialization: weight_init: "xavier_uniform" bias_init: "zeros" # 正则化参数 regularization: weight_decay: 0.0001 dropout_config: type: "standard" rate: 0.2 ``` ### 训练配置 (`configs/training_config.yaml`) ```yaml # 训练参数 training: epochs: 100 learning_rate: 0.001 weight_decay: 0.0001 batch_size: 32 seed: 42 # 优化器配置 optimizer: type: "Adam" lr: 0.001 weight_decay: 0.0001 betas: [0.9, 0.999] # 学习率调度器 scheduler: type: "ReduceLROnPlateau" patience: 5 factor: 0.5 min_lr: 1e-6 # 早停配置 early_stopping: patience: 10 min_delta: 0.001 monitor: "val_loss" # 数据配置 data: train_ratio: 0.8 val_ratio: 0.1 test_ratio: 0.1 shuffle: True num_workers: 4 # 保存配置 saving: save_dir: "./outputs" save_best_only: True checkpoint_interval: 10 ``` ### 数据配置 (`configs/data_config.yaml`) ```yaml # 数据路径配置 paths: train_data: "data/train.csv" val_data: "data/val.csv" test_data: "data/test.csv" # 数据预处理配置 preprocessing: normalize_features: True normalize_labels: True feature_scaler: "standard" # standard, minmax, robust label_scaler: "standard" # 数据增强配置 augmentation: enabled: False noise_std: 0.01 augmentation_factor: 2 # 合成数据配置 synthetic_data: num_samples: 1000 seed: 42 add_noise: True add_correlations: True ``` ## 命令行工具 ### 训练命令 ```bash # 基础训练 python -m src.cli.main train --config configs/training_config.yaml # 指定输出目录 python -m src.cli.main train --config configs/training_config.yaml --output-dir ./my_models # 使用GPU训练 python -m src.cli.main train --config configs/training_config.yaml --device cuda # 从检查点恢复训练 python -m src.cli.main train --config configs/training_config.yaml --resume checkpoints/epoch_50.pth # 覆盖配置参数 python -m src.cli.main train --config configs/training_config.yaml --epochs 200 --batch-size 64 --learning-rate 0.0005 ``` ### 预测命令 ```bash # 交互式预测 python -m src.cli.main predict --model model.pth --interactive # 快速预测 python -m src.cli.main predict --model model.pth --quick 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 # 批量预测 python -m src.cli.main predict --model model.pth --batch input.csv --output results.csv # 指定预处理器 python -m src.cli.main predict --model model.pth --preprocessor preprocessor.pkl --quick 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 ``` ### 评估命令 ```bash # 基础评估 python -m src.cli.main evaluate --model model.pth --data test_data.csv # 生成详细报告 python -m src.cli.main evaluate --model model.pth --data test_data.csv --report evaluation_report.html # 指定评估指标 python -m src.cli.main evaluate --model model.pth --data test_data.csv --metrics mse mae r2 # 自定义批次大小 python -m src.cli.main evaluate --model model.pth --data test_data.csv --batch-size 64 ``` ### 推理命令 ```bash # 命令行输入推理 python -m src.cli.main inference --model model.pth --input-cli 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 # JSON文件推理 python -m src.cli.main inference --model model.pth --input-json input.json --output-json output.json # CSV文件推理 python -m src.cli.main inference --model model.pth --input-csv input.csv --output-csv output.csv # 基准测试 python -m src.cli.main inference --model model.pth --benchmark --num-samples 1000 # 静默模式 python -m src.cli.main inference --model model.pth --input-cli 0.5 0.3 -0.2 75.0 0.1 0.4 -0.1 --quiet ``` ### 基准测试命令 ```bash # 标准基准测试 python -m src.cli.main benchmark --model model.pth # 自定义测试参数 python -m src.cli.main benchmark --model model.pth --num-samples 5000 --batch-size 64 # 生成性能报告 python -m src.cli.main benchmark --model model.pth --report performance_report.json # 详细输出 python -m src.cli.main benchmark --model model.pth --verbose ``` ## 常见问题 ### Q1: 如何处理缺失值? A: 项目目前不支持缺失值处理。请在数据预处理阶段使用以下方法: ```python # 删除包含缺失值的行 df = df.dropna() # 或填充缺失值 df = df.fillna(df.mean()) # 用均值填充 df = df.fillna(0) # 用0填充 ``` ### Q2: 如何自定义模型架构? A: 有两种方式自定义模型架构: **方式1:修改配置文件** ```yaml # 在 model_config.yaml 中修改 architecture: hidden_layers: - size: 256 # 增加神经元数量 activation: "ReLU" dropout: 0.3 - size: 128 activation: "ReLU" dropout: 0.2 - size: 64 activation: "ReLU" dropout: 0.1 ``` **方式2:直接创建模型** ```python from src.models.pad_predictor import PADPredictor model = PADPredictor( input_dim=7, output_dim=3, hidden_dims=[256, 128, 64, 32], # 自定义隐藏层 dropout_rate=0.3 ) ``` ### Q3: 如何处理类别特征? A: 当前版本只支持数值特征。如果有类别特征,需要先进行编码: ```python # One-Hot编码 df_encoded = pd.get_dummies(df, columns=['category_column']) # 或标签编码 from sklearn.preprocessing import LabelEncoder le = LabelEncoder() df['category_encoded'] = le.fit_transform(df['category_column']) ``` ### Q4: 如何提高模型性能? A: 尝试以下方法: 1. **增加训练数据量** 2. **调整模型架构**(增加层数或神经元数量) 3. **优化超参数**(学习率、批次大小等) 4. **数据增强**(添加噪声或合成数据) 5. **正则化**(调整dropout、weight_decay) 6. **早停**(防止过拟合) ### Q5: 如何部署模型到生产环境? A: 推荐的部署方式: 1. **保存模型和预处理器** 2. **创建推理服务** 3. **使用FastAPI或Flask封装** 4. **容器化部署** 示例: ```python from fastapi import FastAPI from src.utils.inference_engine import create_inference_engine app = FastAPI() engine = create_inference_engine("model.pth", "preprocessor.pkl") @app.post("/predict") async def predict(input_data: list): result = engine.predict(input_data) return result ``` ### Q6: 如何处理大规模数据? A: 对于大规模数据: 1. **使用数据生成器**(DataGenerator) 2. **分批处理** 3. **使用多进程数据加载** 4. **考虑使用分布式训练** ```python # 使用多进程数据加载 train_loader = DataLoader( dataset, batch_size=32, shuffle=True, num_workers=4, # 多进程 pin_memory=True # GPU内存优化 ) ``` ### Q7: 如何可视化预测结果? A: 项目提供了多种可视化方法: ```python import matplotlib.pyplot as plt import seaborn as sns # 预测值vs真实值散点图 plt.scatter(true_labels, predictions, alpha=0.6) plt.plot([min_val, max_val], [min_val, max_val], 'r--') plt.xlabel('True Values') plt.ylabel('Predictions') plt.show() # 残差图 residuals = true_labels - predictions plt.hist(residuals, bins=30) plt.xlabel('Residuals') plt.ylabel('Frequency') plt.show() ``` ### Q8: 如何进行模型版本管理? A: 建议的版本管理策略: 1. **使用语义化版本号** 2. **保存训练配置和超参数** 3. **记录模型性能指标** 4. **使用模型注册表** ```python # 保存模型信息 model_info = { 'version': '1.2.0', 'architecture': str(model), 'training_config': config, 'performance': metrics, 'created_at': datetime.now().isoformat() } torch.save({ 'model_state_dict': model.state_dict(), 'model_info': model_info }, f'model_v{model_info["version"]}.pth') ``` ## 故障排除 ### 常见错误及解决方案 #### 1. CUDA内存不足 ``` RuntimeError: CUDA out of memory ``` **解决方案**: - 减小批次大小 - 使用CPU训练:`--device cpu` - 清理GPU缓存:`torch.cuda.empty_cache()` #### 2. 模型加载失败 ``` FileNotFoundError: [Errno 2] No such file or directory: 'model.pth' ``` **解决方案**: - 检查文件路径是否正确 - 确保模型文件存在 - 检查文件权限 #### 3. 数据维度不匹配 ``` RuntimeError: mat1 and mat2 shapes cannot be multiplied ``` **解决方案**: - 检查输入数据维度(应为7维) - 确保数据预处理正确 - 验证模型配置 #### 4. 导入错误 ``` ModuleNotFoundError: No module named 'src.xxx' ``` **解决方案**: - 检查Python路径设置 - 确保在项目根目录运行 - 重新安装依赖包 #### 5. 配置文件错误 ``` yaml.scanner.ScannerError: while scanning for the next token ``` **解决方案**: - 检查YAML文件语法 - 确保缩进正确 - 使用YAML验证工具 ### 调试技巧 #### 1. 启用详细日志 ```bash python -m src.cli.main train --config configs/training_config.yaml --verbose --log-level DEBUG ``` #### 2. 使用小数据集测试 ```python # 使用少量数据快速测试 generator = SyntheticDataGenerator(num_samples=100, seed=42) features, labels = generator.generate_data() ``` #### 3. 检查模型输出 ```python # 检查模型输出形状 model.eval() with torch.no_grad(): sample_input = torch.randn(1, 7) output = model(sample_input) print(f"Output shape: {output.shape}") print(f"Output range: [{output.min():.3f}, {output.max():.3f}]") ``` #### 4. 验证数据预处理 ```python # 检查预处理后的数据 print(f"Features mean: {processed_features.mean(axis=0)}") print(f"Features std: {processed_features.std(axis=0)}") print(f"Labels mean: {processed_labels.mean(axis=0)}") print(f"Labels std: {processed_labels.std(axis=0)}") ``` ### 性能优化建议 #### 1. 训练优化 - 使用合适的批次大小 - 启用混合精度训练(AMP) - 使用学习率调度器 - 实施早停机制 #### 2. 推理优化 - 模型预热 - 批量推理 - 模型量化 - 使用ONNX格式 #### 3. 内存优化 - 使用数据生成器 - 及时释放不需要的变量 - 使用梯度累积 --- ## 联系方式 如有其他问题或需要帮助,请通过以下方式联系: - 项目仓库: [GitHub仓库链接] - 问题反馈: [Issues链接] - 文档: [文档链接] - 邮箱: [联系邮箱] --- **注意**: 本教程基于项目当前版本编写,随着项目更新,部分内容可能会有变化。请及时查看最新文档。