Я использовал 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, как я должен обрабатывать дополнительные данные метки в слое потерь?
Любые советы будут использоваться, спасибо!