2017-06-27 10 views
6

अधिकांश tensorflow ट्यूटोरियल लेखकों में चैनल-अंतिम आयाम क्रम का उपयोग करते हैं, उदा।क्यों tensorflow पंक्ति-प्रमुख की बजाय चैनल-अंतिम क्रम का उपयोग करता है?

input_layer = tf.reshape(features, [-1, 28, 28, 1]) 

जहां अंतिम अंक चैनलों की संख्या (https://www.tensorflow.org/tutorials/layers) का प्रतिनिधित्व करता है। थेनो और नम्पी (दोनों सी-ऑर्डरिंग, यानी पंक्ति-प्रमुख) का उपयोग करने के लिए, मुझे यह अजीब लगता है। इसके अलावा, documentation को टेन्सफोर्लो में इन-मेमोरी लेआउट स्कीमों पर पढ़ने के बाद, मुझे लगता है कि चैनल-अंतिम लेआउट अधिक कैश-मिस का कारण बनता है, क्योंकि अलग-अलग चैनलों पर संकल्प किए जाते हैं, जबकि चैनल-आखिरी क्रम में इन चैनलों को रैखिक स्मृति में इंटरमीक्स किया जाता है , प्रभावी रूप से एन द्वारा कैश को कम करना (जहां एन चैनलों की संख्या है), जो विशेष रूप से 3 डी और 4 डी संकल्पों में अक्षम है। क्या मुझे कुछ गलत हो रहा है?

पीएस

मुझे एक करीबी से संबंधित धागा मिला है (Tensorflow 3 channel order of color inputs)। स्वीकार्य उत्तर के लेखक ने कहा है कि टीएफ डिफ़ॉल्ट रूप से पंक्ति-प्रमुख का उपयोग करता है, लेकिन यह देखते हुए कि अब तक मिले सभी ट्यूटोरियल चैनल-आखिरी ऑर्डरिंग दिखाते हैं, मुझे लगता है कि दावा भ्रामक है।

उत्तर

9

यहाँ व्याख्या दी गई है:

https://www.tensorflow.org/performance/performance_guide#use_nchw_image_data_format

छवि डेटा प्रारूप छवियों के बैच के प्रतिनिधित्व को दर्शाता है। टेंसरफ्लो एनएचडब्ल्यूसी (टेंसरफ्लो डिफ़ॉल्ट) और एनसीएचडब्ल्यू (सीयूडीएनएन डिफ़ॉल्ट) का समर्थन करता है। एन बैच में छवियों की संख्या को संदर्भित करता है, एच लंबवत आयाम में पिक्सेल की संख्या को संदर्भित करता है, डब्ल्यू क्षैतिज आयाम में पिक्सेल की संख्या को संदर्भित करता है, और सी चैनलों को संदर्भित करता है (उदाहरण के लिए काले और सफेद, 1 आरजीबी के लिए, आदि) हालांकि सीयूडीएनएन दोनों प्रारूपों पर काम कर सकता है, लेकिन इसके डिफ़ॉल्ट प्रारूप में काम करना तेज़ है।

सबसे अच्छा अभ्यास उन मॉडलों का निर्माण करना है जो एनसीएचडब्लू और एनएचडब्ल्यूसी दोनों के साथ काम करते हैं क्योंकि जीपीयू पर एनसीएचडब्ल्यू का उपयोग करना ट्रेन करना आम है, और फिर सीपीयू पर एनएचडब्ल्यूसी के साथ अनुमान लगाते हैं।

इन दो प्रारूपों का संक्षिप्त इतिहास यह है कि एनएनडब्ल्यूसी का उपयोग करके टेंसरफ्लो शुरू हुआ क्योंकि यह CPUs पर थोड़ा तेज था। फिर टेंसरफ्लो टीम ने पाया कि NVIDIA cuDNN लाइब्रेरी का उपयोग करते समय एनसीएचडब्ल्यू बेहतर प्रदर्शन करता है। वर्तमान अनुशंसा यह है कि उपयोगकर्ता अपने मॉडल में दोनों प्रारूपों का समर्थन करते हैं। लंबी अवधि में, हम प्रारूपों के बीच स्विचिंग को पारदर्शी बनाने के लिए ग्राफ को फिर से लिखने की योजना बना रहे हैं।

इसके अलावा, कोड की खुदाई हम here देख सकते हैं कि जब इनपुट प्रारूप NHWC में है, tensorflow यह आप के लिए NCHW में धर्मान्तरित।

if (data_format == FORMAT_NHWC) { 
    // Convert the input tensor from NHWC to NCHW. 
    TensorShape nchw_shape = 
     ShapeFromFormat(FORMAT_NCHW, in_batch, in_rows, in_cols, in_depths); 
    if (in_depths > 1) { 
     Tensor transformed_input; 
     OP_REQUIRES_OK(ctx, ctx->allocate_temp(DataTypeToEnum<T>::value, 
              nchw_shape, &transformed_input)); 
     functor::NHWCToNCHW<GPUDevice, T, 4>()(
      ctx->eigen_device<GPUDevice>(), 
      const_cast<const Tensor&>(input).tensor<T, 4>(), 
      transformed_input.tensor<T, 4>()); 
     input = transformed_input; 
    } else { 
     // If depth <= 1, then just reshape. 
     CHECK(input.CopyFrom(input, nchw_shape)); 
    } 
    } 

आप डेटा स्वरूप आप डिफ़ॉल्ट से कम हर आपरेशन लेकिन tensorflow NCHW लेकिन NHWC उपयोग नहीं करता है के लिए उपयोग करना चाहते हैं निर्दिष्ट कर सकते हैं, यही कारण है कि यहां तक ​​कि TF defelopers अभी भी NHWC का उपयोग हर आपरेशन प्रारूप में निर्दिष्ट करने के लिए से बचने के लिए है

+0

क्या इसका मतलब यह है कि टीएफ एक जीपीयू को डेटा भेजते समय प्रतिनिधित्व को पंक्ति-प्रमुख में परिवर्तित करता है? अनुलेख मैं नीचे मतदाता नहीं हूँ। –

+0

यह दस्तावेज मुझे भ्रमित करता है, क्योंकि "सर्वोत्तम प्रथाओं" में यह "एनसीएचडब्लू छवि डेटा प्रारूप का उपयोग करने" की सिफारिश करता है, फिर भी टीएफ डेवलपर्स अपने स्वयं के ट्यूटोरियल में इस अनुशंसा का पालन नहीं करते हैं। –

+0

डाउनवोट के लिए चिंता न करें, ऐसा होता है। हालांकि [यहां] देखें (https://github.com/tensorflow/tensorflow/blob/0be81439c91e297b078152dd0c266471b24bde7f/tensorflow/core/kernels/conv_ops.cc#L558-L575): यदि प्रारूप एनएचडब्ल्यूसी है तो tensorflow इसे आपके लिए एनसीएचडब्लू में परिवर्तित कर देता है । आप डिफ़ॉल्ट रूप से प्रत्येक ऑपरेशन और टेंसफोर्लो के लिए उपयोग किए जाने वाले डेटा प्रारूप को निर्दिष्ट कर सकते हैं, एनसीएचडब्लू लेकिन एनएचडब्लूसी का उपयोग नहीं करता है, यही कारण है कि टीएफ डिफेलोपर्स अभी भी एनएचडब्ल्यूसी का उपयोग करते हैं ताकि प्रत्येक ऑपरेशन में – nessuno

2

आपका प्रश्न गलतफहमी पर आधारित है।

पंक्ति-प्रमुख और एनएचडब्ल्यूसी के बीच कोई विरोधाभास नहीं है। पंक्ति-प्रमुख का मतलब है कि सही सूचकांक वह होता है जो स्मृति में सबसे छोटे कूद को बदलता है, और बाएं सूचकांक में परिवर्तन सबसे बड़ा कूदता है। पंक्ति-प्रमुख में, अंतिम आयाम संगत है, स्तंभ-प्रमुख में, पहला वाला है। मनमानी संख्याओं के लिए स्मृति ऑफसेट की गणना करने के लिए https://en.wikipedia.org/wiki/Row-_and_column-major_order#Address_calculation_in_general देखें।

तो, टीएफ की स्मृति पंक्ति-प्रमुख में रखी गई है।इंडेक्स के ऑर्डर में अंतर सूक्ष्म हैं (कुछ लोग CHWN भी पसंद करते हैं - https://github.com/soumith/convnet-benchmarks/issues/66#issuecomment-155944875 देखें)। एनसीएचडब्ल्यू लोकप्रिय है क्योंकि यह कुडन सबसे अच्छा करता है। लेकिन मूल रूप से डीएल में हर सामान्य मेमोरी लेआउट पंक्ति-प्रमुख है।

+0

जाने का यह तरीका कम या कम है मेरा भ्रम इस तथ्य से आता है कि चैनल-आखिरी प्रस्तुतियों में आपको मूल रूप से सीएच एक्स डब्ल्यू ग्रिड की बजाय सी-आयामी वैक्टरों का एच एक्स डब्ल्यू ग्रिड मिलता है, जो पंक्ति-प्रमुख के लिए अधिक प्राकृतिक दिखता है मुझे लेआउट वैसे भी, मुझे सही करने के लिए धन्यवाद। –

संबंधित मुद्दे

 संबंधित मुद्दे