2016-11-29 4 views
1

다음 코드를 사용하여 넷을로드하고 설정합니다. 레이어의 매개 변수는 deploy.prototxt에 저장됩니다.Caffe에서 레이어의 매개 변수를 동적으로 수정합니다.

net = caffe.Net(deploy.prototxt, caffemodel, caffe.TEST)

그러나, 내가 뭘 원하는 층 의 매개 변수 (예를 들어 kernel_size, 또는 pad 등) 동적 대신 prototxt 파일을 수정하고 다시로드를 수정하는 것입니다. 그렇게 할 방법이 있습니까?

답변

0

자신 만의 get/set 메서드를 작성하여 파이썬에 공개 할 수 있습니다. layer.hpp에서 :

virtual float GetParameter(const std::string param_name) {return -1;} 
virtual void SetParameter(const std::string param_name, float val) {} 

그런 다음 동적/세트 매개 변수를 좀하고 싶습니다 층에서 이러한 방법을 재정의.

마지막 단계는 메소드를 파이썬에 노출시키는 것입니다. _caffe.cpp에서 bp::class_<Layer...이 추가 :

.def("get_parameter", &Layer<Dtype>::GetParameter) 
.def("set_parameter", &Layer<Dtype>::SetParameter) 
+0

감사합니다. 디렉터리를 변경하여 .prototxt 파일을 동적으로 변경하는 또 다른 솔루션을 찾았습니다. 솔루션이 더 유연해질 것이라고 생각합니다. – zbqv

0

나는이 문제의 사고 방식을 변경 제안합니다. "동적으로 수정 된 매개 변수"에 대해 언급 한 내용은 무엇에 달려 있습니까? 가장 일반적으로 사용되는 변수는 현재 반복되는 시간입니다. 예를 들어 10000 번마다 매개 변수 값을 줄이려고합니다. 이를 바탕으로 해당 매개 변수를 사용할 때 레이어에서 함수를 적용하여 수정합니다. 이것은 prototxt 파일을 수정하는 것과 같습니다.

특정 레이어에서 반복 횟수를 얻으려면 여기에 다른 솔루션을 넣으십시오. 이것은 매우 간단하며 prototxt 파일을 수정하는 것과 비교하여 작업 부하를 상당히 줄일 수 있습니다. 바라건대 당신은이 솔루션에서 영감을 얻어 귀하의 경우에 적용 할 수 있습니다. 답변에 대한

https://stackoverflow.com/a/38386603/6591990