मेरे GPU पर प्रशिक्षण इतना लंबा क्यों है?


10

विवरण:

GPU : GTX 1080

प्रशिक्षण : ~ १० वर्गों से संबंधित १.१ मिलियन छवियां

मान्यता : ~ 150 हजार चित्र 10 वर्गों से संबंधित हैं

समय प्रति युग : ~ 10 घंटे

मैंने CUDA, cuDNN और Tensorflow (Tensorflow GPU साथ ही) सेटअप किया है।

मुझे नहीं लगता कि मेरा मॉडल वह जटिल है जो प्रति घंटे 10 घंटे लेता है। मैंने यह भी जाँच की कि क्या मेरी GPU समस्या थी, लेकिन यह नहीं था।

क्या प्रशिक्षण का समय पूरी तरह से जुड़ी परतों के कारण है?

मेरा मॉडल:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

क्योंकि वहाँ बहुत सारे डेटा मैं ImageDataGenerator का उपयोग किया है।

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

2
मैंने इसे ओवरफ्लो करने के लिए स्थानांतरित करने के लिए मतदान किया, लेकिन वास्तव में यह डेटा साइंस स्टैक एक्सचेंज, आईएमओ
जेनेरिक_युसर

generic_user: "डेटा साइंस" "मशीन लर्निंग" का उपयोग कर सकता है, लेकिन सभी "मशीन लर्निंग" "डेटा साइंस" के लिए नहीं है। (एमएल सिर्फ एक और उपकरण है, टेंसरफ़्लो सिर्फ एक और पुस्तकालय; एमएल जल्द ही (यदि पहले से ही नहीं है) का उपयोग उपयोगकर्ता वरीयता संपत्ति फ़ाइलों के प्रबंधन जैसे सांसारिक कार्यों के लिए भी किया जा सकता है।)
माइकल

भी संबंधित (tl; डॉ: GPU पर चल रहा है वास्तव में सत्यापित करें, GPU आंकड़े देखते कि tf प्रदान कर सकते हैं) को देखने के stackoverflow.com/questions/42527492/... stackoverflow.com/questions/38559755/...
माइकल

मैंने उस दृष्टिकोण की कोशिश की है और यह बताता है कि मेरे वर्तमान जीपीयू का उपयोग किया जा रहा है। पुष्टि करने के लिए मैंने GPU उपयोग की जांच करने के लिए nvidia-smi का भी उपयोग किया और यह 85% -99% के बीच उतार-चढ़ाव करता है।
प्रद्युम्न राहुल

जवाबों:


7

यह उम्मीद के बारे में है। यदि आप अपने द्वारा संसाधित की गई छवियों की संख्या से सेकंड की संख्या को विभाजित करते हैं, तो आपको प्रति चित्र 33 मिलीसेकंड मिलता है, जो इस तरह के एक छोटे नेटवर्क के लिए सही लगता है। बड़े नेटवर्क आमतौर पर प्रति चित्र 50 से 200 मिलीसेकंड के बॉलपार्क में लगते हैं।

हां, एक बड़ी घनी परत आपके प्रदर्शन को नुकसान पहुंचा सकती है, क्योंकि यह एक विशाल मैट्रिक्स (4096 तक 256) और एक बड़ी मैट्रिक्स गुणा है जब भी आप नेटवर्क चलाते हैं।


प्रदर्शन को बेहतर बनाने के लिए आप क्या सुझाव देंगे?

4
1: बैच का आकार 32 या 64 तक बढ़ाएं। 2: एफसी परत के आकार को 1024 या 2048 इकाइयों तक सिकोड़ें और देखें कि क्या यह मदद करता है। 3: प्रारंभिक रोक। यह संभव है कि आपके पहले युग को समाप्त करने से पहले आपका नेटवर्क अभिसरण या ओवरफिट करना शुरू कर दे, जिस स्थिति में आपको कम प्रशिक्षण देना चाहिए।

क्या मुझे प्रति युग के चरणों को कम करना चाहिए?
प्रद्युम्न राहुल

@ श्यामाओ आपको "ट्रेन कम" से क्या मतलब था? क्या आपका मतलब कम डेटा का उपयोग करना है?
स्टैटसॉरसिएस

3

जैसा कि शिमाओ ने कहा है, कि आप क्या उम्मीद करेंगे। कई परतें नहीं होने के बावजूद, 512x512 के इनपुट आकार को खत्म करने के लिए एक बड़ी छवि है। पूरी तरह से जुड़े परतों के बजाय, बड़ी छवि पर 64 फ़िल्टर को मनाने के कारण बड़े गणना समय की संभावना अधिक है।

यद्यपि आपने जिस नेटवर्क को एक साथ रखा है, उसमें एक अजीब सूचना अड़चन है। आप मूल आकार की छवि पर 64 फ़िल्टर्स के साथ शुरू करते हैं, केवल आपकी छवि का आकार कम होने से घटता है। जैसे ही छवि आपके नेटवर्क से गुज़रती है, आपके द्वारा सीखी जा रही सुविधाएँ अधिक से अधिक अमूर्त और जटिल हो जाती हैं। आपका Conv2D (32, (3, 3)) परत अनिवार्य रूप से 32 सुविधाओं के 128x128 मानचित्र को सीखने के लिए नेटवर्क को सीमित करता है।

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

कम फिल्टर के साथ शुरू करने की कोशिश करें, अपनी पहली कनवल्शन लेयर में 16 कहें, हर बार जब आप स्ट्राइड या पूल को दोहरा रहे हैं। ग्रहणशील क्षेत्र को बढ़ाने और फ़ीचर मैप के आकार को कम करने के लिए, इससे कुछ अधिक बार करें। इसे नीचे 64x64 या 32x32 पर करें, जो 128 या 256 फ़िल्टर होगा। आप पूरी तरह से कनेक्टेड लेयर्स को खत्म करने के लिए केरस ग्लोबल एक्सप्रेस या मैक्स पूलिंग का उपयोग कर सकते हैं। नेटवर्क की गति दोगुनी होनी चाहिए, और मैं एक ही समय में सटीकता में वृद्धि की उम्मीद करूंगा।


खैर, नेटवर्क वास्तुकला एक शोध पत्र पर आधारित है जिसे मैं पुन: पेश करने की कोशिश कर रहा था। lirmm.fr/%7Echaumont/publications/…
प्रद्युम्न राहुल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.