windowsでtiny-dnnを動かす
六花です。
今回はc++でニューラルネットワークが動かせるライブラリ、tiny-dnnの導入について書こうと思います。
■なぜ書こうと思ったの?
ソースは更新されてるのにドキュメントが整備されていなかったり、
なんかエラーが出たり、
動かしてみるまでに非常にげんなりした経験があるからです。
(ドキュメントの更新は大事、ゼッタイ。)
まず基本的なこととして、どうもVisual Studioで利用されることを想定されていないように感じます。
割と頻繁に「C1001 コンパイラで内部エラーが発生しました。」が発生します。
そのため、今回紹介した対策では問題が解決しない可能性があります。
(実際、私が以前やった対策と今回記事のためにやった対策は違いました。)
今回は、インクルードしただけのプロジェクトがコンパイルを通るまでを書きます。
■環境
Visual Studio Community 2017
tiny-dnn (2018/12/16ダウンロード)
■まずはダウンロード
tiny-dnnのサイトに飛んでダウンロードします。
「Clone or download」の緑のボタンをクリックして、「DownLoad ZIP」をクリックします。
(私はGitHubのアカウントを持っていません)
適当な場所に保存したら展開しておきます。
■Visual Studioでの操作
テスト用に空のプロジェクトを作りましょう。
#include "tiny_dnn/tiny_dnn.h"
int main()
{
return 0;
}
プロジェクトのプロパティを開いて、追加のインクルードディレクトリにtiny-dnnのディレクトリを追加します。
(私はプロジェクトディレクトリにそのまま展開しています)
そのままビルドすると、無事内部エラーが発生して失敗します。
■内部エラーは大体config.hで解決する(かも?)
内部エラーはこちらが何のコードを書いたせいで発生したのか教えてくれないため、非常に特定が困難です。
(今回なんかインクルードしただけで何も書いてない)
「tiny_dnn/config.h」というファイルがあり、この中で#defineによる設定変更ができるのですが、「お、こんな機能があるのか、使ってみよ」と有効にしてみるとエラーの原因になったりします。
例えば「#define CNN_USE_AVX」を有効にすると、私の環境では内部エラーになったことがあります。
今回作ってみたらビルド通ったので、うまくいかないときはプロジェクトを一から作り直すというのも手かもしれません。
さて、今回発生した内部エラーを解決するため、このconfig.hをいじってあがいてみます。
結論から言うと、「#define CNN_USE_EXCEPTIONS」と「#define CNN_USE_STDOUT」をコメントアウトしたらビルドが通りました。
CNN_USE_STDOUTの方は以前有効のままビルドが通っていたので使っていたのですが、何か出力された記憶がないのでデメリットがわかりません。
CNN_USE_EXCEPTIONSは参照を検索すると一つもひっかからないのですが、なぜ内部エラーになるんでしょうね?
後日、実装編を書く予定です。