参考博客:Caffe可视化MNIST错误识别样本 果然太小白啊,瞎折腾琢磨,出来结果貌似还不对,反正大概流程是搞懂了 1.首先对accuracy_layer函数进行功能添加,打开src/caffe/layers/accuracy_layer.cpp文件,在第88行添加如下代码段:
else { // 预测错误 ,此处else为添加的打印错误样本的代码 // index为batch中的图片序号(0~99),label为标签值,output为预测值 LOG(INFO) << "index:" << i << " label:" << label_value << " output:" << bottom_data_vector[k].second; }2.测试样本总共有10000个,分为100个batch,每个batch大小为100个,所以我们还需要输出每个batch的序号 ,打开src/caffe/solver.cpp文件,在第407行添加如下代码段:
for (int i = 0; i < param_.test_iter(test_net_id); ++i) { // 输出batch序号 LOG(INFO) << "batch:" << i; }3.做完上述改变之后发现运行训练程序时,并没有对应的输出,后来查看知乎上一条问题,在回答下面的回答中发现,再对层进行了修改之后,要对caffe进行make all,让它对修改过的层重新编译。 4.编译完成后,设置训练输出日志文件
$./examples/mnist/train_lenet.sh >& lenet.log &见《深度学习:21天实战caffe》第295页 5.执行训练过程
sudo sh examples/mnist/train_lenet.sh训练完成,日志已经被保存在lenet.log文件中 6.显示错误样本程序: 参考博客上面的程序放进去运行有错误,改来该去就成了这样版本的了:
%show_TrainError_minist_data.m %%%by-hh %最后结果感觉有错误,输出图片title格式为:正确标签->错误标签 clear;clc;close all; fid = fopen('lenet.txt'); % 替换为日志文件名 tline = fgetl(fid); C = []; % 定义空矩阵用来存放结果 batch=[]; index=[]; label=[]; output=[]; while feof(fid)==0 if ~isempty(strfind(tline, 'batch:')) ||~isempty(strfind(tline, 'index:'))% 查找字符串 % indexline = fgetl(fid); if ~isempty(strfind(tline, 'batch:')) %tline = indexline; % 在tline中解析batch idx1 = strfind(tline, 'batch:'); batch = [batch;str2num(tline(idx1 + 6 : length(tline)))]; elseif ~isempty(strfind(tline, 'index:')) % tline = indexline; % 在indexline中解析index,label,output idx2 = strfind(tline, 'index:'); idx3 = strfind(tline, 'label:'); idx4 = strfind(tline, 'output:'); index = [index;str2num(tline(idx2 + 6 : idx3 - 2))]; label = [label;str2num(tline(idx3 + 6 : idx4 - 2))]; output = [output;str2num(tline(idx4 + 7 : length(tline)))]; end end tline = fgetl(fid); end % 添加到数组 %disp('321..') C = [batch, index, label, output]; fclose(fid); % 可视化部分 image_file_name = 't10k-images-idx3-ubyte'; index_file_name = 't10k-labels-idx1-ubyte'; fid1 = fopen(image_file_name,'rb'); fid2 = fopen(index_file_name,'rb'); images_data = fread(fid1,'uint8'); index_data = fread(fid2,'uint8'); fclose(fid1); fclose(fid2); images_data = images_data(17:end); index_data = index_data(9:end); image_buffer = zeros(28, 28); for k = 1:1:size(C,1) figure(size(C,1)); index = C(k,1) * 100 + C(k,2)+1; image_buffer = reshape(images_data((index) * 28 * 28 + 1 : (index + 1) * 28 * 28), 28, 28); subplot(10, 10, k); imshow(uint8(image_buffer)'); % 转置 title(sprintf('%d->%d', index_data( index + 1), C(k,4))); % label -> output end7.结果感觉是错的,具体也不知道到底哪步出现了问题,还会有8->8这样的结果出现……