Как использовать 1-мерный вектор в качестве входных данных для кафе?

Я хотел бы обучить нейронную сеть (NN) на своих собственных 1-мерных данных, которые я сохранил в базе данных hdf5 для caffe. Согласно документации это должно работать. Это также работает для меня, поскольку я использую только «Полностью подключенные слои», «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) 

Это ошибка, когда я хочу использовать только слой «Пул» за слоем «Внутренний продукт»:

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
  }
}

И вот как я вывожу свою 4D-базу данных (с двумя одноэлементными измерениями), используя функцию Matlabs h5write:

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

person mcExchange    schedule 22.06.2015    source источник


Ответы (2)


Кажется, вы выводите свои данные, используя неправильную форму. Caffe blobs имеют размеры (n_samples, n_channels, height, width) .

Кроме этого, ваш prototxt, похоже, подходит для прогнозирования на основе одномерных входных данных.

person pir    schedule 22.06.2015
comment
Вы правы, мои входные размеры были неправильными. Я узнал это, внимательно проверив вывод терминала, пока caffe создавал нейронную сеть. Там написано что-то вроде Top shape: 200 1 1 4872 (974400) . Тщательно проверив входные и выходные размеры каждого слоя из-за этих выходных данных журнала, я мог решить свою проблему. Спасибо - person mcExchange; 23.06.2015
comment
Кстати, вам может понадобиться меньший размер пакета, чем 200, что требует довольно много памяти. - person pir; 23.06.2015
comment
Не специально для ОП, но если это может кому-то помочь: у меня были похожие симптомы, однако фактическая проблема была не в самой сети, а в данных. Я загружал разные наборы данных с различной шириной (длиной 1D), и один набор данных имел очень короткую ширину, слишком короткую для используемой сети. Поэтому убедитесь, что ваши входные размеры достаточно велики. - person mdup; 03.11.2015

Поскольку у меня нет опыта использования h5create и h5write в Matlab, я не уверен, создается ли набор обучающих данных с размерами, которые вы ожидаете от него создать.

Сообщение об ошибке для слоя свертки говорит, что shape[i] = -9. Это означает, что ширина, высота, каналы или количество изображений в пакете устанавливаются равными -9.

В сообщении об ошибке при использовании только слоя пула говорится, что сеть может обнаружить только ввод 2D, в то время как сеть ожидает ввода 4D.

Сообщения об ошибках в обоих слоях связаны с изменением формы больших двоичных объектов, и это явный признак того, что размеры входных данных не соответствуют ожидаемым.

Попробуйте отладить функции Reshape, представленные в blob.cpp и Layers/pooling_layer.cpp, чтобы получить представление о том, какое значение на самом деле становится мошенническим.

person Anoop K. Prabhu    schedule 22.06.2015