我有一个训练有素的网络,它由以下几层组成: {conv1,pool1,conv2,pool2,conv3,pool3,conv4,pool4,fc5,fc6,output} 其中fc表示完全连接的层,conv表示卷积层。
我需要为某些图像进行特征提取。我正在使用烤宽面条和Theano。 我需要保存每个图层的功能以供以后分析。我是这种语言的新手所以我试图找到示例代码或一些教程(使用theano / lasagne)。但是,我不明白我应该自己做什么。
如果有人可以指导我如何实现特征提取,我将不胜感激。
提前谢谢
编辑:我跟随先生/女士gntoni的评论,这是我的代码:
v2.7
对于我的情况,我需要保存每个图层的功能。我想编写一个像Caffe那样的函数:
feat_all = []
for layer in layer_list:
feat = np.zeros_like(lasagne.layers.get_output([self.acnn.cnn[layer]], inputs = img, deterministic=True))
feat[:] = lasagne.layers.get_output([self.acnn.cnn[layer]], inputs = img, deterministic=True)
feat_all.append(feat)
=
然而,我训练有素的模型是用千层面和theano写的,所以我必须用千层面格式来实现。
在编写上面的代码(在千层面)后,我得到一个空输出。 我想知道为什么以及如何解决它。
提前谢谢
答案 0 :(得分:1)
与你的卷积神经网络一样,它包含两部分:
第一个是特征提取部分,在你的情况下包括转化池层{conv1,pool1,conv2,pool2,conv3,pool3,conv4,pool4}。
第二个是分类部分。在您的网络中:{fc5,fc6,output}。
培训时,第一部分是试图获得第二部分要分类的输入数据的最佳表示。
因此,如果经过培训,您可以断开这两个部分, conv4 图层的输出将为您提供所需的功能。
此功能可与不同的分类器一起使用。实际上,许多人使用已经训练过的网络(例如AlexNet),删除最后的分类层,并将这些功能与自己的分类系统一起使用。
答案 1 :(得分:0)
请注意,在Lasagne中,get_output
方法会返回Theano张量,您无法直接使用它们来计算numpy
数组中的要素。但是,您可以定义Theano 函数并使用它来计算值。在你的情况下:
layers = [self.acnn.cnn[layer] for layer in layer_list]
feat_fn = theano.function([input_var], lasagne.layers.get_output(layers),
deterministic=True)
其中input_var
是网络的输入张量。 get_output
方法可以接受多个图层,而Theano函数可以有多个输出,因此您可以定义单个函数来提取所有要素。获得数值就这么简单:
feat_all = feat_fn(img)