我查看了使用 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
但最后我尝试了 fix
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 的热向量中。
- 我的数据 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])
在图像中可以看到,对于每个时间步,都计算了相同的概率。