कैफे में, convolution
परत एक निचला ब्लॉब लेता है, और इसे सीखा फ़िल्टर (जिसे वजन प्रकार - "जेवियर", "एमएसआरए" आदि का उपयोग करके प्रारंभ किया जाता है) के साथ घुल जाता है। हालांकि, मेरा सवाल यह है कि क्या हम केवल दो निचले ब्लब्स को हल कर सकते हैं और एक शीर्ष ब्लॉब का उत्पादन कर सकते हैं। ऐसा करने का सबसे शानदार तरीका क्या होगा? इसका उद्देश्य यह है: नीचे ब्लॉब में से एक data
होगा और दूसरा एक गतिशील फ़िल्टर होगा (data
के आधार पर बदल रहा है) पिछली परतों द्वारा उत्पादित (मैं dynamic convolution लागू करने की कोशिश कर रहा हूं)।कैफे में दो ब्लब्स को कैसे नियंत्रित करें
मेरे प्रयास:
एक तरह से जो मेरे मन में आए filler.hpp
को संशोधित करने और एक filler
मैट्रिक्स ही ("जेवियर", "MSRA" आदि के बजाय) के रूप में एक नीचे ब्लॉब आवंटित करने के लिए किया गया था। तब मैंने सोचा कि संकल्प परत वहां से उठाएगी। हम lr = 0
सेट कर सकते हैं यह इंगित करने के लिए कि हमारे कस्टम फिलर द्वारा शुरू किया गया वजन बदला नहीं जाना चाहिए। हालांकि, मैंने सोर्स कोड को देखने के बाद, मुझे अभी भी यह नहीं पता कि यह कैसे करना है। दूसरी तरफ, मैं कैफे के वर्कफ़्लो को तोड़ना नहीं चाहता हूं। मैं अभी भी दृढ़ परतों को सामान्य रूप से काम करना चाहता हूं, अगर मैं उन्हें चाहता हूं।
जाहिर है एक और अधिक कठिन रास्ता Slice
, tile
और/या Scale
परत के संयोजन का उपयोग करने के लिए सचमुच घुमाव के लागू करने के लिए है। मुझे लगता है कि यह काम करेगा, लेकिन यह गन्दा हो जाएगा। कोई अन्य विचार?
संपादित करें 1:
मैं Caffe के घुमाव के परत को संशोधित करके एक नई परत को लिखा था। विशेष रूप से, src/caffe/layers/conv_layer.cpp
में, लाइन 27 पर, यह वजन filler
द्वारा परिभाषित किया जाता है और इसे नीचे ब्लॉब के साथ घुल जाता है। तो filler
से उस ब्लॉब को पॉप्युलेट करने के बजाय, मैंने परत को संशोधित किया है कि अब इसमें दो बोतलें हैं। नीचे से एक सीधे filler को सौंपा जाता है। अब मुझे कुछ अन्य बदलाव करना पड़ा जैसे:
weight
ब्लॉब के सभी नमूनों के लिए समान मूल्य है। यहां विभिन्न नमूनों के लिए इसका एक अलग मूल्य होगा।
this->forward_cpu_gemm(
bottom_data + n * this->bottom_dim_,
weight,
top_data + n * this->top_dim_);
करने के लिए:: तो मैं से लाइन 32 बदल
this->forward_cpu_gemm(
bottom_data + n * bottom[1]->count(1),
bottom[0]->cpu_data() + n * bottom[0]->count(1),
top_data + n * this->top_dim_);
चीजों को आसान बनाने के लिए, मैं मान लिया कोई पूर्वाग्रह शामिल अवधि है कि वहाँ, कदम हमेशा होता है 1, गद्दी हमेशा 0 हो सकता है , समूह हमेशा 1 होगा। हालांकि, जब मैंने आगे के पास का परीक्षण किया, तो उसने मुझे कुछ अजीब जवाब दिया (एक सरल संकल्प कर्नेल = np.ones((1,1,3,3))
के साथ। इस कर्नेल के लिए सीखने की दर शून्य पर सेट की गई ताकि यह बदले न जाए। हालांकि, मुझे सही उत्तर नहीं मिल रहा है। किसी भी सुझाव की सराहना की जाएगी।
कृपया मौजूदा परतों जैसे Slice, Eltwise, Crop
का उपयोग करके समाधान का प्रस्ताव न दें। मैंने पहले से ही कार्यान्वित किया है - यह काम करता है - लेकिन यह अविश्वसनीय जटिल और स्मृति अक्षम है।
मैंने इसे पढ़ा "कैफी में दो ब्लोंड को कैसे मनाने के लिए": \ – Elazar
@Elazar तो यही कारण है कि आप नीचे मतदान करते हैं? (बस मजाक कर रहे हैं): पी –