首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MATLAB中从.txt文件中读取特定信息?

如何在MATLAB中从.txt文件中读取特定信息?
EN

Stack Overflow用户
提问于 2016-09-28 12:58:18
回答 2查看 49关注 0票数 0

我有一个这样长的文本文件:

I0927 11:33:18.534551 16932 solver.cpp:244]列车净输出#0:损失= 2.61145 (* 1= 2.61145损失) I0927 11:33:18.534620 16932 sgd_solver.cpp:106]迭代20,lr = 0.001 I0927 11:33:33.221546 16932 solver.cpp:228]迭代40,损失= 0.573027 I0927 11:33:33.221771 16932 solver.cpp:244]列车净输出#0:损耗= 0.573027 (* 1= 0.573027损失) I0927 11:33:33.221851 16932 sgd_solver.cpp:106]迭代40,lr = 0.001 I0927 11:33:47.883162 16932 solver.cpp:228]迭代60,损失= 0.852016 I0927 11:33:47.884717 16932 solver.cpp:244]列车净输出#0:损耗= 0.852016 (* 1= 0.852016损失) I0927 11:33:47.884812 16932 sgd_solver.cpp:106]迭代60,lr = 0.001 I0927 11:34:02.543320 16932 solver.cpp:228]迭代80,损失= 0.385975 I0927 11:34:02.543442 16932 solver.cpp:244]列车净输出#0:损耗= 0.385975 (* 1= 0.385975损失) I0927 11:34:02.543514 16932 sgd_solver.cpp:106]迭代80,lr = 0.001 I0927 11:34:17.297544 16932 solver.cpp:228]迭代100,损失= 0.526758 I0927 11:34:17.297659 16932 solver.cpp:244]列车净输出#0:损失= 0.526758 (* 1= 0.526758损失) I0927 11:34:17.297722 16932 sgd_solver.cpp:106]迭代100,lr = 0.001 I0927 11:34:31.962934 16932 solver.cpp:228]迭代120,损失= 0.792767

我想提取以下信息

[ Iteration, Train net output, lr ]

把它们放在MATLAB的一个牢房里。

你能告诉我怎么做吗?

EN

回答 2

Stack Overflow用户

发布于 2016-09-28 19:12:03

我正在删除日志的前两行和最后一行,以使日志一致,以便在每次迭代后都有一个Train net outputsgd_solver .. lr =行,如下所示:

代码语言:javascript
运行
复制
I0927 11:33:33.221546 16932 solver.cpp:228] Iteration 40, loss = 0.573027
I0927 11:33:33.221771 16932 solver.cpp:244]     Train net output #0: loss = 0.573027 (* 1 = 0.573027 loss)
I0927 11:33:33.221851 16932 sgd_solver.cpp:106] Iteration 40, lr = 0.001
I0927 11:33:47.883162 16932 solver.cpp:228] Iteration 60, loss = 0.852016
I0927 11:33:47.884717 16932 solver.cpp:244]     Train net output #0: loss = 0.852016 (* 1 = 0.852016 loss)
I0927 11:33:47.884812 16932 sgd_solver.cpp:106] Iteration 60, lr = 0.001
I0927 11:34:02.543320 16932 solver.cpp:228] Iteration 80, loss = 0.385975
I0927 11:34:02.543442 16932 solver.cpp:244]     Train net output #0: loss = 0.385975 (* 1 = 0.385975 loss)
I0927 11:34:02.543514 16932 sgd_solver.cpp:106] Iteration 80, lr = 0.001
I0927 11:34:17.297544 16932 solver.cpp:228] Iteration 100, loss = 0.526758
I0927 11:34:17.297659 16932 solver.cpp:244]     Train net output #0: loss = 0.526758 (* 1 = 0.526758 loss)
I0927 11:34:17.297722 16932 sgd_solver.cpp:106] Iteration 100, lr = 0.001

您可以使用fileread将该文件读取为文本,然后使用以下代码执行regexp

代码语言:javascript
运行
复制
txt = fileread('log.txt');
it = regexp(txt,'I0927.*solver.cpp:228]\sIteration\s(.*),.*','tokens','dotexceptnewline')

it =

  1×4 cell array

    {1×1 cell}    {1×1 cell}    {1×1 cell}    {1×1 cell}

net_out = regexp(txt,'I0927.*solver.cpp:244]\s*Train\snet\soutput.*loss\s=\s(\S*).*','tokens','dotexceptnewline');
lr = regexp(txt,'I0927.*sgd_solver.cpp:106]\sIteration.*lr\s=\s(\S*)','tokens','dotexceptnewline');

在将输出转换为数字之前,需要进行一些条件调整:

代码语言:javascript
运行
复制
% Get outputs out of their cells
it = [it{:}]'; 
net_out = [net_out{:}]';
lr = [lr{:}]';

sim_out = str2double([it net_out lr]);
票数 1
EN

Stack Overflow用户

发布于 2016-09-28 14:19:51

正如Some Guy所建议的,您可以使用regexp

代码语言:javascript
运行
复制
fid = fopen('log.txt','r');
output = {};
line = fgetl(fid);
while ischar(line)
    l1 = regexp(line, 'Iteration\s+(\d+),\s+loss\s+=\s+', 'tokens', 'once');
    if ~isempty(l1)
        %// we got the first line of an iteration
        line = fgetl(fid);
        l2 = regexp(line, 'Train net output #0: loss = (\S+)', 'tokens', 'once');
        line = fgetl(fid);
        l3 = regexp(line, 'Iteration \d+, lr = (\S+)', 'tokens', 'once');
        output{end+1} = [str2double(l1{1}), str2double(l2{1}), str2double(l3{1})];
    end
    line = fgetl(fid);
end;
fclose(fid);
output = vertcat(output{:});

顺便说一句,你知道caffe的$CAFFE_ROOT/tools/extra/parse_log.py实用吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39748273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档