##中间层输出思路
- 将训练得到的网络参数进行保存
- 重新搭建网络结构,将中间层作为输出层,并加载训练好的网络参数
- 输入样本进行计算,将输出结果(Ndarray类型)转化为Mat类型
##中间层输出问题总结
-
将float类型批量存入Mat时,需要在
mat.ptr(0)
中加入<float>
如下所示float* ptr_mat = out_mat.ptr<float>(0);
在用imwrite
之前需要执行cv::normalize(mat, mat, 0, 255, CV_MINMAX);
-
如果算法改变后并没有明显变化,可以尝试清理解决方案
-
vector<Mat>
的使用 需要注意,vector<Mat>
使用push_back时push进去的是Mat的地址,而不是值,如果需要push值进去,则需要如下方法
vector<cv::Mat> inter_lay(out_shape[1]);
for (int i = 0; i < out_shape[1]; i++)
{
cv::Mat out_mat = cv::Mat::zeros(out_shape[2], out_shape[3], CV_32FC1);
float* ptr_mat = out_mat.ptr<float>(0);
for (size_t j = 0; j < out_shape[2] * out_shape[3]; j++)
{
ptr_mat[j] = dptr_out[j + i* out_shape[2] * out_shape[3]];
}
cv::normalize(out_mat, out_mat, 0, 255, CV_MINMAX);
out_mat.copyTo(inter_lay[i]);
//outshape[1]表示vector大小,outshape[2]和3分别表示Mat的长宽像素值