【问题标题】:How to use 1-dim vector as input for caffe?如何使用 1-dim 向量作为 caffe 的输入?
【发布时间】:2015-09-08 02:19:54
【问题描述】:

我想在我自己的一维数据上训练一个神经网络 (NN),我将这些数据存储在一个用于 caffe 的 hdf5 数据库中。根据文档,这应该有效。只要我只使用“完全连接层”、“Relu”和“Dropout”,它也适用于我。但是,当我尝试在 NN 架构中使用“卷积”和“最大池化”层时出现错误。该错误抱怨数据的输入维度。

I0622 16:44:20.456007  9513 net.cpp:84] Creating Layer conv1
I0622 16:44:20.456015  9513 net.cpp:380] conv1 <- data
I0622 16:44:20.456048  9513 net.cpp:338] conv1 -> conv1
I0622 16:44:20.456061  9513 net.cpp:113] Setting up conv1
F0622 16:44:20.456487  9513 blob.cpp:28] Check failed: shape[i] >= 0 (-9 vs. 0) 

这是我只想在“InnerProduct”层后面使用“Pooling”层时的错误:

I0622 16:52:44.328660  9585 net.cpp:338] pool1 -> pool1
I0622 16:52:44.328666  9585 net.cpp:113] Setting up pool1
F0622 16:52:44.328680  9585 pooling_layer.cpp:84] Check failed: 4 == bottom[0]->num_axes() (4 vs. 2) Input must have 4 axes, corresponding to (num, channels, height, width)

但是我不知道如何更改输入尺寸以使其正常工作。 这是我指定网络架构的 prototxt 文件的开头:

name: "LeNet"
layer {
  name: "myNet"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  hdf5_data_param {
    source: "/path/to/my/data/train.txt"
    batch_size: 200
  }
}

layer {
  name: "myNet"
  type: "HDF5Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  hdf5_data_param {
    source: "/path/to/my/data/test.txt"
    batch_size: 200
  }
}

layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  param {
    lr_mult: 1
    decay_mult: 1
  }
  param {
    lr_mult: 2
    decay_mult: 0
  }
  convolution_param {
    num_output: 1
    kernel_h: 11
    kernel_w: 1    
    stride: 1
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}
layer {
  name: "relu1"
  type: "ReLU"
  bottom: "conv1"
  top: "conv1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "conv1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_h: 3
    kernel_w: 1
    stride: 2
  }
}

这就是我使用 Matlabs h5write 函数输出我的 4D 数据库(具有两个单一维度)的方式:

h5create('train.h5','/data',[dimFeats 1 1 numSamplesTrain]);
h5write('train.h5','/data', traindata); 

【问题讨论】:

标签: caffe


【解决方案1】:

您似乎使用错误的形状输出数据。 Caffe blob 的尺寸为 (n_samples, n_channels, height, width)

除此之外,您的 prototxt 似乎可以根据一维输入进行预测。

【讨论】:

  • 你是对的,我输入的尺寸是错误的。我通过仔细检查终端输出发现,而 caffe 正在创建神经网络。上面写着Top shape: 200 1 1 4872 (974400) 。由于这些日志记录输出,通过仔细检查每一层的输入和输出尺寸,我可以解决我的问题。谢谢
  • 顺便说一下,你可能想要一个小于 200 的批处理大小,这需要相当多的内存。
  • 不是专门针对 OP,但如果它可以帮助某人:我有类似的症状,但实际问题不在网络本身,而是在数据中。我提供了具有不同宽度(一维长度)的不同数据集,而一个数据集恰好有一个非常短的宽度,对于使用的网络来说太短了。因此,请确保您的输入尺寸足够大。
【解决方案2】:

由于我没有在 Matlab 中使用 h5createh5write 的经验,因此我不确定生成的训练数据集是否具有您期望它生成的维度。

卷积层的错误消息显示shape[i] = -9。这意味着批次中的宽度、高度、通道或图像数量都设置为 -9。

单独使用池化层时的错误消息表明网络只能检测到 2D 输入,而网络期望输入 4D。

两个层中的错误消息都与重塑 blob 有关,这清楚地表明输入的尺寸与预期不符。

尝试调试 blob.cpp 和 layers/pooling_layer.cpp 中的 Reshape 函数,以了解哪个值实际上是流氓。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多