تغییر فایل topology از train به deploy در caffe - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تغییر فایل topology از train به deploy در caffe

0 امتیاز
38 بازدید
سلام.دوستان لطفا توضیج بدید چطور می بایست یک توپولوژی  train در caffe به یک توپولوژی deploy ( اجرایی) تبدیل کنیم.
توپولوژی train را استفاده کردم ولی خطا داد .لطفا بفرمائید چه تغییراتی بدم. .لطفا راهنمایی کنید.تشکر
سوال شده خرداد 6  بوسیله ی RaHmAtI (امتیاز 54)   7

1 پاسخ

+2 امتیاز
 
بهترین پاسخ

تا الان شبکه شما برای آموزش کاربرد داره برای تبدیل به فاز deplyment باید مراحل زیر را انجام بدید.

1- لایه داده ای که در مرحله آموزش استفاده کردید را از فایل توپولوژی حذف کنید.

2-لایه های بالای شبکه که از لایه label استفاده می کنند را حذف کنید.

3- تنظیم شبکه برای دریافت داده های ورودی.

4-تنظیم خروجی شبکه.

با مثال شبکه LeNet براتون توضیح میدم از آن جهت شناسایی پایگاه داده MNIST استفاده میشه.

این شبکه دو لایه داره یکی برای آموزش و دیگری تست.که هر کدام در واقع با تگ include از هم جدا شدند.

به مثال زیر توجه کنید این خلاصه شده شبکه LeNet هستش.

name: "LeNet"
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_train_lmdb"
    batch_size: 64
    backend: LMDB
  }
}
layer {
  name: "mnist"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    scale: 0.00390625
  }
  data_param {
    source: "examples/mnist/mnist_test_lmdb"
    batch_size: 100
    backend: LMDB
  }
}

...

layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "ip2"
  bottom: "label"
  top: "accuracy"
  include {
    phase: TEST
  }
}
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "ip2"
  bottom: "label"
  top: "loss"
}

مرحله اول شما اولین کاری که انجام می دید برداشتن دو لایه داده مرحله آموزش و تست هستش.

مرحله دوم لایه بالایی که به لایه label وابسته هستند را حذف کنید.

مرحله سوم همانطور که بالا توضیح دادیم دریافت داده هستش که به صورت زیردر ابتدای فایل .prototxt تعریفش می کنیم.

layer {
    name: "data"
    type: "Input"
    top: "data"
    input_param { shape: { dim: 1 dim: 1 dim: 28 dim: 28 } }
}

مرحله چهارم تنظیم نتیجه شبکه هستش. چون شبکه ای که ما در حال حاضر داریم اونو تغییر میدم تو لایه خروجی از Softmax با Loss استفاده کرده بود ما هم لایه خروجی رو از نوع Softmax قرار میدم که میشه به صورت زیر :

layer {
  name: "loss"
  type: "Softmax"
  bottom: "ip2"
  top: "loss"
}

تغییرات جدیدی را که خدمتتون عرض کردم را در فایلی با عنوان deploy.prototxt ذخیره کنید.

فرض کنید از همان نمونه classification.cpp  استفاده کنیم که به صورت زیر می تونید از فایل deploy.prototxt استفاده کنید.

ابتدا شبکه را بارگذاری کنید.

 std::string proto_network = R"(deploy.prototxt)";

	std::string model_file_name = R"(lenet_iter_10000.caffemodel)";
	
	Caffe::set_mode(Caffe::CPU);
	caffe::Net<float> lenet(proto_network, caffe::TEST);
    lenet.CopyTrainedLayersFrom(model_file_name);

 

سپس تصویر ورودی را بارگذاری و جهت دریافت نتیجه به شبکه بدید.

const int output_count = 10;
	std::string imageFile1 = R"(sample.jpg)";
	const cv::Size input_size(28, 28);

	cv::Mat img = cv::imread(imageFile1, 0);
	cv::normalize(img, img, 0, 1, CV_MINMAX, CV_32FC1);

	caffe::Blob<float> *input_ptr = lenet.input_blobs()[0];
	input_ptr->Reshape(1, 1,input_size.height, input_size.width);
	input_ptr->set_cpu_data((float*)img.data);

	Blob<float> *output_ptr = lenet.output_blobs()[0];
	output_ptr->Reshape(1, output_count, 1, 1);

    lenet.Forward();

	auto pos = std::max_element(output_ptr->cpu_data(), output_ptr->cpu_data() + output_count);
	cout << "res:" << std::distance(output_ptr->cpu_data(), pos) << "\t" << *pos << endl;

 

پاسخ داده شده خرداد 7 بوسیله ی مصطفی ساتکی (امتیاز 16,732)   17 25 66
...