void Net::ReadData(const mxArray *mx_data) { LayerInput *firstlayer = static_cast<LayerInput*>(layers_[0]); std::vector<size_t> data_dim = mexGetDimensions(mx_data); size_t mapsize1, mapsize2; if (kMapsOrder == kMatlabOrder) { mapsize1 = data_dim[0]; mapsize2 = data_dim[1]; } else { mapsize1 = data_dim[1]; mapsize2 = data_dim[0]; } mexAssert(mapsize1 == firstlayer->mapsize_[0] && mapsize2 == firstlayer->mapsize_[1], "Data and the first layer must have equal sizes"); size_t outputmaps = 1; if (data_dim.size() > 2) { outputmaps = data_dim[2]; } mexAssert(outputmaps == firstlayer->outputmaps_, "Data's 3rd dimension must be equal to the outputmaps on the input layer"); size_t samples_num = 1; if (data_dim.size() > 3) { samples_num = data_dim[3]; } ftype *data_ptr = mexGetPointer(mx_data); // transposed array data_.attach(data_ptr, samples_num, mapsize1 * mapsize2 * outputmaps, 1, true); if (firstlayer->norm_ > 0) { MatCPU norm_data(data_.size1(), data_.size2()); norm_data.reorder(true, false); norm_data = data_; norm_data.Normalize(firstlayer->norm_); Swap(data_, norm_data); } }
void Net::InitWeights(const mxArray *mx_weights_in) { // testing size_t num_weights = NumWeights(); mexAssert(num_weights == mexGetNumel(mx_weights_in), "In InitWeights the vector of weights has the wrong length!"); weights_.Init(mexGetPointer(mx_weights_in), num_weights); size_t offset = 0; for (size_t i = 0; i < layers_.size(); ++i) { layers_[i]->InitWeights(weights_, offset, false); } }
void Net::ReadData(const mxArray *mx_data) { std::vector<size_t> data_dim = mexGetDimensions(mx_data); mexAssert(data_dim.size() == 4, "The data array must have 4 dimensions"); mexAssert(data_dim[0] == layers_[0]->mapsize_[0] && data_dim[1] == layers_[0]->mapsize_[1], "Data and the first layer must have equal sizes"); mexAssert(data_dim[2] == layers_[0]->outputmaps_, "Data's 3rd dimension must be equal to the outputmaps on the input layer"); mexAssert(data_dim[3] > 0, "Input data array is empty"); ftype *data = mexGetPointer(mx_data); data_.attach(data, data_dim[3], data_dim[0] * data_dim[1] * data_dim[2]); }
void Net::InitWeights(const mxArray *mx_weights_in, mxArray *&mx_weights) { size_t num_weights = NumWeights(); bool isgen = false; if (mx_weights_in != NULL) { // training mexAssert(num_weights == mexGetNumel(mx_weights_in), "In InitWeights the vector of weights has the wrong length!"); mx_weights = mexDuplicateArray(mx_weights_in); } else { // genweights mx_weights = mexNewMatrix(1, num_weights); isgen = true; } weights_.Init(mexGetPointer(mx_weights), num_weights); size_t offset = 0; for (size_t i = 0; i < layers_.size(); ++i) { layers_[i]->InitWeights(weights_, offset, isgen); } }
void Net::GetWeights(mxArray *&mx_weights) const { size_t num_weights = NumWeights(); mx_weights = mexNewMatrix(num_weights, 1); Mat weights_cpu; weights_cpu.attach(mexGetPointer(mx_weights), num_weights, 1); Mat weights_mat(num_weights, 1); #if COMP_REGIME != 2 // CPU weights_mat.attach(weights_cpu); #endif size_t offset = 0; for (size_t i = 0; i < layers_.size(); ++i) { layers_[i]->GetWeights(weights_mat, offset); } #if COMP_REGIME == 2 // GPU DeviceToHost(weights_mat, weights_cpu); #endif }