50207


Ubuntu上でCaffeを使い、機械学習を実行しています。

学習が終わった際にLossとAccuracyのグラフを描画しています。  
この時にCaffeに元から入っていた"plot_log.gnuplot.example"というファイルを元にグラフを作っています。  
"plot_log.gnuplot.example"には以下のような記述があり、

[code]

    plot "mnist.log.train" using 1:3 title "mnist"
    plot "mnist.log.test" using 1:4 title "mnist"
    
[/code]

-.trainと-.testというファイルから数値を取得してグラフを作っているのだと思うのですが、フォルダ内にあるこれらの拡張子を持つファイル名を順番に取得して、テキストファイルを更新していくにはどのようなコマンドで記述すればいいのでしょうか。

例えばフォルダ内に  
aaa.train  
aaa.test  
bbb.train  
bbb.test  
ccc.train  
ccc.test  
という風にファイルがある時に、テキストファイル内の

[code]

    plot "mnist.test" using 2:3 title "mnist"
    
[/code]

"mnist"の部分を"aaa"に更新してgnuplotでグラフを書き、  
その後に"aaa"を"bbb"、"bbb"を"ccc"に変えていきフォルダ内の全てのグラフを描画したいと思っています。

知識がないため、上手く説明ができていないかもしれませんが  
ご教示よろしくお願いいたします。


CC BY-SA 4.0
2018-11-11T07:31:25.367
50203
2018-11-11T10:13:51.473
2018-11-11T07:41:28.267
3060
30940
question
linux ubuntu caffe gnuplot
Ubuntuでフォルダ内のファイル名を取得してテキストファイルを更新する方法


「それぞれのファイルに対してほぼ同じコマンドを実行したい」というときにまず検討するのはシェルスクリプトの利用だと思います。

たとえば、ファイル名のところだけ「穴」にしたテンプレートを用意して、ファイルごとに「穴」を [sed
コマンド](https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230879/)や [awk
コマンド](http://www.atmarkit.co.jp/ait/articles/1706/02/news017.html)で埋め、実行するという方法が考えられます。「すべてのファイルに対して実行する」ためには
[find コマンド](https://tech.nikkeibp.co.jp/it/article/COLUMN/20060227/230777/)の
`-exec` オプションやシェルスクリプトの `for` が便利です。

今回はシェルスクリプトで作ってみます。まずテンプレートを作ります。「穴」を `%%NAME%%`
という文字列にしておいて、ここを後から置き換えます。ファイル名はここでは `plot_log.gnuplot.template`
にしました。中身はあくまで例なので適当に書き換えてください。

[code]

    reset
    set terminal png
    set output "%%NAME%%.png"
    set style data lines
    set key right
    
    set title "Template Example"
    plot "%%NAME%%.train" using 1:3 title "example"
    
[/code]

次にこのテンプレートを書き換えて逐次実行するシェルスクリプトを作ります。`plot_all.sh` という名前にしました。

[code]

    #!/bin/sh
    
    for file in *.train; do
        name=$(basename "$file" .train)
        plotfile="plot_log_$name.gnuplot"
        sed -e "s/%%NAME%%/$name/g" plot_log.gnuplot.template > "$plotfile"
        gnuplot "$plotfile"
    done
    
[/code]

あとはこのスクリプトに実行権限をつけて実行すると、一気にプロットしてくれます。

[code]

    $ chmod +x plot_all.sh
    $ ./plot_all.sh
    
[/code]

というわけで、sed コマンドとシェルスクリプトの for 文を使って、同じ処理をすべてのファイルに対して行うことができました。

※ もう少し複雑なことがしたくなってきたら、シェルスクリプトでなくてもっと高機能なプログラミング言語を使うことを検討してみてください。


CC BY-SA 4.0
2018-11-11T10:13:51.473
50207
2018-11-11T10:13:51.473
19110
50203
answer