Caffe: понимание ожидаемой структуры данных lmdb для blobs
Я пытаюсь понять, как данные интерпретируются в Caffe.
Для этого я взглянул на Minst Tutorial
Рассматривая определение входных данных:
layers {
name: "mnist"
type: DATA
data_param {
source: "mnist_train_lmdb"
backend: LMDB
batch_size: 64
scale: 0.00390625
}
top: "data"
top: "label"
}
Теперь я посмотрел mnist_train_lmdb и взял одну из записей (показано в шестнадцатеричном формате):
0801101C181C229006
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
00000000000054B99F973C2400000000000000000000000000000000
000000000000DEFEFEFEFEF1C6C6C6C6C6C6C6C6AA34000000000000
00000000000043724872A3E3FEE1FEFEFEFAE5FEFE8C000000000000
000000000000000000000011420E4343433B15ECFE6A000000000000
00000000000000000000000000000000000053FDD112000000000000
000000000000000000000000000000000016E9FF5300000000000000
000000000000000000000000000000000081FEEE2C00000000000000
000000000000000000000000000000003BF9FE3E0000000000000000
0000000000000000000000000000000085FEBB050000000000000000
00000000000000000000000000000009CDF83A000000000000000000
0000000000000000000000000000007EFEB600000000000000000000
00000000000000000000000000004BFBF03900000000000000000000
0000000000000000000000000013DDFEA60000000000000000000000
00000000000000000000000003CBFEDB230000000000000000000000
00000000000000000000000026FEFE4D000000000000000000000000
00000000000000000000001FE0FE7301000000000000000000000000
000000000000000000000085FEFE3400000000000000000000000000
000000000000000000003DF2FEFE3400000000000000000000000000
0000000000000000000079FEFEDB2800000000000000000000000000
0000000000000000000079FECF120000000000000000000000000000
00000000000000000000000000000000000000000000000000000000
2807
(Я добавил здесь разрывы строк, чтобы увидеть цифру "7".)
Теперь мой вопрос: , где описывается этот формат? Или иначе, если определено, что первые 36 байтов являются своего рода заголовком, а последние 8 байтов имеют некоторое соответствие ярлыков?
Как я могу построить собственные данные?
Ни Blob Tutorial, ни Layers Definition не дают о необходимых форматах. Мое намерение - не использовать данные изображения, а временные ряды
Спасибо!
Ответы
Ответ 1
Я понял, что буферы протокола должны входить в игру здесь. Поэтому я попытался десериализовать его против некоторых типов, определенных в caffe.proto.
Datum выглядит идеально:
{Caffe.Datum}
Channels: 1
Data: {byte[784]}
Encoded: false
FloatData: Count = 0
Height: 28
Label: 7
Width: 28
Итак, ответ прост: Это сериализованное представление экземпляра типизированного набора данных, определенного для caffe.proto
Btw. поскольку английский не является моим родным языком, мне пришлось сначала понять, что "Datum" - это единственная форма "данных"
Когда дело доходит до использования ваших собственных данных, оно структурируется следующим образом:
Обычными параметрами blob для данных являются номер N x channel K x высота H x ширина W. Память Blob имеет большое значение в макете, поэтому последняя /самый правый размер изменяется быстрее всего. Например, значение по индексу (n, k, h, w) физически находится в индексе ((n * K + k) * H + h) * W + w.
Смотрите Blobs, Layers и Nets: анатомия модели Caffe для справки
Ответ 2
Я могу попытаться ответить на ваш второй вопрос. Поскольку Caffe принимает данные только в виде нескольких выбранных форматов, таких как lmdb, hdf5 и т.д., Лучше всего конвертировать (или генерировать - в случае синтетических данных) ваши данные в эти форматы. Следующие ссылки могут помочь вам в этом. Если у вас возникли проблемы с import hdf5
в Python, вы можете обратиться к этой странице.
Создание файла LMDB в Python
Запись файла HDF5 в Python
HDF5 больше примеров