Не найдена соответствующая функция для dnn_trainer в dlib
Я пытаюсь обучить модель глубокого обучения dlib'd с моим набором функций, который находится в CSV. Я импортировал CSV и преобразовал данные в векторы trainindata и traininglabels как
unsigned int col=22;
std::vector<std::vector<float> >trainingdata(10711,std::vector<float>(col));
for (int j=0; j<10712; j++) {
std::vector<float> vt;
// <vector<float> >vt;
float tmp;
for (int i = 0; i < 22; i++) {
tmp=data[j][i];
// cout<< tmp;
vt.push_back(tmp);
}
trainingdata.push_back(vt);
}
std::vector<float> traininglabel;
for (int i=0;i<10712;i++) {
float tmp = lastCol[i];
traininglabel.push_back(tmp);
}
Данные успешно преобразуются в векторы, но я сомневаюсь, что они не соответствуют требуемому формату в dnn_trainer. Ошибка
error: no matching function for call to 'dlib::dnn_trainer<dlib::add_loss_layer<dlib::loss_multiclass_log_, dlib::add_layer<dlib::fc_<22ul, (dlib::fc_bias_mode)0u>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::fc_<84ul, (dlib::fc_bias_mode)0u>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::fc_<120ul, (dlib::fc_bias_mode)0u>, dlib::add_layer<dlib::max_pool_<2l, 2l, 2, 2, 0, 0>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::con_<16l, 5l, 5l, 1, 1, 2, 2>, dlib::add_layer<dlib::max_pool_<2l, 2l, 2, 2, 0, 0>, dlib::add_layer<dlib::relu_, dlib::add_layer<dlib::con_<6l, 5l, 5l, 1, 1, 2, 2>, dlib::input<dlib::matrix<float> >, void>, void>, void>, void>, void>, void>, void>, void>, void>, void>, void> > >::train(std::vector<std::vector<float> >&, std::vector<float>&)'
trainer.train( trainingdata,traininglabel);
файл trainer.h указывает, что входные данные должны быть типа
void train (
const std::vector<input_type>& data,
const std::vector<training_label_type>& labels
)
Я следую этому примеру с моим набором данных. Пожалуйста, помогите мне решить проблему.
1 ответ
Я получил ответ на эту проблему, и это решило ее. Функция dlib dnn принимает входные данные как матричный вектор, а матрица определяется в dlib, как MATLAB, для повышения скорости. Поэтому входные данные должны быть определены в соответствии с этим форматом. CSV загружен и передан в желаемые переменные как:
std::vector<matrix<float> > trdata;
std::vector<unsigned long> trlabel;
std::vector<matrix<float> > testdata;
std::fstream file("features.csv");
if (file.good()) {
for(int row=0;row<10712; row++){
for (int col = 0; col < 24; col++)
{
string temp;
if (col == 0)
getline(file, temp,',');
else if (col == 23)
{
getline(file, temp);
trlabel[row]=stof(temp);
}
else
{
getline(file,temp , ',');
trdata[row](0,0)=stof(temp);
}
}
}
}
В этом
std:vector<matrix<float> >trdata
способ определения входных данных тестирования для обучения DNN и
std::vector<unsigned long>trlabel
для тестовых этикеток, которые должны быть без знака длинного типа