मैं अजगर और तंत्रिका नेटवर्क दोनों के लिए नया हूं। मैं वीडियो में जेस्चर वर्गीकरण के लिए सीएनएन + आरएनएन के साथ एक मॉडल बनाने की कोशिश कर रहा हूं। प्रत्येक वीडियो में 30 फ्रेम (30 छवियों का बैच) होता है। CNN परत के लिए, मैं CNN परत में Conv2D परत और RNN परत में GRU का उपयोग कर रहा हूँ। छवियां 84*84 आकार की हैं और आरजीबी छवियां हैं (चैनल = 3)। जब मैं GRU परत जोड़ने का प्रयास कर रहा हूं तो मुझे "ValueError: इनपुट 0 परत gru1 के साथ असंगत है: अपेक्षित ndim = 3, ndim = 4" त्रुटि मिली है। नीचे मेरा कोड है:

    model1 = Sequential()
    model1.add(Conv2D(64, (3,3), strides=(1,1), padding='same', input_shape=(84,84,3),name='c2D1'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,1), strides=(2,1)))

    model1.add(Conv2D(128, (3,3), strides=(1,1), padding='same',name='c2D2'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))



    model1.add(Conv2D(256, (3,3), strides=(1,1), padding='same',name='c2D3'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))


    model1.add(Conv2D(256, (3,3), strides=(1,1), padding='same',name='c2D4'))
    model1.add(BatchNormalization())
    model1.add(Activation('elu'))
    model1.add(MaxPooling2D(pool_size=(2,2), strides=(2,2)))


    model1.add(GRU(units=50,input_shape=(256,84,84),return_sequences=True,name='gru1'))
    model1.add(layers.Dense(nb_labels))


    model1.add(Flatten())
    model1.add(Dropout(0.5))
    model1.add(Dense(512, activation='elu'))
    model1.add(Dropout(0.5))
    model1.add(Dense(5, activation='softmax'))

कृपया मुझे बताएं कि GRU परत के लिए input_shape के लिए सही मान क्या होना चाहिए।

0
ashutosh 26 मार्च 2020, 00:34
 – 
Thomas Weller
26 मार्च 2020, 00:44
क्या इससे आपके सवाल का जवाब मिलता है? stackoverflow.com/questions/44583254/…
 – 
Thomas Weller
26 मार्च 2020, 00:44
क्या यह आपके प्रश्न का उत्तर देता है? stackoverflow.com/questions/54877516/…
 – 
Thomas Weller
26 मार्च 2020, 00:44
क्या इससे आपके सवाल का जवाब मिलता है? stackoverflow.com/questions/54118069/…
 – 
Thomas Weller
26 मार्च 2020, 00:45
क्या इससे आपके सवाल का जवाब मिलता है? के साथ असंगत है stackoverflow.com/questions/56859738/…
 – 
Thomas Weller
26 मार्च 2020, 00:45

2 जवाब

Conv2D इनपुट में 3 डिम इमेज लेता है (चौड़ाई x ऊंचाई x चैनल)। यदि आप रंगीन वीडियो को संसाधित करने के लिए केरस को चकमा देना चाहते हैं तो आपको Conv3D (कम से कम पहली/पहली दो परतों में) का उपयोग करना चाहिए। Conv3D इनपुट चौड़ाई x ऊंचाई x गहराई x चैनल के रूप में स्वीकार करता है। आप अपने रंग चैनलों को "चैनल" के रूप में रख सकते हैं और गहराई आयाम का उपयोग समय के रूप में कर सकते हैं।

0
user26067 26 मार्च 2020, 01:08

आपका कोड किसी भी तरह से वह नहीं करता जो आप कहते हैं कि आप उसे करना चाहते हैं। वे दृढ़ परतें छवियों के एक बैच की अपेक्षा करती हैं लेकिन आप जो वर्णन करते हैं वह छवियों के अनुक्रमों का एक बैच है। उस जीआरयू परत को (इसके काम करने के लिए) आकार का एक टेंसर दिया जाना चाहिए (बैच_साइज, सीक्वेंस_लेंथ, फीचर्स) लेकिन इसके बजाय इसे एक (बैच_साइज, 5, 10, 256) मिल रहा है, इसके इनपुट_शैप पैरामीटर को व्यर्थ में सेट किया गया है (256,84,84) )

आप जो चाहते हैं उसे प्राप्त करने के लिए, कनवल्शनल पार्ट टाइम-डिस्ट्रिब्यूटेड बनाएं (https: //www.tensorflow.org/api_docs/python/tf/keras/layers/TimeDistributed), फिर दूसरे आयाम के बाद सब कुछ समतल करें (https://www.tensorflow.org/api_docs/python/tf/keras/layers/Reshape), और उसके बाद ही लागू करें जीआरयू। आपको GRU परत को सही इनपुट आकार बताने की आवश्यकता नहीं है क्योंकि यह स्वतः ही अनुमान लगा लेगा।

0
simon 26 मार्च 2020, 01:12