机器学习之模型训练

前言

模型训练一般分为四个步骤:

  1. 构建数据集。
  2. 定义神经网络模型。
  3. 定义超参、损失函数及优化器。
  4. 输入数据集进行训练与评估。

有了数据集和模型后,可以进行模型的训练与评估。

构建数据集

定义神经网络模型

复制代码
class Network(nn.Cell):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        self.dense_relu_sequential = nn.SequentialCell(
            nn.Dense(28*28, 512),
            nn.ReLU(),
            nn.Dense(512, 512),
            nn.ReLU(),
            nn.Dense(512, 10)
        )

    def construct(self, x):
        x = self.flatten(x)
        logits = self.dense_relu_sequential(x)
        return logits

model = Network()

网络构建中加载代码,构建一个神经网络模型。

定义超参、损失函数和优化器

超参

超参数是可以调整的参数,可以控制深度学习模型训练优化的过程,包括训练轮次、批次大小和学习率等。这些超参数的取值会影响模型的训练和收敛速度,其中学习率在迭代过程中控制模型的学习进度。

损失函数

损失函数用于评估模型预测值和目标值之间的误差,帮助模型降低误差并提高预测准确性。常见的损失函数包括均方误差和负对数似然,用于回归和分类任务。nn.CrossEntropyLoss结合了多种损失函数的功能,对模型的预测结果进行归一化并计算误差。

优化器

模型优化是通过调整模型参数来减少模型误差的过程,MindSpore提供了多种优化算法的实现,称之为优化器。优化器内部定义了模型参数优化过程,所有优化逻辑都封装在优化器对象中。在这里,使用了SGD(随机梯度下降)优化器。

训练与评估

设置了超参、损失函数和优化器后,我们就可以循环输入数据来训练模型。一次数据集的完整迭代循环称为一轮(epoch)。每轮执行训练时包括两个步骤:训练和验证/测试。在训练阶段,模型通过迭代训练数据集来调整参数,以尝试收敛到最佳参数。而在验证/测试阶段,模型通过迭代测试数据集来评估模型的性能是否提升。这种流程的循环迭代可以帮助模型不断学习和优化,以达到更好的性能和准确度。

复制代码
# Define forward function
def forward_fn(data, label):
    logits = model(data)
    loss = loss_fn(logits, label)
    return loss, logits

# Get gradient function
grad_fn = mindspore.value_and_grad(forward_fn, None, optimizer.parameters, has_aux=True)

# Define function of one-step training
def train_step(data, label):
    (loss, _), grads = grad_fn(data, label)
    optimizer(grads)
    return loss

def train_loop(model, dataset):
    size = dataset.get_dataset_size()
    model.set_train()
    for batch, (data, label) in enumerate(dataset.create_tuple_iterator()):
        loss = train_step(data, label)

        if batch % 100 == 0:
            loss, current = loss.asnumpy(), batch
            print(f"loss: {loss:>7f}  [{current:>3d}/{size:>3d}]")

def test_loop(model, dataset, loss_fn):
    num_batches = dataset.get_dataset_size()
    model.set_train(False)
    total, test_loss, correct = 0, 0, 0
    for data, label in dataset.create_tuple_iterator():
        pred = model(data)
        total += len(data)
        test_loss += loss_fn(pred, label).asnumpy()
        correct += (pred.argmax(1) == label).asnumpy().sum()
    test_loss /= num_batches
    correct /= total
    print(f"Test: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

loss_fn = nn.CrossEntropyLoss()
optimizer = nn.SGD(model.trainable_params(), learning_rate=learning_rate)

for t in range(epochs):
    print(f"Epoch {t+1}\n-------------------------------")
    train_loop(model, train_dataset)
    test_loop(model, test_dataset, loss_fn)
print("Done!")

总结

模型训练一般包括构建数据集、定义神经网络模型、定义超参数、损失函数和优化器,以及输入数据集进行训练和评估。

相关推荐
上官胡闹3 分钟前
使用 vLLM 原生部署 PaddleOCR-VL:高性能、OpenAI 兼容的多模态 OCR 服务
人工智能
知行力9 分钟前
【GitHub每日速递 20251111】PyTorch:GPU加速、动态网络,深度学习平台的不二之选!
pytorch·深度学习·github
却道天凉_好个秋24 分钟前
OpenCV(二十一):HSV与HSL
人工智能·opencv·计算机视觉
从后端到QT25 分钟前
标量-向量-矩阵-基础知识
人工智能·机器学习·矩阵
新智元27 分钟前
65 岁图灵巨头离职创业!LeCun 愤然与小扎决裂,Meta 巨震
人工智能·openai
机器之心29 分钟前
全球第二、国内第一!钉钉发布DeepResearch多智能体框架,已在真实企业部署
人工智能·openai
新智元36 分钟前
翻译界的 ChatGPT 时刻!Meta 发布新模型,几段示例学会冷门新语言
人工智能·openai
沉默媛38 分钟前
什么是Hinge损失函数
人工智能·损失函数
北青网快讯1 小时前
声网AI技术赋能,智能客服告别机械式应答
人工智能
机器之心1 小时前
TypeScript超越Python成GitHub上使用最广语言,AI是主要驱动力
人工智能·openai