用pytorch如何构建模型,如何训练模型,如何测试模型?
pytorch 目前在深度学习具有重要的地位,比起早先的caffe,tensorflow,keras越来越受到欢迎,其他的深度学习框架越来越显得小众。
数据分析
数据分析-Pandas如何转换产生新列
数据分析-Pandas如何统计数据概况
数据分析-Pandas如何轻松处理时间序列数据
数据分析-Pandas如何选择数据子集
数据分析-Pandas如何重塑数据表-CSDN博客
经典算法
经典算法-遗传算法的python实现
经典算法-模拟退火算法的python实现
经典算法-粒子群算法的python实现-CSDN博客
LLM应用
大模型查询工具助手之股票免费查询接口
Python技巧-终端屏幕打印光标和文字控制
在pytorch里构建模型,继承现有的模块比较方便——这就是nn.Module 模块。通过模型的初始化 _init_ 函数,定义网络层,指定数据是如何通过网络的前进流向。
同时,最重要的是提升训练和预测的速度,加速训练就免不了把模型放在GPU或者CPU里面,这就需要模型配置硬件部署位置。
# 模型配置到cpu还是GPU,或者多处理器.
device = (
"cuda"
if torch.cuda.is_available()
else "mps"
if torch.backends.mps.is_available()
else "cpu"
)
print(f"Using {device} device")
# 定义模型
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.flatten = nn.Flatten()
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
model = NeuralNetwork().to(device)
print(model)
此处用一个简单的神经网络模型解释深度学习网络的构建,麻雀虽小五脏俱全。
模型网络有6层:Flatten层,顺序网络里,构建1个28 X 28像素到512的线性连接层,接着是ReLU激活层 ,随后又是512 X 512的线性连接层,随后激活层ReLU层,最后是一个512 X 10线性连接层,输出10个结果值。
Using cuda device
NeuralNetwork(
(flatten): Flatten(start_dim=1, end_dim=-1)
(linear_relu_stack): Sequential(
(0): Linear(in_features=784, out_features=512, bias=True)
(1): ReLU()
(2): Linear(in_features=512, out_features=512, bias=True)
(3): ReLU()
(4): Linear(in_features=512, out_features=10, bias=True)
)
)
构建好模型后,如何优化模型,提升识别精确度呢?
其实也很简单,pytorch已经封装好了很多处理,只需要调用损失函数和优化函数即可。
此处损失函数采用交叉熵函数CrossEntropyLoss,优化函数采用SGD函数,你也可以用别的函数。
loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
当然,上篇说道,训练数据集较多,GPU显存又有限,只好分批次进行加载。如此,便需要结合上篇文章分批次加载模型,不再赘述,详见:
[深度学习-Pytorch数据集构造和分批加载-CSDN博客]
在每个训练循环中,模型都在训练数据集计算,并计算损失函数,然后再反向传播,叠加优化器对模型进行优化处理。不断循环叠加,使得模型预测能力逐渐提升。
def train(dataloader, model, loss_fn, optimizer):
size = len(dataloader.dataset)
model.train()
for batch, (X, y) in enumerate(dataloader):
X, y = X.to(device), y.to(device)
# Compute prediction error
pred = model(X)
loss = loss_fn(pred, y)
# Backpropagation
loss.backward()
optimizer.step()
optimizer.zero_grad()
if batch % 100 == 0:
loss, current = loss.item(), (batch + 1) * len(X)
print(f"loss: {loss:>7f} [{current:>5d}/{size:>5d}]")
当要测试模型性能效果时,是不能再使用训练数据来测的。就像是考试不能提前知道考卷题目,否则漏题就不能获得真正的能力。模型测试也一样,因此在模型加载前先把数据集按比例分了,或三七分,或二八分。把一部分测试集进行测试,观察效果如何。
依旧加载测试的数据集,告知模型是做测试,不再训练 model.eval(),因此也不再把残差反向传播,torch.no_grad()。当然,依旧把数据和模型加载到加速设备上,如果有GPU的话。
监控数据主要有两个:平均损失值,准确度。
def test(dataloader, model, loss_fn):
size = len(dataloader.dataset)
num_batches = len(dataloader)
model.eval()
test_loss, correct = 0, 0
with torch.no_grad():
for X, y in dataloader:
X, y = X.to(device), y.to(device)
pred = model(X)
test_loss += loss_fn(pred, y).item()
correct += (pred.argmax(1) == y).type(torch.float).sum().item()
test_loss /= num_batches
correct /= size
print(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")
有了监测数据后,每个轮次都想查看训练效果是否朝着好的方向前进,如果好的就继续不断迭代,直到满足模型设计的预测精度等指标要求,如果不是就提前终止了。
epochs = 5
for t in range(epochs):
print(f"Epoch {t+1}\n-------------------------------")
train(train_dataloader, model, loss_fn, optimizer)
test(test_dataloader, model, loss_fn)
print("Done!")
很简单吧,这里面把训练5个轮次,就结束。也就是示意一下深度学习的流程。
以上代码只是一个简单示例,示例代码中的表达式可以根据实际问题进行修改。
觉得有用 收藏 收藏 收藏
点个赞 点个赞 点个赞
End
DeepLearning文章:
深度学习-Pytorch数据集构造和分批加载-CSDN博客
GPT专栏文章:
GPT实战系列-ChatGLM3本地部署CUDA11+1080Ti+显卡24G实战方案
GPT实战系列-LangChain + ChatGLM3构建天气查询助手
大模型查询工具助手之股票免费查询接口
GPT实战系列-简单聊聊LangChain
GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(二)
GPT实战系列-P-Tuning本地化训练ChatGLM2等LLM模型,到底做了什么?(一)
GPT实战系列-ChatGLM2模型的微调训练参数解读
GPT实战系列-如何用自己数据微调ChatGLM2模型训练
GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案
GPT实战系列-Baichuan2本地化部署实战方案
GPT实战系列-Baichuan2等大模型的计算精度与量化
GPT实战系列-GPT训练的Pretraining,SFT,Reward Modeling,RLHF
GPT实战系列-探究GPT等大模型的文本生成-CSDN博客