如何在 MATLAB 中捕获每个时期的误差值?

问题描述 投票:0回答:1

大家! 我的深度学习项目在图像回归任务中遇到问题,我想知道如何获取模型执行的每个时期的 RMSE 值,并导出到 .xlsx 存档中。

rmseValues = zeros(numEpochs, 1);
for epoch = 1:numEpochs
    [net, info] = trainNetwork(XTrain, YTrain, layers, options);
    YPred = predict(net, XTrain);
    rmseValues(epoch) = calculateRMSE(YTrain, YPred);
end
rmseTable = array2table(rmseValues, 'VariableNames', {'RMSE'});
disp(rmseTable)

但是,由于

for
循环的性质,训练的执行速率与定义的 epoch 数相同。因此,我想知道是否有一个函数可以让我获取执行数据数组。

动机是我想将这些数据用于另一个项目。

我想将数据导出为 .xlsx 或 .csv 存档,但我想找到获取方法。

matlab deep-learning training-data
1个回答
0
投票

要在 MATLAB 中的训练过程中捕获每个时期的 RMSE 值,您可以使用自定义训练循环或修改训练选项,以便它具有计算每个时期的 RMSE 的自定义函数。

使用自定义培训低可以让您控制培训过程。为此,您需要:

  • 初始化变量(以便您可以存储 RMSE 值)
  • 手动训练网络,更新网络参数并计算 RMSE
  • 将您的 RMSE 值保存到 CSV 文件

这是我推荐的一个例子:

% Initialize variables
numEpochs = 50;  % Define your number of epochs
rmseValues = zeros(numEpochs, 1);

% Custom training loop
for epoch = 1:numEpochs
    % Perform a training step
    [net, info] = trainNetwork(XTrain, YTrain, layers, options);
    
    % Make predictions
    YPred = predict(net, XTrain);
    
    % Calculate RMSE
    rmseValues(epoch) = sqrt(mean((YTrain - YPred).^2));
    
    % Optionally, display the RMSE value for this epoch
    fprintf('Epoch %d: RMSE = %.4f\n', epoch, rmseValues(epoch));
end

% Convert to table and save to .xlsx or .csv
rmseTable = array2table(rmseValues, 'VariableNames', {'RMSE'});
writetable(rmseTable, 'RMSE_per_epoch.xlsx');  % Save as .xlsx
% Alternatively, you can use writetable(rmseTable, 'RMSE_per_epoch.csv'); for CSV

如果这不是您的强项或偏好,您可以将

trainingOptions
与自定义
outputFcn
结合使用来捕获 RMSE。其方法如下:

  • 定义自定义输出函数
  • 设置您的
    trainingOptions
  • 导出您的数据

这里有一个编码大纲以供帮助:

% Initialize a variable to store RMSE values
rmseValues = [];

% Define the custom output function
function stop = myOutputFcn(info)
    global rmseValues;
    if info.State == 'iteration'
        YPred = predict(info.TrainingAccuracy); % Adjust for your needs
        rmse = sqrt(mean((info.TrainingLoss - YPred).^2));  % Replace TrainingLoss with your targets
        rmseValues = [rmseValues; rmse];
    end
    stop = false;  % Continue training
end

% Set training options with custom output function
options = trainingOptions('sgdm', ...
    'MaxEpochs', numEpochs, ...
    'OutputFcn', @myOutputFcn);

% Train the network
net = trainNetwork(XTrain, YTrain, layers, options);

% Export RMSE values to .xlsx or .csv
rmseTable = array2table(rmseValues, 'VariableNames', {'RMSE'});
writetable(rmseTable, 'RMSE_per_epoch.xlsx');  % Save as .xlsx

此方法将记录 RMSE 并导出与选项 1 类似的数据。在我看来,第一个选项是更好的选项,我建议您坚持使用该选项。

© www.soinside.com 2019 - 2024. All rights reserved.