深度学习快速入门手册----1024快乐
首先我们需要安装python(版本要求在3.7及以上),然后依据自己的需求去官网安装最新的Pytorch,通过conda虚拟环境来安装numpy,pandas,scikit-learn,trensformer等库。
**数据收集:**这部分我们可以去相关的公开数据集中下载,当然也可以去使用网络合法爬取自己需要的数据
数据预处理:
清洗数据:去除噪声,无关信息,修正错误,去除重复内容
分词处理:这里我们可以使用jieba库和spaCy库来对文本进行分词
构建词汇表:将所制定的词映射为唯一ID
序列化数据:将文本数据转化为模型可处理的数值序列
数据加载:使用现成的PyTorch中的DataLoader加载数据,可以通过批量大小,是否打乱数据等参数来实现加载的过程
代码展示:
python
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
import numpy as np
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 数据预处理
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 转换为Tensor
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.long)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.long)
# 创建DataLoader
batch_size = 64
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
模型构建:
python
import torch
import torch.nn as nn
class TransformerModel(nn.Module):
def __init__(self, vocab_size, embed_size, num_heads, hidden_size, num_layers, dropout):
super(TransformerModel, self).__init__()
self.embedding = nn.Embedding(vocab_size, embed_size)
self.pos_encoder = PositionalEncoding(embed_size, dropout)
self.transformer = nn.Transformer(
d_model=embed_size,
nhead=num_heads,
num_encoder_layers=num_layers,
num_decoder_layers=num_layers,
dim_feedforward=hidden_size,
dropout=dropout
)
self.fc = nn.Linear(embed_size, vocab_size)
def forward(self, src, tgt):
src_embed = self.pos_encoder(self.embedding(src))
tgt_embed = self.pos_encoder(self.embedding(tgt))
output = self.transformer(src_embed, tgt_embed)
output = self.fc(output)
return output
class PositionalEncoding(nn.Module):
def __init__(self, d_model, dropout=0.1, max_len=5000):
super(PositionalEncoding, self).__init__()
self.dropout = nn.Dropout(p=dropout)
pe = torch.zeros(max_len, d_model)
position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2).float() * (-math.log(10000.0) / d_model))
pe[:, 0::2] = torch.sin(position * div_term)
pe[:, 1::2] = torch.cos(position * div_term)
pe = pe.unsqueeze(0).transpose(0, 1)
self.register_buffer('pe', pe)
def forward(self, x):
x = x + self.pe[:x.size(0), :]
return self.dropout(x)
下面我们就进入了本套深度学习的关键了,这也是深度学习的关键
模型训练
- 设置超参数 :
- 学习率:设置适当的学习率,如0.001。
- 批量大小:根据硬件资源选择合适的批量大小,如64。
- 训练轮数:设置足够的训练轮数,如10轮。
- 定义损失函数和优化器 :
- 损失函数 :使用
CrossEntropyLoss计算预测值和真实值的损失。 - 优化器 :选择
Adam优化器,设置学习率等参数。
- 损失函数 :使用
- 训练过程 :
- 前向传播:将输入数据传入模型,得到预测结果。
- 计算损失:根据预测结果和真实标签计算损失。
- 反向传播:通过反向传播计算梯度,并更新模型参数。
- 监控训练:记录训练过程中的损失值,观察模型的收敛情况。
代码展示:
python
# 训练模型
for epoch in range(num_epochs):
model.train()
for batch_X, batch_y in train_loader:
# 前向传播
outputs = model(batch_X)
loss = criterion(outputs, batch_y)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印每个epoch的损失
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
模型优化
- 调整超参数:根据训练结果调整学习率、批量大小等超参数。
- 模型剪枝:去除模型中不重要的参数,减小模型规模。
- 量化处理:将模型参数从浮点数转换为低精度数据类型,减少存储和计算资源。
- 知识蒸馏:使用大模型指导小模型训练,使小模型在保持性能的同时更高效。
代码展示:
python
# 调整超参数(示例:减小学习率)
optimizer = optim.Adam(model.parameters(), lr=0.0001)
# 模型剪枝(示例:使用torch.prune)
from torch.nn.utils import prune
# 对第一层全连接层进行剪枝
prune.l1_unstructured(model.fc1, name='weight', amount=0.2) # 剪掉20%的权重
# 量化处理(示例:将模型转换为量化模型)
quantized_model = torch.quantization.quantize_dynamic(
model, {nn.Linear}, dtype=torch.qint8
)
# 知识蒸馏(示例:假设有一个大模型teacher_model)
# teacher_model = ... # 定义大模型
# student_model = ... # 定义小模型
# 使用知识蒸馏训练小模型
# 在训练过程中,学生模型不仅学习真实标签,还学习大模型的输出分布
模型部署
- 保存模型 :将训练好的模型保存为
.pt或.pth文件。 - 加载模型:在部署环境中加载保存的模型。
- 搭建API服务:使用Flask或FastAPI等框架搭建API服务,接收用户请求并返回模型预测结果。
- 性能优化:在部署环境中进一步优化模型性能,如使用GPU加速、多线程等技术。
代码展示:
python
# 保存模型
torch.save(model.state_dict(), 'iris_classifier.pth')
# 加载模型
model = IrisClassifier()
model.load_state_dict(torch.load('iris_classifier.pth'))
# 搭建API服务(使用Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/predict', methods=['POST'])
def predict():
data = request.json
input_data = torch.tensor(data['features'], dtype=torch.float32)
with torch.no_grad():
output = model(input_data)
pred = torch.argmax(output, dim=1)
return jsonify({'prediction': pred.item()})
if __name__ == '__main__':
app.run(port=5000)