如何将预训练的权重输入到caffe网络中?

假如我用matlab构建了一个sparse autoencoder,先预训练好权重,然后又构造了一个cnn网络,有几个问题:
(1)是否是选择sparse autoencoder从输入层到第一隐含层的权重作为cnn的初始权重,这样是否要求训练好的权重维度与cnn中第一层的卷积层中的卷积核维度和个数一致?
(2)matlab训练的权重为mat格式,如何将其输入到cnn中?同时是否此时就不用指定cnn第一层的卷积层中卷积核的初始化方式,如“gaussion”或“Xavier”?
(3)cnn网络中的其他卷积层是否还需要初始化?还是只需要初始化第一层的卷积层?如果有必要,该怎么初始化?
求大神指教
已邀请:

星空下的巫师 - https://github.com/shicai/Caffe_Manual

赞同来自: 辛淼 ruirui_ICT OpenAI

刚好也做过AutoEncoder,简短回答下:
(1)用SAE的第一层权重初始化CNN的第一层权重是可以的,我用SAE训练出来的和用CNN训练出来的第一层权重基本都是类似的,维度必须一致的;
(2)SAE的权重为mat格式,建议用matlab的fwrite函数写成二进制格式,然后在caffe里用C的fread函数读取到内存就可以,然后复制给第一层权重的指针内存,或者用pycaffe,也是可以直接读mat格式的文件的;初始化格式,可以任意一个都可以,因为无论怎么初始化,那片内存都是要被你的SAE权重覆写的;
(3)如果按照你的思路,是需要每层都初始化的,可以用Stacked AutoEncoder或者Stacked Convolutional AutoEncoder,按照期望的格式,一层一层的单独训练,然后合起来Finetuning,得到整个AutoEncoder网络的权重,然后传递给CNN当做初始化。
 
PS:如果你有足够多的数据,完全可以用CNN直接训练,不需要用AE来初始化CNN。

Goodwin

赞同来自:

(1) 不理解第一隐含层是什么意思,如要初始化,要求pre-trained模型的维度(滤波器数量大小等)与要被初始化网络的维度一直。
(2) 题主问的cnn是不是指的caffe训练获得的cnn模型,如果保存的是mat格式文件,可以考虑使用pycaffe。
(3) 不知道题主要做什么,CNN中卷积层和全连接层是都要初始化的。如果没有pre-trained模型,可以使用随机初始化方法(如xavier等)。

要回复问题请先登录注册