modified: .gitignore

modified:   README.md
	new file:   requirement.txt
	new file:   scripts_2/README.md
	new file:   scripts_2/__init__.py
	new file:   scripts_2/__pycache__/__init__.cpython-310.pyc
	new file:   scripts_2/__pycache__/signal_utils.cpython-310.pyc
	new file:   scripts_2/__pycache__/task3_identify.cpython-310.pyc
	new file:   scripts_2/signal_utils.py
	new file:   scripts_2/task3_identify.py
	new file:   scripts_3/README.md
	new file:   scripts_3/__init__.py
	new file:   scripts_3/__pycache__/__init__.cpython-310.pyc
	new file:   scripts_3/__pycache__/task4_predict_freq.cpython-310.pyc
	new file:   scripts_3/task4_predict_freq.py
This commit is contained in:
2026-05-06 16:16:57 +08:00
parent fc8fcc2746
commit 1b3e836d98
15 changed files with 883 additions and 148 deletions

267
README.md
View File

@@ -1,193 +1,164 @@
# 建筑结构响应预测项目
# 建筑结构课程评测代码总览 (Course Evaluation Toolkit)
## 项目概述
## 项目简介
本项目面向建筑结构振动课程评测场景,提供三类核心功能:
本项目使用时间卷积网络Temporal Convolutional Network, TCN模型来预测建筑结构在地震波和简谐激励下的响应。模型基于底部传感器的振动数据预测多个传感器的响应,实现结构健康监测和振动控制
1. 根据基底简谐激励频率,预测模型顶部加速度 Z 向响应的整体均方根 RMS 值
2. 根据顶部自由衰减响应,识别结构一阶自振频率和阻尼比。
3. 根据顶部强迫振动响应,反推出输入简谐波的激振频率。
## 主要特性
项目包含三套脚本目录:`scripts``scripts_2``scripts_3`。三套脚本分别对应 RMS 预测、结构动力特性识别、激振频率逆向预测。
- **多输出预测**基于单个输入传感器预测5个输出传感器的响应
- **时间序列建模**使用TCN处理序列数据支持长距离依赖
- **数据增强**:支持有/无TMD调谐质量阻尼器条件下的数据训练
- **自动化评估**:提供完整的训练和测试流程
## 课程评测流程
教师评测时可按以下流程使用代码:
1. **顶部响应 RMS 预测**
教师进行一组基底激励输入试验。对每组简谐波频率,使用 `scripts` 目录下的脚本预测顶部加速度 Z 向响应的整体 RMS 值。
2. **结构动力参数识别**
教师对模型略微做出改动后,采集顶部自由衰减响应,使用 `scripts_2` 目录下的脚本识别一阶自振频率和阻尼比。
3. **激振频率逆向预测**
教师再次进行一组基底激励输入试验,使用 `scripts_3` 目录下的脚本,根据顶部加速度响应反推输入简谐波的激振频率。
## 项目结构
```
```text
Building-main/
├── src/
── __init__.py
├── config.py # 配置文件,包含模型和训练参数
├── dataset.py # 数据集处理和数据加载器
├── model.py # TCN模型定义
├── train.py # 训练脚本
│ └── evaluate.py # 评估脚本
├── downloads/ # 数据目录
│ ├── Non_TMD/ # 无TMD数据
│ │ ├── train/ # 训练数据
├── val/ # 验证数据
│ │ └── test/ # 测试数据
│ └── TMD/ # 有TMD数据
├── 数据链接.txt # 数据下载链接配置文件
├── download_from_data_links.py # 数据下载脚本
├── best_model.pth # 训练好的模型权重
└── README.md # 项目说明文档
├── downloads/ # 数据目录
── Non_TMD/
├── free_vib/ # 自由衰减数据
├── train/ # 简谐波训练数据
├── val/ # 简谐波验证数据
└── test/ # 其他测试数据
├── scripts/ # 任务 1顶部响应 RMS 预测
├── scripts_2/ # 任务 2自振频率与阻尼比识别
├── scripts_3/ # 任务 3激振频率逆向预测
├── requirement.txt # Python 依赖清单
└── README.md # 总说明文档
```
## 环境要求
## 三套脚本说明
- Python 3.8+
- PyTorch 1.9+
- CUDA可选用于GPU加速
- 其他依赖numpy, pandas, scikit-learn, matplotlib
### `scripts`
该目录用于完成顶部响应 RMS 预测任务。
## 安装依赖
- 输入为基底传感器信号与文件频率标签。
- 输出为顶部加速度 Z 向响应的整体 RMS 预测值。
- 主要脚本包括 `train_final.py``evaluate.py``predict_single.py`
1. 创建虚拟环境:
```bash
python -m venv .venv310
# Windows
.venv310\Scripts\activate
# Linux/Mac
source .venv310/bin/activate
```
### `scripts_2`
该目录用于完成结构动力特性识别任务。
2. 安装依赖:
```bash
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install numpy pandas scikit-learn matplotlib
```
- 数据来源为 `downloads/Non_TMD/free_vib/` 目录下的自由衰减 CSV 文件。
- 使用顶部响应传感器 `WSMS00007``value3` 列。
- 输出一阶自振频率、阻尼比与诊断图像。
## 数据准备
### `scripts_3`
该目录用于完成激振频率逆向预测任务。
### 下载数据
- 使用强迫振动数据,如 `downloads/Non_TMD/val/``downloads/Non_TMD/test/`
- 使用顶部响应传感器 `WSMS00007``value3` 列识别主频。
- 主要脚本为 `task4_predict_freq.py`
运行数据下载脚本从配置文件下载数据:
## 传感器约束
- **顶部响应传感器**
任务 2 和任务 3 统一使用 `WSMS00007``value3` 列。
- **基底输入传感器**
`WSMS00012``value1` 列用于参考与对照。
- **任务 3 频率逆推**
激振频率预测直接基于顶部响应频谱结果。
## 环境准备
项目建议使用 **Python 3.10** 创建新的虚拟环境,再安装根目录的 `requirement.txt`
**1. 创建虚拟环境**
```bash
python download_from_data_links.py
py -3.10 -m venv .venv
```
脚本会从 `数据链接.txt` 中读取下载链接,并将数据保存到 `downloads/` 目录。
### 数据格式
数据为CSV格式的长表结构包含以下字段
- `code`: 传感器编码
- `type`: 数据类型
- `time`: 时间戳
- `value1`, `value2`, `value3`: 三个轴的振动值
### 数据集说明
- **Non_TMD**: 无调谐质量阻尼器条件下的数据
- **TMD**: 安装调谐质量阻尼器条件下的数据
- 包含谐波激励(不同频率和振幅)和地震波激励数据
## 配置说明
主要配置参数在 `src/config.py` 中:
- **数据配置**
- `SEQ_LEN`: 序列长度512
- `STEP_SIZE`: 滑动窗口步长20
- `BATCH_SIZE`: 批大小256
- **传感器配置**
- `INPUT_SENSOR`: 输入传感器编码('WSMS00012'
- `OUTPUT_SENSORS`: 输出传感器编码列表
- `INPUT_AXIS`: 输入轴('value1' - X轴
- `OUTPUT_AXIS`: 输出轴('value3' - Z轴
- **模型配置**
- `CHANNELS`: TCN各层通道数 [64, 64, 128, 128, 256, 256]
- `KERNEL_SIZE`: 卷积核大小5
- `DROPOUT`: Dropout率0.2
- **训练配置**
- `LEARNING_RATE`: 学习率1e-4
- `EPOCHS`: 训练轮数50
- `WEIGHT_DECAY`: 权重衰减1e-3
## 训练模型
### 基本训练
运行训练脚本:
**2. 激活虚拟环境**
```bash
cd src
python train.py
.\.venv\Scripts\activate
```
训练过程会:
1. 加载Non_TMD条件下的训练和验证数据
2. 初始化TCN模型
3. 使用AdamW优化器和学习率调度器训练
4. 保存最佳模型到 `best_model.pth`
### 高级训练选项
修改 `src/config.py` 中的参数来自定义训练:
- 调整学习率、批大小等超参数
- 启用/禁用早停(`ENABLE_EARLY_STOP`
- 修改模型架构参数
## 模型评估
运行评估脚本:
**3. 安装依赖**
```bash
cd src
python evaluate.py
python -m pip install -r requirement.txt
```
评估过程会
1. 加载测试数据
2. 加载训练好的模型权重
3. 对测试数据进行预测
4. 生成可视化结果保存为 `test_results.png`
`requirement.txt` 已包含三套脚本使用到的核心依赖
## 模型架构
- `numpy`
- `pandas`
- `scipy`
- `matplotlib`
- `scikit-learn`
### BuildingTCN
## 使用方法
- **输入**: (batch_size, seq_len, 1) - 底部传感器X轴数据
- **输出**: (batch_size, seq_len, 5) - 5个传感器的Z轴预测
- **架构**: 多层TCN + 线性输出层
### 1. 顶部响应 RMS 预测
对单个简谐波文件预测顶部响应 RMS
### TemporalConvNet
```bash
python scripts\predict_single.py --file downloads\Non_TMD\val\harmonic_5mm_0.75Hz.csv
```
- 使用膨胀卷积dilation实现长距离依赖
- 残差连接保证梯度传播
- 权重归一化提高训练稳定性
对全量样本进行评估:
## 使用说明
```bash
python scripts\evaluate.py
```
### 自定义数据集
如需重新训练模型:
1. 将新数据放入 `downloads/Non_TMD/``downloads/TMD/` 相应子目录
2. 确保数据格式符合要求
3. 修改 `src/config.py` 中的传感器配置(如需要)
4. 重新运行训练脚本
```bash
python scripts\train_final.py
```
### 预测新数据
### 2. 自由衰减法识别自振频率和阻尼比
对自由衰减文件执行识别:
1. 准备输入数据CSV格式
2. 修改 `src/dataset.py` 中的数据加载逻辑
3. 使用加载的模型进行推理
```bash
python scripts_2\task3_identify.py --file downloads\Non_TMD\free_vib\free_decay.csv
```
## 注意事项
脚本输出内容包括:
- 确保数据目录结构正确
- GPU内存不足时可适当减小 `BATCH_SIZE`
- 模型收敛可能需要调整学习率
- 测试数据可视化仅显示第一个batch的第一条序列
- 一阶自振频率 `f_n`
- 对数衰减率 `delta`
- 阻尼比 `zeta`
- 原始波形、滤波结果与包络线图像
## 贡献
### 3. 根据顶部响应反推激振频率
对单个强迫振动文件执行频率逆推:
欢迎提交Issue和Pull Request来改进项目。
```bash
python scripts_3\task4_predict_freq.py --file downloads\Non_TMD\val\harmonic_5mm_0.75Hz.csv
```
## 许可证
脚本输出内容包括:
本项目仅供学习和研究使用。
- 稳态段采样范围
- 预测激振频率
- 文件名中的频率真值
- 绝对误差
- 时域与频域诊断图像
## 结果输出
运行脚本后,图像与评测结果默认保存到 `evaluation_outputs/` 目录下,对应子目录如下:
- `evaluation_outputs/task1_final/`
- `evaluation_outputs/task3_identify/`
- `evaluation_outputs/task4_predict_freq/`
## 说明
- `scripts` 目录负责 RMS 预测。
- `scripts_2` 目录负责自由衰减识别。
- `scripts_3` 目录负责激振频率逆推。
- 数据文件命名中包含频率标签时,脚本会自动提取真值用于误差统计。