私はカフェの使用に比較的慣れておらず、(後で)微調整できる最小限の実用的な例を作成しようとしています。MNIST データで caffe の例を使用するのに何の問題もありませんでした。image-net データ (ILSVRC12) をダウンロードし、caffe のツールを使用して、次を使用して lmdb データベースに変換しました。
$CAFFE_ROOT/build/install/bin/convert_imageset -shuffle -encoded=true top_level_data_dir/ fileNames.txt lmdb_name
エンコードされた (jpeg) 画像データを含む lmdb を作成します。これは、エンコードされた lmdb が約 64GB であるのに対し、エンコードされていない lmdb は約 240GB であるためです。
ネットを記述する私の .prototxt ファイルは最小限です (主に MNIST の例から借りた 1 組の内積レイヤーです。ここでは正確さを求めるのではなく、何かを機能させたいだけです)。
name: "example"
layer {
name: "imagenet"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "train-lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "imagenet"
type: "Data"
top: "data"
top: "label"
include {
phase: TEST
}
transform_param {
scale: 0.00390625
}
data_param {
source: "test-lmdb"
batch_size: 100
backend: LMDB
}
}
layer {
name: "ip1"
type: "InnerProduct"
bottom: "data"
top: "ip1"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 1000
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "relu1"
type: "ReLU"
bottom: "ip1"
top: "ip1"
}
layer {
name: "ip2"
type: "InnerProduct"
bottom: "ip1"
top: "ip2"
param {
lr_mult: 1
}
param {
lr_mult: 2
}
inner_product_param {
num_output: 1000
weight_filler {
type: "xavier"
}
bias_filler {
type: "constant"
}
}
}
layer {
name: "accuracy"
type: "Accuracy"
bottom: "ip2"
bottom: "label"
top: "accuracy"
include {
phase: TEST
}
}
layer {
name: "loss"
type: "SoftmaxWithLoss"
bottom: "ip2"
bottom: "label"
top: "loss"
}
train-lmdb がエンコードされていない場合、この .prototxt ファイルは正常に機能します (精度は最悪ですが、caffe はクラッシュしません)。ただし、train-lmdb がエンコードされている場合、次のエラーが発生します。
data_transformer.cpp:239] Check failed: channels == img_channels (3 vs. 1)
質問: train-lmdb がエンコードされた画像であることを示す、.prototxt ファイルに設定する必要がある「フラグ」はありますか? (テスト データ レイヤー test-lmdb には、同じフラグを指定する必要がある可能性があります。)
ちょっとした調査:
グーグルをいじってみると、有望と思われる解決済みの問題が見つかりました。ただし、'force_encoded_color'
を true に設定しても問題は解決しませんでした。
また、この回答は lmdb の作成 (具体的には、エンコードを有効にするための指示) に非常に役立ちましたが、画像がエンコードされていることを caffe が認識できるようにするために何をすべきかについては言及されていませんでした。