Caffe-学习曲线可视化
本笔记记录用Caffe实现学习曲线可视化的学习过程,欢迎学习交流!
1.输出重定向到log文件
首先要把Caffe运行产生的log重定向到文件,&表示放在后台运行,代码如下
./train.sh >& cifar.log &
如果查看程序运行是否正常,使用下面这条语句
tail -f cifar.log
好处:
1.可以一个终端干多个事情,比如一边跑训练,一边写代码。
2.当你的终端关闭时,不会停止训练进程。
3.可以随地从其他终端查看训练进度,而不必要回到启动训练任务的终端。
2.提取loss值
Demo.log中提取loss值有多种方法,比较方便的一种是用Shell命令:
cat cifar.log | grep “Train net output” | awk ‘{print&11}’
其中,“|”为管道命令,即将前一条命令输出直接送入后一条命令作为输入。
3.绘制学习曲线
将这个文件放在caffe的主目录下:
clear;
clc;
close all;
% 这个参数用来指定 Caffe 运行 log 文件
% 生成 log 文件方法:./examples/cifar10/train_quick.sh >& cifar.log&
train_log_file = 'trainmnist.log';
% 这个参数相当于 solver.prototxt 中的 display 值
train_interval = 100;
% 这个参数相当于 solver.prototxt 中的test_interval 值
test_interval = 500;
[~, string_output] = dos(['cat ', train_log_file, ' | grep ''Train net output #0'' | awk ''{print $11}''']);
% 第11个空格后面的提出取出
% fid = fopen('matlab_train_loss', 'r');
% train_loss = fscanf(fid, '%f\n');
% fclose(fid);
train_loss = str2num(string_output);
n = 1:length(train_loss);
idx_train = (n - 1) * train_interval;
% fid = fopen('matlab_test_loss', 'r');
% test_loss = fscanf(fid, '%f\n');
% fclose(fid);
[~, string_output] = dos(['cat ', train_log_file, ' | grep ''Test net output #1'' | awk ''{print $11}''']);
% 第11个空格后面的提出取出
test_loss = str2num(string_output);
m = 1:length(test_loss);
idx_test = (m - 1) * test_interval;
figure;
plot(idx_train, train_loss,'--r');
hold on;
plot(idx_test, test_loss,'g');
grid on;
legend('Train Loss', 'Test Loss');
xlabel('iterations');
ylabel('loss');
title(' Train & Test Loss Curve');
学习曲线如下所示:
曲线解读:
通过学习曲线,可以评估当前的训练状态:
train loss 不断下降,test loss 不断下降,说明网络仍然在学习。
train loss 不断下降,test loss 趋于不变,说明网络过拟合。
train loss 趋于不变,test loss区域不变,说明学习曲线遇到瓶颈,需减小学习速率或批量数据尺寸。
train loss 趋于不变,test loss不断下降,说明数据集100%有问题。
train loss 不断上升,test loss 不断上升(最终变为NaN)可能是网络结构设计不当,训练超参数设计不当,程序bug等某个问题引起的,需要进一步等位。
ps:这里用到了awk用于文本处理,非常方便。