Lenetの Python の例を見ると、MNIST テスト データセット全体を実行するために必要な反復回数がハードコーディングされていることがわかります。しかし、この値をまったくハードコーディングできないでしょうか? Pythonでネットワークが指すデータセットのサンプル数を取得するには?
2 に答える
ライブラリを使用しlmdb
て、lmdb に直接アクセスできます。
import lmdb
db = lmdb.open('/path/to/lmdb_folder') //Needs lmdb - method
num_examples = int( db.stat()['entries'] )
あなたのためにトリックを行う必要があります。
1つの質問で反復とサンプルの量を混合したようです。提供された例では、反復回数、つまりトレーニング フェーズが繰り返される回数のみを確認できます。反復の量(ネットワーク トレーニング パラメーター) とデータセット内のサンプルの量(ネットワーク入力)の間に直接的な関係はありません。
より詳細な説明:
編集: Caffeは、トレーニングまたはテストのために (バッチ サイズx反復) サンプルを完全に読み込みますが、読み込まれたサンプルの量と実際のデータベース サイズとは関係ありません。データベースの最後のレコードに到達した後、最初から読み取りを開始します。つまり、Caffeのデータベースは循環バッファのように機能します。
言及された例は、この構成を示しています。lmdb の入力を想定しており、トレーニングフェーズではバッチ サイズを64 (バッチと BLOBに関する詳細情報) に、テストフェーズでは100に設定していることがわかります。実際には、入力データセット サイズ、つまりデータセット内のサンプル数については何も想定していません。バッチ サイズはチャンク サイズを処理するだけであり、反復はカフェが使用するバッチ数です。データベースの終わりに達しても停止しません。
つまり、ネットワーク自体 (つまり、protobuf 構成ファイル) は、データベース内の任意の数のサンプルを指すのではなく、データセットの名前と形式、および必要な量のサンプルのみを指します。私が知っているように、現時点ではデータベースのサイズをcaffeで決定する方法はありません。
したがって、テストのためにデータセット全体をロードする場合は、最初にmnist_test_lmdbまたはmnist_train_lmdbでサンプルの量を手動で決定し、次にバッチ サイズと反復に対応する値を指定するオプションしかありません。
これにはいくつかのオプションがあります。
- コンソール出力を見てください- 初期フォーマットからの変換中にサンプルの量を出力します (このチュートリアル
./examples/mnist/create_mnist.sh
に従ったと思います); - @Shai のアドバイスに従います (lmdb ファイルを直接読み取ります)。