深度学习快速入门手册
深度学习快速入门手册----1024快乐
首先我们需要安装python(版本要求在3.7及以上),然后依据自己的需求去官网安装最新的Pytorch,通过conda虚拟环境来安装numpy,pandas,scikit-learn,trensformer等库。
**数据收集:**这部分我们可以去相关的公开数据集中下载,当然也可以去使用网络合法爬取自己需要的数据
数据预处理:
清洗数据:去除噪声,无关信息,修正错误,去除重复内容
分词处理:这里我们可以使用jieba库和spaCy库来对文本进行分词
构建词汇表:将所制定的词映射为唯一ID
序列化数据:将文本数据转化为模型可处理的数值序列
数据加载:使用现成的PyTorch中的DataLoader加载数据,可以通过批量大小,是否打乱数据等参数来实现加载的过程
代码展示:
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)
模型构建:
import torch
import torch.nn as nnclass 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 outputclass 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优化器,设置学习率等参数。
- 损失函数:使用
- 训练过程:
- 前向传播:将输入数据传入模型,得到预测结果。
- 计算损失:根据预测结果和真实标签计算损失。
- 反向传播:通过反向传播计算梯度,并更新模型参数。
- 监控训练:记录训练过程中的损失值,观察模型的收敛情况。
代码展示:
# 训练模型
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}')
模型优化
- 调整超参数:根据训练结果调整学习率、批量大小等超参数。
- 模型剪枝:去除模型中不重要的参数,减小模型规模。
- 量化处理:将模型参数从浮点数转换为低精度数据类型,减少存储和计算资源。
- 知识蒸馏:使用大模型指导小模型训练,使小模型在保持性能的同时更高效。
代码展示:
# 调整超参数(示例:减小学习率)
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加速、多线程等技术。
代码展示:
# 保存模型
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, jsonifyapp = Flask(__name__)@app.route('/predict', methods=['POST'])
def predict():data = request.jsoninput_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)
