如何使用LSTM在caffe中执行序列标记

时间:2016-05-11 09:42:07

标签: sequence caffe lstm labeling

我查看了使用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
  • 没有超过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])

One can see that for every timestep, the same output has been predicted

在图像中可以看出,对于每个时间步长,都计算了相同的概率。

0 个答案:

没有答案