分類に LSTM を使用するLRCN の例 ( http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-sequences.pdf ) を見てきました。ビデオの分類では、多数決が行われます。何故ですか?シーケンスの終わりまで待つと思いますか?
私のおもちゃのバイナリ カウントの例では、ラベルを 2 つの異なる方法で入力しました。まず、すべてのタイムステップにシーケンス ラベルを付けました。次に、すべてのタイムステップに ignore_label を付けましたが、最後のラベルを付けました。簡単にするために、50 のシーケンス長と 50 のバッチサイズも使用しました。どちらのアプローチもネットワークにつながり、展開すると、すべてのタイムステップで同じ出力を受け取ります。
編集:おもちゃの例は、シーケンス全体を分類する代わりに、次の数字を予測する場合に機能します。したがって、番号ごとにラベルが存在します。これは、実際のシーケンス分類タスクのソリューションではありません。Kaparthy の投稿 ( http://karpathy.github.io/2015/05/21/rnn-effectiveness/ ) を使用して、次のネットワークを作成しました。
name: "BasicLstm"
layer {
name: "data"
type: "HDF5Data"
top: "data"
top: "cont"
top: "label"
include {
phase: TRAIN
}
hdf5_data_param {
source: "./path_to_txt.txt"
batch_size: 2000
}
}
layer {
name: "lstm1"
type: "LSTM"
bottom: "data"
bottom: "cont"
top: "lstm1"
recurrent_param {
num_output: 5
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "lstm2"
type: "LSTM"
bottom: "lstm1"
bottom: "cont"
top: "lstm2"
recurrent_param {
num_output: 4
weight_filler {
type: "uniform"
min: -0.08
max: 0.08
}
bias_filler {
type: "constant"
value: 0
}
}
}
layer {
name: "predict"
type: "InnerProduct"
bottom: "lstm2"
top: "predict"
param {
lr_mult: 1
decay_mult: 1
}
param {
lr_mult: 2
decay_mult: 0
}
inner_product_param {
num_output: 39
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
axis: 2
}
}
layer {
name: "softmax_loss"
type: "SoftmaxWithLoss"
bottom: "predict"
bottom: "label"
top: "loss"
loss_weight: 20
softmax_param {
axis: 2
}
loss_param {
ignore_label: -1
}
}
ソルバーの重要な部分: 私はすでに少し遊んでいますlr_policy: INV
が、最終的には固定で試しました
net: "Basic.prototxt"
test_initialization: false
base_lr: 0.001
momentum: 0.9
lr_policy: "fixed"
display: 50
max_iter: 1000000
solver_mode: GPU
- 2000 を超えるシーケンス範囲はありません。
- 10個のシーケンスを並べて配置しました。
- サイズ 132 の 1 つのホット ベクトルにデータを埋め込みました。
- 私のデータ HDF5 ファイルの寸法は次のとおりです: XX*10*132*1
- 私のデータには、各シーケンスの最後にラベルがあります。他のすべてのラベルは -1 であり、バックプロパゲーション中に無視されます。
- 効率を上げるために、複数の短いシーケンスをまとめました (2000 タイムステップ未満です)。
分類には、Python インターフェイスを使用しました。シーケンスを分類すると、次のようになります。
net.blobs['data'].reshape(726, 1, 132, 1)
net.blobs['cont'].reshape(726, 1)
net.blobs['data'].data[...] = data
net.blobs['cont'].data[...] = cont
output = net.forward()
output_prob = output['prob']
for i in range(726):
plt.plot(output_prob[i][0])
画像では、すべてのタイムステップで同じ確率が計算されていることがわかります。