miao blog
1242 words
6 minutes
Pytorch框架下的模型的训练与验证

PyTorch vs Keras 框架对比#

在学习模型的训练和验证之前,我们先来对比一下PyTorch和Keras框架,这方便我们更好理解PyTorch框架,个人感觉高度的集成化也导致了tensorflow在未来发展上会注定不如pytorch。Keras 设计初衷是使神经网络的设计和实验变得简单,它对初学者非常友好。它的高层次抽象允许用户快速搭建和实验标准网络,但这种设计也可能在需要高度定制模型时显得不够灵活。随着我们对深度学习技术的掌握逐渐深入,我们可能倾向于选择提供更多控制和定制选项的框架,就是PyTorch。下面是对比不同之处

1. 模型定义#

PyTorch:#

在 PyTorch 中,我们通常会继承 nn.Module 类来定义自己的模型。在模型类中,需要先定义 __init__ 方法来初始化模型的层,以及 forward 方法来指定前向传播。

import torch
import torch.nn as nn

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.layer1 = nn.Linear(10, 20)
        self.relu = nn.ReLU()
        self.layer2 = nn.Linear(20, 2)

    def forward(self, x):
        x = self.layer1(x)
        x = self.relu(x)
        x = self.layer2(x)
        return x

Keras:#

在 Keras 中,可以使用 Sequential 模型或者函数式 API 快速定义模型。这些方法通常比 PyTorch 更简洁。

from tensorflow.keras import layers, models

model = models.Sequential([
    layers.Dense(20, activation='relu', input_shape=(10,)),
    layers.Dense(2, activation='softmax')
])

2. 损失函数和优化器#

PyTorch:#

在 PyTorch 中,我们则需要手动定义损失函数和优化器。这些通常在训练循环外部定义。

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

Keras:#

在 Keras 中,在编译模型时直接可以定义损失函数和优化器,整个过程更集成化。

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

3. 训练循环#

PyTorch:#

在 PyTorch 中,我们则需要手动编写训练循环。这包括前向传播、损失计算、梯度清零、反向传播和参数更新。

for epoch in range(num_epochs):
    for inputs, labels in train_loader:
        outputs = model(inputs)
        loss = criterion(outputs, labels)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Keras:#

在 Keras 中,训练过程可以通过一个简单的 fit 方法调用实现,大大简化了代码。

model.fit(x_train, y_train, epochs=num_epochs, batch_size=batch_size)

4. 验证过程#

PyTorch:#

在 PyTorch 中,验证过程通常在训练循环中进行,需要手动设置模型为验证模式,并关闭梯度计算。

model.eval()
with torch.no_grad():
    for inputs, labels in validation_loader:
        outputs = model(inputs)
        val_loss = criterion(outputs, labels)

Keras:#

在 Keras 中,我们可以在 fit 方法中直接设置验证数据集,模型会在每个 epoch 后评估验证数据集的性能。

model.fit(x_train, y_train, validation_data=(x_val, y_val), epochs=num_epochs, batch_size=batch_size)

下面是PyTorch框架的代码的关键部分,也是我近来学习编写感觉不流畅经常卡顿的地方

PyTorch 框架下模型训练的关键步骤#

1. 数据加载#

在 PyTorch 中,数据通常通过 torch.utils.data.DataLoader 加载,它提供了一个高效的方式来迭代数据,支持自动批处理、采样、打乱数据和多线程数据加载。

from torch.utils.data import DataLoader, TensorDataset
train_dataset = TensorDataset(x_train, y_train)
train_loader = DataLoader(dataset=train_dataset, batch_size=32, shuffle=True)

2. 设置模型、损失函数和优化器#

我们如上面所示,需要定义模型架构,选择合适的损失函数和优化器。

3. 训练循环#

在 PyTorch 中,数据通常通过 torch.utils.data.DataLoader 加载,它提供了一个高效的方式来迭代数据,支持自动批处理、采样、打乱数据和多线程数据加载。 -前向传播:模型对输入数据进行计算,输出预测结果。 -计算损失:使用损失函数计算模型输出与真实标签之间的误差。 -梯度清零:在每次迭代开始之前,需要清除旧的梯度,因为梯度是累积的。 -反向传播:根据损失函数对模型参数进行梯度计算。 -参数更新:优化器根据计算得到的梯度更新模型的权重。 代码如下:

# 设置模型为训练模式
model.train()
for epoch in range(num_epochs):
    for inputs, labels in train_loader:
        # 前向传播
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        # 梯度清零
        optimizer.zero_grad()
        # 反向传播
        loss.backward()
        # 参数更新
        optimizer.step()

4. 验证过程#

训练过程中或训练后,通常需要在一个或多个验证数据集上评估模型性能。这需要切换到模型的评估模式,并关闭梯度计算以提高性能。

model.eval()
total_loss = 0
with torch.no_grad():  # 关闭梯度计算
    for inputs, labels in validation_loader:
        outputs = model(inputs)
        val_loss = criterion(outputs, labels)
        total_loss += val_loss.item()

总结#

PyTorch 提供了更高的灵活性和控制度,允许手动处理许多细节。而 TensorFlow 的 Keras API 则提供了更高层次的抽象,使得常见的训练过程更简单、更快捷。两个框架各有千秋,选择哪个框架取决于个人需求、项目要求以及对特定框架的熟悉程度。Keras 因其简单性和易用性在初学者和某些工业应用中依然非常受欢迎,而 PyTorch 在研究和需要高度定制的应用中表现更为出色。

Pytorch框架下的模型的训练与验证
https://ruiboom.cn/posts/pytorch/
Author
🐱
Published at
2024-05-15