如何在Flux.jl中使用损失函数并确定其在训练循环中的调用位置
Flux训练循环中损失函数的使用位置
损失函数在训练循环中承担两个核心作用:计算模型预测结果和真实标签的偏差值,同时作为自动微分的计算起点,因此固定放在模型前向推理之后、梯度计算之前的位置。
以下是标准Flux训练循环的完整流程,你可以对应找到损失函数的调用位置:
# 提前初始化的训练组件 model = Chain(Dense(10 => 5, relu), Dense(5 => 2)) # 待训练模型 loss_fn = Flux.Losses.crossentropy # 你选择的预定义损失函数 opt = Flux.Adam(1e-3) # 优化器 train_data = DataLoader((train_features, train_labels), batchsize=32, shuffle=true) # 训练数据加载器 params = Flux.params(model) # 待更新的模型参数
# 训练循环 for epoch in 1:10 for (x, y) in train_data # 1. 模型前向推理,得到预测值 y_pred = model(x) # 2. 调用损失函数,计算偏差值 === 你要找的位置 loss = loss_fn(y_pred, y) # 3. 基于损失值计算参数梯度 gs = gradient(() -> loss, params) # 4. 优化器更新模型参数 Flux.update!(opt, params, gs) # 额外:你可以在这里直接打印loss变量监控训练进度 println("当前批次损失:", loss) end end
如果你使用Flux封装好的train!工具函数简化训练逻辑,只需要把损失函数作为第一个参数传入即可,框架会自动在对应位置完成调用:
Flux.train!(loss_fn, params, train_data, opt)
常见使用注意事项
- 自定义损失函数只要满足输入为(模型预测值, 真实标签)、输出为标量的要求,就可以直接放在上述位置使用,不需要修改其他训练逻辑
- 如需加入L1、L2正则项,直接在损失计算步骤叠加正则项的计算结果即可:
loss = loss_fn(y_pred, y) + 0.01 * sum(p -> sum(p.^2), params) - 验证集、测试集的损失计算也放在同样的位置,只是不需要后续的梯度计算和参数更新步骤
内容的提问来源于stack exchange,提问作者logankilpatrick
相关产品推荐
相关产品推荐

