如何在MATLAB中捕获每个epoch的RMSE值并导出至Excel?
解决深度学习图像回归中获取Epoch级RMSE并导出的问题
先纠正你的核心问题
你当前的代码逻辑完全错误:每次循环都从头训练网络(相当于训练了numEpochs个独立的单epoch模型),根本不是记录同一个模型训练过程中每个epoch的RMSE。下面是正确的实现方案:
方案1:利用trainNetwork返回的训练信息直接获取RMSE
MATLAB的trainNetwork返回的info结构体包含训练过程的所有指标数据,只要在训练选项中配置好RMSE作为性能指标,就能直接提取每个epoch的结果:
步骤1:配置训练选项
在创建options时,指定回归任务的性能指标为RMSE,并开启训练信息记录:
% 基于你已定义的layers,补充配置训练选项 options = trainingOptions('adam', ... % 替换成你实际使用的优化器 'MaxEpochs', numEpochs, ... 'ValidationData', [], % 有验证集就填{XVal,YVal},无则留空 'Metrics', 'RMSE', ... % 指定跟踪RMSE指标 'Verbose', true, ... 'Plots', 'training-progress'); % 可选,可视化训练进度
步骤2:单次训练获取所有Epoch的RMSE
仅需训练一次网络,就能从返回的info中提取所有epoch的RMSE:
[net, info] = trainNetwork(XTrain, YTrain, layers, options); % info.TrainingRMSE是存储每个epoch训练集RMSE的数组 rmseValues = info.TrainingRMSE;
方案2:自定义回调函数记录RMSE(适配自定义计算逻辑)
如果你的calculateRMSE是自定义函数(和MATLAB内置逻辑不同),可以用回调函数在每个epoch结束时计算并记录:
% 初始化存储RMSE的数组 rmseValues = zeros(numEpochs, 1); % 定义epoch结束时执行的回调函数 epochCallback = @(net, info) recordCustomRMSE(net, info, XTrain, YTrain, rmseValues); % 配置训练选项,添加回调 options = trainingOptions('adam', ... 'MaxEpochs', numEpochs, ... 'ValidationData', [], ... 'Verbose', true, ... 'Plots', 'training-progress', ... 'EpochEndFcn', epochCallback); % 每个epoch结束触发回调 % 启动训练 [net, info] = trainNetwork(XTrain, YTrain, layers, options); % 自定义RMSE记录函数 function recordCustomRMSE(net, info, XTrain, YTrain, rmseValues) YPred = predict(net, XTrain); rmseValues(info.Epoch) = calculateRMSE(YTrain, YPred); end
导出数据到.xlsx或.csv
拿到rmseValues数组后,转换成表格再导出:
% 转换为带列名的表格,可选添加Epoch列 rmseTable = array2table(rmseValues, 'VariableNames', {'RMSE'}); rmseTable.Epoch = (1:numEpochs)'; % 导出到Excel writetable(rmseTable, 'epoch_rmse.xlsx'); % 导出到CSV writetable(rmseTable, 'epoch_rmse.csv');
如果不需要表格格式,直接导出数组可以用writematrix:
writematrix(rmseValues, 'epoch_rmse.csv', 'WriteMode', 'overwrite');
内容的提问来源于stack exchange,提问作者Caio Nicácio
相关产品推荐
相关产品推荐

