PyTorch 基础编程教学:从零搭建深度学习代码框架
深度学习技术落地离不开代码实现,PyTorch 凭借动态图机制、简洁友好的API以及强大的生态,成为科研与工业界最主流的框架之一。很多初学者在入门时会遇到一个难题:零散学会张量、自动微分等知识点,但无法串联起来,独立写出一套完整可运行的深度学习训练代码。
本文将从最基础的概念出发,手把手带你从零搭建一套深度学习代码框架,不堆砌复杂模型,聚焦代码结构规范,让你理解深度学习项目的标准开发流程。
## 一、环境准备与PyTorch安装
在写代码之前,首先配置开发环境。推荐使用Anaconda创建独立虚拟环境,避免不同包之间版本冲突。
```bash
# 创建虚拟环境
conda create -n torch_env python=3.10
conda activate torch_env
# 安装PyTorch,可根据CUDA版本去官网修改命令
pip3 install torch torchvision torchaudio
```
安装完成后,打开Python终端验证是否安装成功:
```python
import torch
# 查看torch版本
print(torch.__version__)
# 检查GPU是否可用
print(torch.cuda.is_available())
```
如果输出`True`代表CUDA可用,可以利用GPU加速后续模型训练;如果是CPU环境,代码依然可以正常运行,只是训练速度会慢一些。
## 二、深度学习代码框架整体结构
一套标准的深度学习代码,一般分为5大模块,这也是我们本次搭建框架的核心:
1. **数据加载模块**:数据集读取、预处理、分批加载
2. **模型定义模块**:搭建神经网络结构
3. **损失函数与优化器**:定义目标函数,设置参数更新策略
4. **训练循环模块**:前向传播、计算损失、反向传播、参数更新
5. **验证模块**:在验证集评估模型效果,监控过拟合
> 核心思想:将不同功能解耦,每个模块各司其职,后续更换数据集、修改网络结构时,不需要大面积改写代码。
## 三、分步实现完整代码框架
### 1. 导入依赖库
```python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
```
### 2. 构造数据集与DataLoader(数据模块)
DataLoader是PyTorch数据流水线的核心,负责批量读取、打乱数据,支持多线程加载。这里我们构造一份简单的模拟数据集演示流程,你后续可以替换成MNIST、CIFAR等真实数据集。
```python
# 构造模拟输入与标签
X = torch.randn(1000, 10) # 1000条样本,每条样本10个特征
y = torch.randint(0, 2, (1000,)) # 二分类标签0/1
# 划分训练集、验证集
train_dataset = TensorDataset(X[:800], y[:800])
val_dataset = TensorDataset(X[800:], y[800:])
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)
```
`shuffle=True`代表训练集每轮epoch都会打乱顺序,防止模型记住样本顺序;验证集不需要打乱。
### 3. 定义神经网络模型(模型模块)
推荐继承`nn.Module`来定义模型,这是PyTorch标准写法。在`__init__`里定义网络层,`forward`函数实现数据前向传播逻辑。
```python
class SimpleNet(nn.Module):
def __init__(self, input_dim):
super().__init__()
self.layers = nn.Sequential(
nn.Linear(input_dim, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 2)
)
def forward(self, x):
return self.layers(x)
# 初始化模型
model = SimpleNet(input_dim=10)
```
### 4. 损失函数与优化器配置
任务是二分类,使用交叉熵损失;优化器选择Adam,学习率设置超参。
```python
# 损失函数
criterion = nn.CrossEntropyLoss()
# 优化器,传入模型参数与学习率
optimizer = optim.Adam(model.parameters(), lr=1e-3)
```
### 5. 训练+验证循环
训练循环是整个框架的核心,每一轮训练固定流程:
1. 从DataLoader取出一批数据
2. 模型前向传播得到预测值
3. 计算损失
4. 梯度清零 → 反向传播求梯度 → 优化器更新参数
验证阶段不需要计算梯度,使用`torch.no_grad()`关闭梯度计算,节省显存。
```python
def train_one_epoch(model, loader, criterion, optimizer, device):
model.train()
total_loss = 0
for batch_x, batch_y in loader:
batch_x, batch_y = batch_x.to(device), batch_y.to(device)
# 前向传播
pred = model(batch_x)
loss = criterion(pred, batch_y)
# 反向传播更新参数
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
return total_loss / len(loader)
def val_one_epoch(model, loader, criterion, device):
model.eval()
total_loss = 0
with torch.no_grad():
for batch_x, batch_y in loader:
batch_x, batch_y = batch_x.to(device), batch_y.to(device)
pred = model(batch_x)
loss = criterion(pred, batch_y)
total_loss += loss.item()
return total_loss / len(loader)
# 设备自动选择
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
# 开始训练
epoch_num = 20
for epoch in range(epoch_num):
train_loss = train_one_epoch(model, train_loader, criterion, optimizer, device)
val_loss = val_one_epoch(model, val_loader, criterion, device)
print(f"Epoch[{epoch+1:2d}] | Train Loss: {train_loss:.4f} | Val Loss: {val_loss:.4f}")
```
## 四、代码框架拓展思路
上面这份代码是最小可用版本,掌握基础结构之后,你可以继续扩展功能:
1. **模型保存与加载**:使用`torch.save()`保存模型权重,训练中断后可以继续训练
```python
# 保存
torch.save(model.state_dict(), "model.pth")
# 加载
model.load_state_dict(torch.load("model.pth"))
```
2. **增加指标计算**:在验证阶段增加准确率、召回率等评估指标,不只看loss
3. **学习率调度器**:使用`torch.optim.lr_scheduler`动态调整学习率
4. **替换真实数据集**:继承`torch.utils.data.Dataset`自定义数据集,加载图片、文本等真实数据
5. **增加日志记录**:搭配TensorBoard记录训练曲线,可视化loss变化
## 五、新手常见踩坑点
1. **训练集和验证集模式混淆**:训练时`model.train()`,验证时`model.eval()`,忘记切换会影响Dropout、BN层行为。
2. **梯度累积**:每次循环必须写`optimizer.zero_grad()`,否则梯度会不断累加,参数更新异常。
3. **数据设备不匹配**:数据和模型要放到同一个设备(CPU/GPU),否则会报张量设备不匹配错误。
4. **验证阶段没有关闭梯度**:不使用`torch.no_grad()`会占用大量显存,训练大模型时容易OOM。
## 总结
本文搭建的这套PyTorch深度学习代码框架,不是针对某个特定任务的一次性脚本,而是一套可复用的基础模板。所有复杂深度学习项目,本质上都是在这个基础框架上做扩展:更换网络结构、修改数据预处理、调整损失函数、增加更多评估逻辑。
学习PyTorch,不要只停留在看懂API的阶段。动手运行这份完整代码,修改超参、观察loss变化,理解每一行代码在整个训练链路中的作用,你才能真正掌握深度学习编程。
https://github.com/cvdfsl9002/hmhgmh-45645/commit/6f88a3c356517420c368a9213f7a6400ac9c1d23
https://github.com/cvdfsl9002/hmhgmh-45645/commit/ad6f675dae2e5544623cc5047f69096a38a78936
https://github.com/cvdfsl9002/hmhgmh-45645/commit/2cab0f77d6c49b970e19a9b887350480538d5d2b
https://github.com/cvdfsl9002/hmhgmh-45645/commit/6f65ab273143a572bb00728820a9473def7f08fc
https://github.com/cvdfsl9002/hmhgmh-45645/commit/2cedac490a3be9f61d085adaa9980abbc8fb2938
https://github.com/cvdfsl9002/hmhgmh-45645/commit/dbd2f0a191864f233e7aaa42ae9dd7115911c710
https://github.com/cvdfsl9002/hmhgmh-45645/commit/64e10a2a7b28933ff2df1b06a0512c31767a2203
https://github.com/cvdfsl9002/hmhgmh-45645/commit/7686534d0fa35cac2e6364b09623f9af7ba08dc2
https://github.com/cvdfsl9002/hmhgmh-45645/commit/748894f04e46c73129b1c30f0e11b81a0dbe8703
https://github.com/cvdfsl9002/hmhgmh-45645/commit/e62318c163798c1b2343a4af7f7f54ade596df4e
https://github.com/cvdfsl9002/hmhgmh-45645/commit/e4e5f9fe5f0a5e26bb90831dfcabb72c2595ad8a
https://github.com/cvdfsl9002/hmhgmh-45645/commit/8688bd9c16d67efc79aec9eeb5617384515008e3
https://github.com/cvdfsl9002/hmhgmh-45645/commit/0811536a17803141d37e0db827ff4f883d44e7cd
https://github.com/cvdfsl9002/hmhgmh-45645/commit/818f64b9980ace5bd267db4c8475be1442f161f5
https://github.com/cvdfsl9002/hmhgmh-45645/commit/577635bc9b6acea44fa1a2ae999318ce6ce8c575
https://www.v-tianjin.com/user/7801
https://www.v-tianjin.com/user/7586
https://www.v-tianjin.com/user/8276
https://www.v-tianjin.com/user/9042
https://www.v-tianjin.com/user/1407
https://www.v-tianjin.com/user/2367
https://www.v-tianjin.com/user/1467
https://www.v-tianjin.com/user/9957
https://www.v-tianjin.com/user/3107
https://www.v-tianjin.com/user/9303
https://www.v-tianjin.com/user/5869
https://www.v-tianjin.com/user/9878
https://www.v-tianjin.com/user/6237
https://www.v-tianjin.com/user/5491
https://www.v-tianjin.com/user/4286
https://www.v-tianjin.com/user/9447
https://www.v-tianjin.com/user/4205
https://www.v-tianjin.com/user/4290
https://www.v-tianjin.com/user/9454
https://www.v-tianjin.com/user/3216
https://www.v-tianjin.com/user/3668
https://www.v-tianjin.com/user/2859
https://www.v-tianjin.com/user/2999
https://www.v-tianjin.com/user/8315
https://www.v-tianjin.com/user/1799
https://www.v-tianjin.com/user/9054
https://www.v-tianjin.com/user/2206
https://www.v-tianjin.com/user/8818
https://www.v-tianjin.com/user/8238
https://www.v-tianjin.com/user/1487
https://www.v-tianjin.com/user/2786
https://www.v-tianjin.com/user/7880
https://www.v-tianjin.com/user/1019
https://www.v-tianjin.com/user/6937
https://www.v-tianjin.com/user/6607
https://www.v-tianjin.com/user/7342
https://www.v-tianjin.com/user/3461
https://www.v-tianjin.com/user/5778
https://www.v-tianjin.com/user/9748
https://www.v-tianjin.com/user/1856
https://www.v-tianjin.com/user/5205
https://www.v-tianjin.com/user/5862
https://www.v-tianjin.com/user/5694
https://www.v-tianjin.com/user/5752
https://www.v-tianjin.com/user/6128
https://www.v-tianjin.com/user/9223
https://www.v-tianjin.com/user/25711
https://www.v-tianjin.com/user/6916
https://www.v-tianjin.com/user/9643
https://www.v-tianjin.com/user/52221
https://www.v-tianjin.com/user/7329
https://www.v-tianjin.com/user/2286
https://www.v-tianjin.com/user/4549
https://www.v-tianjin.com/user/6244
https://www.v-tianjin.com/user/1110
https://www.v-tianjin.com/user/68841
https://www.v-tianjin.com/user/7334
https://www.v-tianjin.com/user/6593
https://www.v-tianjin.com/user/8494
https://www.v-tianjin.com/user/9773
https://www.v-tianjin.com/user/6383
https://www.v-tianjin.com/user/88591
https://www.v-tianjin.com/user/5189
https://www.v-tianjin.com/user/3877
https://www.v-tianjin.com/user/9044
https://www.v-tianjin.com/user/42081
https://www.v-tianjin.com/user/1989
https://www.v-tianjin.com/user/1268
https://www.v-tianjin.com/user/6228
https://www.v-tianjin.com/user/5955
https://www.v-tianjin.com/user/8270
https://www.v-tianjin.com/user/8928
https://www.v-tianjin.com/user/9220
https://www.v-tianjin.com/user/2154
https://www.v-tianjin.com/user/6080
https://www.v-tianjin.com/user/5127
https://www.v-tianjin.com/user/7026
https://www.v-tianjin.com/user/4007
https://www.v-tianjin.com/user/8294
https://www.v-tianjin.com/user/1901
https://www.v-tianjin.com/user/9513
https://www.v-tianjin.com/user/9389
https://www.v-tianjin.com/user/9363
https://www.v-tianjin.com/user/8827
https://www.v-tianjin.com/user/5853
https://www.v-tianjin.com/user/7586/questions
https://www.v-tianjin.com/user/3877/follows
https://www.v-tianjin.com/user/9054/follows
https://www.v-tianjin.com/user/7329/follows
https://www.v-tianjin.com/user/5127/favorites
https://www.v-tianjin.com/user/1901/follows
https://www.v-tianjin.com/user/9363/follows
https://www.v-tianjin.com/user/42081/follows
https://www.v-tianjin.com/user/9363/questions
https://www.v-tianjin.com/user/9054/favorites
https://www.v-tianjin.com/user/3107/favorites
https://www.v-tianjin.com/user/6916/follows
https://www.v-tianjin.com/user/1467/favorites
https://www.v-tianjin.com/user/3107/follows
https://www.v-tianjin.com/user/7880/follows
https://www.v-tianjin.com/user/5752/favorites
https://www.v-tianjin.com/user/5694/favorites
https://www.v-tianjin.com/user/6607/questions
https://www.v-tianjin.com/user/2999/questions
https://www.v-tianjin.com/user/6916/favorites
https://www.v-tianjin.com/user/6937/favorites
https://www.v-tianjin.com/user/8827/questions
https://www.v-tianjin.com/user/9513/questions
https://www.v-tianjin.com/user/68841/favorites
https://www.v-tianjin.com/user/5853/follows
https://www.v-tianjin.com/user/9044/questions
https://www.v-tianjin.com/user/9447/questions
https://www.v-tianjin.com/user/7801/questions
https://www.v-tianjin.com/user/7342/follows
https://www.v-tianjin.com/user/68841/questions
https://www.v-tianjin.com/user/5955/questions
https://www.v-tianjin.com/user/9454/questions
https://www.v-tianjin.com/user/9220/follows
https://www.v-tianjin.com/user/8238/follows
https://www.v-tianjin.com/user/8294/follows
https://www.v-tianjin.com/user/8928/questions
https://www.v-tianjin.com/user/9447/follows
https://www.v-tianjin.com/user/9513/favorites
https://www.v-tianjin.com/user/8494/follows
https://www.v-tianjin.com/user/2367/favorites
https://www.v-tianjin.com/user/3668/follows
https://www.v-tianjin.com/user/1901/questions
https://www.v-tianjin.com/user/6128/questions
https://www.v-tianjin.com/user/1467/follows
https://www.v-tianjin.com/user/1268/favorites
https://www.v-tianjin.com/user/8270/favorites
https://www.v-tianjin.com/user/4205/questions
https://www.v-tianjin.com/user/8270/follows
https://www.v-tianjin.com/user/9748/questions
https://www.v-tianjin.com/user/2786/favorites
https://www.v-tianjin.com/user/9748/follows
https://www.v-tianjin.com/user/2286/questions
https://www.v-tianjin.com/user/9643/questions
https://www.v-tianjin.com/user/2286/follows
https://www.v-tianjin.com/user/9389/favorites
https://www.v-tianjin.com/user/5694/follows
https://www.v-tianjin.com/user/5189/follows
https://www.v-tianjin.com/user/3461/favorites
https://www.v-tianjin.com/user/5491/questions
https://www.v-tianjin.com/user/3877/questions
https://www.v-tianjin.com/user/7026/questions
https://www.v-tianjin.com/user/5127/questions
https://www.v-tianjin.com/user/1856/questions
https://www.v-tianjin.com/user/5853/favorites
https://www.v-tianjin.com/user/6228/follows
https://www.v-tianjin.com/user/52221/favorites
https://www.v-tianjin.com/user/2367/questions
https://www.v-tianjin.com/user/5189/favorites
https://www.v-tianjin.com/user/8238/favorites
https://www.v-tianjin.com/user/2206/favorites
https://www.v-tianjin.com/user/9773/follows
https://www.v-tianjin.com/user/8818/follows
https://www.v-tianjin.com/user/1407/questions
https://www.v-tianjin.com/user/5127/follows
https://www.v-tianjin.com/user/1268/follows
https://www.v-tianjin.com/user/5205/favorites
https://www.v-tianjin.com/user/9389/follows
https://www.v-tianjin.com/user/2206/questions
https://www.v-tianjin.com/user/5955/favorites
https://www.v-tianjin.com/user/2999/follows
https://www.v-tianjin.com/user/9773/questions
https://www.v-tianjin.com/user/2786/questions
https://www.v-tianjin.com/user/1487/favorites
https://www.v-tianjin.com/user/4007/follows
https://www.v-tianjin.com/user/9447/favorites
https://www.v-tianjin.com/user/9303/questions
https://www.v-tianjin.com/user/3461/questions
https://www.v-tianjin.com/user/7026/favorites
https://www.v-tianjin.com/user/4290/follows
https://www.v-tianjin.com/user/8827/follows
https://www.v-tianjin.com/user/9223/favorites
https://www.v-tianjin.com/user/6080/follows
https://www.v-tianjin.com/user/4205/follows
https://www.v-tianjin.com/user/9454/follows
https://www.v-tianjin.com/user/6593/questions
https://www.v-tianjin.com/user/9044/favorites
https://www.v-tianjin.com/user/3216/follows
https://www.v-tianjin.com/user/8928/favorites
https://www.v-tianjin.com/user/8270/questions
https://www.v-tianjin.com/user/6607/favorites
https://www.v-tianjin.com/user/8494/questions
https://www.v-tianjin.com/user/25711/questions
https://www.v-tianjin.com/user/1799/questions
https://www.v-tianjin.com/user/1856/follows
https://www.v-tianjin.com/user/52221/follows
https://www.v-tianjin.com/user/5491/favorites
https://www.v-tianjin.com/user/9042/questions
https://www.v-tianjin.com/user/9878/follows
https://www.v-tianjin.com/user/2859/questions
https://www.v-tianjin.com/user/1019/favorites
https://www.v-tianjin.com/user/9878/favorites
https://www.v-tianjin.com/user/4286/favorites
https://www.v-tianjin.com/user/7334/favorites
https://www.v-tianjin.com/user/6593/follows
https://www.v-tianjin.com/user/9054/questions
https://www.v-tianjin.com/user/4007/questions
https://www.v-tianjin.com/user/7342/favorites
https://www.v-tianjin.com/user/5853/questions
https://www.v-tianjin.com/user/1019/follows
https://www.v-tianjin.com/user/5869/questions
https://www.v-tianjin.com/user/6228/questions
https://www.v-tianjin.com/user/1110/questions
https://www.v-tianjin.com/user/9223/follows
https://www.v-tianjin.com/user/9042/follows
https://www.v-tianjin.com/user/7586/favorites
https://www.v-tianjin.com/user/5205/questions
https://www.v-tianjin.com/user/9957/follows
https://www.v-tianjin.com/user/8238/questions
https://www.v-tianjin.com/user/5869/follows
https://www.v-tianjin.com/user/4205/favorites
https://www.v-tianjin.com/user/1110/follows
https://www.v-tianjin.com/user/5189/questions
https://www.v-tianjin.com/user/9223/questions
https://www.v-tianjin.com/user/4549/favorites
https://www.v-tianjin.com/user/3216/questions
https://www.v-tianjin.com/user/9044/follows
https://www.v-tianjin.com/user/1989/favorites
https://www.v-tianjin.com/user/4290/questions
https://www.v-tianjin.com/user/5778/favorites
https://www.v-tianjin.com/user/1799/follows
https://www.v-tianjin.com/user/5491/follows
https://www.v-tianjin.com/user/5869/favorites
https://www.v-tianjin.com/user/1487/questions
https://www.v-tianjin.com/user/2859/follows
https://www.v-tianjin.com/user/52221/questions
https://www.v-tianjin.com/user/4549/follows
https://www.v-tianjin.com/user/9957/favorites
https://www.v-tianjin.com/user/6244/favorites
https://www.v-tianjin.com/user/7342/questions
https://www.v-tianjin.com/user/7801/follows
https://www.v-tianjin.com/user/3461/follows
https://www.v-tianjin.com/user/88591/favorites
https://www.v-tianjin.com/user/8818/questions
https://www.v-tianjin.com/user/2286/favorites
https://www.v-tianjin.com/user/25711/favorites
https://www.v-tianjin.com/user/1856/favorites
https://www.v-tianjin.com/user/2999/favorites
https://www.v-tianjin.com/user/7026/follows
https://www.v-tianjin.com/user/6080/favorites
https://www.v-tianjin.com/user/5862/follows
https://www.v-tianjin.com/user/6228/favorites
https://www.v-tianjin.com/user/6607/follows
https://www.v-tianjin.com/user/1799/favorites
https://www.v-tianjin.com/user/7801/favorites
https://www.v-tianjin.com/user/3107/questions
https://www.v-tianjin.com/user/5955/follows
https://www.v-tianjin.com/user/8928/follows
https://www.v-tianjin.com/user/7880/favorites
https://www.v-tianjin.com/user/9389/questions
https://www.v-tianjin.com/user/7334/follows
https://www.v-tianjin.com/user/2154/favorites
https://www.v-tianjin.com/user/9957/questions
https://www.v-tianjin.com/user/6244/follows
https://www.v-tianjin.com/user/68841/follows
https://www.v-tianjin.com/user/7329/questions
https://www.v-tianjin.com/user/88591/questions
https://www.v-tianjin.com/user/6593/favorites
https://www.v-tianjin.com/user/4286/questions
https://www.v-tianjin.com/user/6128/favorites
https://www.v-tianjin.com/user/6383/follows
https://www.v-tianjin.com/user/3216/favorites
https://www.v-tianjin.com/user/2154/follows
https://www.v-tianjin.com/user/1268/questions
https://www.v-tianjin.com/user/9773/favorites
https://www.v-tianjin.com/user/9363/favorites
https://www.v-tianjin.com/user/42081/questions
https://www.v-tianjin.com/user/6383/favorites
https://www.v-tianjin.com/user/9643/favorites
https://www.v-tianjin.com/user/7329/favorites
https://www.v-tianjin.com/user/1407/follows
https://www.v-tianjin.com/user/9748/favorites
https://www.v-tianjin.com/user/8276/questions
https://www.v-tianjin.com/user/1901/favorites
https://www.v-tianjin.com/user/6937/follows
https://www.v-tianjin.com/user/5694/questions
https://www.v-tianjin.com/user/3877/favorites
https://www.v-tianjin.com/user/8276/follows
https://www.v-tianjin.com/user/9220/questions
https://www.v-tianjin.com/user/8494/favorites
https://www.v-tianjin.com/user/6244/questions
https://www.v-tianjin.com/user/1019/questions
https://www.v-tianjin.com/user/9303/follows
https://www.v-tianjin.com/user/9878/questions
https://www.v-tianjin.com/user/3668/favorites
https://www.v-tianjin.com/user/2859/favorites
https://www.v-tianjin.com/user/8818/favorites
https://www.v-tianjin.com/user/1407/favorites
https://www.v-tianjin.com/user/1467/questions
https://www.v-tianjin.com/user/9513/follows
https://www.v-tianjin.com/user/5862/questions
https://www.v-tianjin.com/user/4549/questions
https://www.v-tianjin.com/user/4290/favorites
https://www.v-tianjin.com/user/6937/questions
https://www.v-tianjin.com/user/42081/favorites
https://www.v-tianjin.com/user/1989/questions
https://www.v-tianjin.com/user/6237/questions
https://www.v-tianjin.com/user/9303/favorites
https://www.v-tianjin.com/user/8315/questions
https://www.v-tianjin.com/user/6916/questions
https://www.v-tianjin.com/user/8276/favorites
https://www.v-tianjin.com/user/2786/follows
https://www.v-tianjin.com/user/1487/follows
https://www.v-tianjin.com/user/8294/favorites
https://www.v-tianjin.com/user/8315/follows
https://www.v-tianjin.com/user/7334/questions
https://www.v-tianjin.com/user/2206/follows
https://www.v-tianjin.com/user/25711/follows
https://www.v-tianjin.com/user/9454/favorites
https://www.v-tianjin.com/user/4286/follows
https://www.v-tianjin.com/user/8827/favorites
https://www.v-tianjin.com/user/5778/questions
https://www.v-tianjin.com/user/8315/favorites
https://www.v-tianjin.com/user/4007/favorites
https://www.v-tianjin.com/user/5752/follows
https://www.v-tianjin.com/user/6237/follows
https://www.v-tianjin.com/user/9042/favorites
https://www.v-tianjin.com/user/6128/follows
https://www.v-tianjin.com/user/9220/favorites
https://www.v-tianjin.com/user/1110/favorites
https://www.v-tianjin.com/user/6237/favorites
https://www.v-tianjin.com/user/5778/follows
https://www.v-tianjin.com/user/2154/questions
https://www.v-tianjin.com/user/6080/questions
https://www.v-tianjin.com/user/5205/follows
https://www.v-tianjin.com/user/7586/follows
https://www.v-tianjin.com/user/3668/questions
https://www.v-tianjin.com/user/9643/follows
https://www.v-tianjin.com/user/8294/questions
https://www.v-tianjin.com/user/5752/questions
https://www.v-tianjin.com/user/2367/follows
https://www.v-tianjin.com/user/5862/favorites
https://www.v-tianjin.com/user/88591/follows
https://www.v-tianjin.com/user/6383/questions









评论0