2016-10-15 2 views
0

Я использовал HDF5 как один из входных данных для подачи кофе, файл hdf5 содержит только некоторую информацию о весе, чтобы добавить слой sigmoidcrossentropyloss, чтобы он не содержал label .Это ошибка:caffe hdf5 H5LTfind_dataset (file_id, dataset_name_) Не удалось найти набор данных HDF5

I1015 07:08:54.605777 17909 net.cpp:100] Creating Layer weight28 
    I1015 07:08:54.605797 17909 net.cpp:408] weight28 -> weight28 
    I1015 07:08:54.605834 17909 hdf5_data_layer.cpp:79] Loading list of HDF5 filenames from: /home/zhangyu/codes/unsupervised/data/weight28.txt 
    I1015 07:08:54.605926 17909 hdf5_data_layer.cpp:93] Number of HDF5 files: 1 
    F1015 07:08:54.608682 17909 hdf5.cpp:14] Check failed: H5LTfind_dataset(file_id, dataset_name_) Failed to find HDF5 dataset weight28 
    *** Check failure stack trace: *** 
     @  0x7f17077ec9fd google::LogMessage::Fail() 
     @  0x7f17077ee89d google::LogMessage::SendToLog() 
     @  0x7f17077ec5ec google::LogMessage::Flush() 
     @  0x7f17077ef1be google::LogMessageFatal::~LogMessageFatal() 
     @  0x7f1707e4d774 caffe::hdf5_load_nd_dataset_helper<>() 
     @  0x7f1707e4bcf0 caffe::hdf5_load_nd_dataset<>() 
     @  0x7f1707e8fd78 caffe::HDF5DataLayer<>::LoadHDF5FileData() 
     @  0x7f1707e8ebf8 caffe::HDF5DataLayer<>::LayerSetUp() 
     @  0x7f1707e283b2 caffe::Net<>::Init() 
     @  0x7f1707e2ad85 caffe::Net<>::Net() 
     @  0x7f1707e6da5f caffe::Solver<>::InitTrainNet() 
     @  0x7f1707e6df7b caffe::Solver<>::Init() 
     @  0x7f1707e6e3e8 caffe::Solver<>::Solver() 
     @  0x7f1707e865a3 caffe::Creator_SGDSolver<>() 
     @   0x4116b1 caffe::SolverRegistry<>::CreateSolver() 
     @   0x40ac56 train() 
     @   0x406e32 main 
     @  0x7f17066adf45 (unknown) 
     @   0x4074b6 (unknown) 

I searched для этой проблемы, и кажется, что мой файл hdf5 нужен набор данных ярлык, но тот факт, что я не нужно. Мне нужен только набор данных 91250x28x28. И подавайте его на слой потерь как вес. Вот мой h5 файл:

HDF5 weight28.h5 
Group '/' 
    Dataset 'data' 
     Size: 2555000x28 
     MaxSize: Infx28 
     Datatype: H5T_IEEE_F64LE (double) 
     ChunkSize: 28x28 
     Filters: none 
     FillValue: 0.000000 

Я изменил sigmiodcrossentropy слой, чтобы добавить его в качестве третьего нижнего слоя:

// modified here 
    const Dtype* pixelweights = bottom[2]->cpu->data(); 

    Dtype loss = 0; 
    for (int i = 0; i < count; ++i) { 
    loss -= pixelweights(i)*(input_data[i] * (target[i] - (input_data[i] >= 0)) - 
      log(1 + exp(input_data[i] - 2 * input_data[i] * (input_data[i] >= 0)))); 
    } 
    top[0]->mutable_cpu_data()[0] = loss/num; 
} 

Файл прото:

layer { 
    name: "loss_G" 
    type: "SigmoidCrossEntropyLoss" 
    bottom: "global_smR" 
    bottom: "mask28" 
    bottom: "weight28" //Added it here 
    top: "loss_G" 
} 

Я ожидал, что пакет данных в файле h5 будет считаться в сети как bottom[2] (размер batchsize * 28 * 28). Вот вопрос.

  • Могу ли я получить то, что я ожидал от кода выше?
  • Должен ли я добавить набор меток в файл h5, чтобы решить эту ошибку?
  • Если я добавлю его в файл h5, как я должен обрабатывать дополнительные данные метки в слое потерь?

Любые советы будут использоваться, спасибо!

ответ

1

Ваш "HDF5Data" имеет top имени "weight28", но ваш файл h5 имеет только набор данных "data". "top" слоя "HDF5Data"должен быть таким же, как имя набора данных, хранящееся в файле h5. Если в одном файле содержится несколько данных, вы можете иметь несколько top с именами наборов данных в файле h5.

Смежные вопросы