我查看了使用LSTM进行分类的LRCN示例(http://tutorial.caffe.berkeleyvision.org/caffe-cvpr15-sequences.pdf)。对于视频分类,进行多数投票。这是为什么?我会假设一个人等到序列结束?
在我的玩具中,例如二进制计数,我以两种不同的方式输入标签。 首先,我用序列标签标记每个时间步。其次,我用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
对于分类我使用了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])
在图像中可以看出,对于每个时间步长,都计算了相同的概率。