1、利用caffe訓練期間,內存需要多少,內存中都保存了學什麼?
內存需要保存一個訓練週期中的所有 feature map 數據+網絡參數數據
受bach_size 及網絡模型大小關係較大。
2、利用訓練好的模型文件.caffemodel如何初始化網絡模型文件 .prototxt?
- matlab 接口:
net=caffe.Net()
net.copy_from() - caffe 源碼解釋:
調用函數:caffe_net.CopyTrainedLayersFrom(FLAGS_weights);
利用 .caffemodel文件中與網絡模型文件(.prototxt)網絡層名稱一致的參數進行賦值,與其網絡名稱不一致的不做處理,默認是隨機初始化。
template <typename Dtype>
void Net<Dtype>**::CopyTrainedLayersFrom(const NetParameter& param)** {
int num_source_layers = param.layer_size();
for (int i = 0; i < num_source_layers; ++i) {
const LayerParameter& source_layer = param.layer(i);
const string& source_layer_name = source_layer.name();
int target_layer_id = 0;
while (target_layer_id != layer_names_.size() &&
layer_names_[target_layer_id] != source_layer_name) {
++target_layer_id;
}
if (target_layer_id == layer_names_.size()) {
LOG(INFO) << "Ignoring source layer " << source_layer_name;
continue;
}
DLOG(INFO) << "Copying source layer " << source_layer_name;
vector<shared_ptr<Blob<Dtype> > >& target_blobs =
layers_[target_layer_id]->blobs();
CHECK_EQ(target_blobs.size(), source_layer.blobs_size())
<< "Incompatible number of blobs for layer " << source_layer_name;
for (int j = 0; j < target_blobs.size(); ++j) {
if (!target_blobs[j]->ShapeEquals(source_layer.blobs(j))) {
Blob<Dtype> source_blob;
const bool kReshape = true;
source_blob.FromProto(source_layer.blobs(j), kReshape);
LOG(FATAL) << "Cannot copy param " << j << " weights from layer '"
<< source_layer_name << "'; shape mismatch. Source param shape is "
<< source_blob.shape_string() << "; target param shape is "
<< target_blobs[j]->shape_string() << ". "
<< "To learn this layer's parameters from scratch rather than "
<< "copying from a saved net, rename the layer.";
}
const bool kReshape = false;
target_blobs[j]->FromProto(source_layer.blobs(j), kReshape);
}
}
}