【发布时间】:2017-08-16 22:51:13
【问题描述】:
我在 C++ 中使用 caffe 进行机器学习。
以net_->Forward();的身份通过网络后,我喜欢提取各个层的信息。
我做的是
net_->Forward();
//Extract layer information
cout << "Num layers:" << "'" << net_->layer_names().size() << "'"<< endl;
for (int layer_index = 0; layer_index < net_->layer_names().size(); ++layer_index)
{
// get that layer blob and its dimension
const boost::shared_ptr<Blob<float> > blob = net_->blob_by_name(net_->blob_names()[layer_index]);
int batch_size = blob->num();
int dim_features = blob->count() / batch_size;
std::cout << "Layer name:" << "'" << net_->layer_names()[layer_index] << "'" << " Blob name:" << "'" <<net_->blob_names()[layer_index] << "'" << " batch size " << "'" << batch_size << "'" << " dim_features:" << "'" << dim_features << "'" << std::endl;
}
我可以看到所有图层的名称和尺寸。
Layer name'image' Blob name'image' batch_size'1' dim_features'921600'
Layer name'conv1/7x7_s2' Blob name'conv1/7x7_s2' batch_size'1' dim_features'4915200'
Layer name'conv1/relu_7x7' Blob name'pool1/3x3_s2' batch_size'1' dim_features'1228800'
Layer name'pool1/3x3_s2' Blob name'pool1/norm1' batch_size'1' dim_features'1228800'
Layer name'pool1/norm1' Blob name'conv2/3x3_reduce' batch_size'1' dim_features'1228800'
Layer name'conv2/3x3_reduce' Blob name'conv2/3x3' batch_size'1' dim_features'3686400'
Layer name'conv2/relu_3x3_reduce' Blob name'conv2/norm2' batch_size'1' dim_features'3686400'
但在这里我仍然需要更深入的信息。
当前维度为 921600,即批量大小 x 通道 x 高度 x 宽度 = 921600。
(1)所以我的第一个问题是如何拆分信息?
(2)假设我有这个信息批量大小 x 通道 x 高度 x 宽度 = 1 x 3 x 480 x 640。然后
如何提取像 1 x 1 x 480 x 640 这样的 blob 中的每一层,以便我可以打印或绘图。
我可以在 Python 中做类似的事情
for layer_name, blob in net.blobs.iteritems():
print layer_name + '\t' + str(blob.data.shape)
mydata = net.blobs[layer_name].data[0,0,:,:]
#cv2.imshow("mydata",mydata);
#cv2.waitKey(1)
layer_name = layer_name.replace('/', '_')
np.savetxt("printdata/"+layer_name+".csv", mydata, delimiter=",")
但现在,我喜欢在 C++ 做。
【问题讨论】:
标签: c++ python-2.7 deep-learning caffe