0

我查看了使用 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])

可以看到,对于每个时间步,都预测了相同的输出

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

4

0 回答 0