georgeklo Δημοσ. 27 Ιουνίου 2020 Δημοσ. 27 Ιουνίου 2020 Καλημέρα, 'Ηθελα να ρωτήσω εαν κάποιος μπορέι να με βοηθήσει στο συγκεκριμένο πρόβλημα που αντιμετωπίζω, προσπαθώ να ενοιποιήσω δύο νευρωνικά δίκτυα, ένα customized U net network και ένα pretrained VGG 16 ώστε να δημιουργήσω ένα pipeline. Ο λόγος που χρησιμοποίω το δεύτερο δίκτυο είναι για να δοκιμάσω τον όρο percetual loss, ουσιαστικά αντι να μετράω ακριβώς το output του 1ου δικτύου να χρησιμοποίσω ενα πιο ιδανικό δίκτυο για την μέτρηση της ποίοτητας του αποτελέσματός. Ο ρόλος που ζητάω βοήθεια εδώ είναι γιατί έχω ψάξει αρκετά στο ιντερνετ αλλά δεν μπορώ να καταλάβω ποίο ειναι το πρόβλημα καθως το output της tensorflow και πιο συγκεκριμένα του keras δεν είναι ιδιαίτερα βοηθητικό, AttributeError: 'NoneType' object has no attribute '_inbound_nodes' . Το πιο κοντινό που βρήκα σε λύση είναι ,https://github.com/keras-team/keras/issues/11811". Γνωρίζω οτι για να με βοηθήσετε στο θέμα που πρέπει να παρεθέσω τον κώδικα, αλλά λόγω μεγέθους θα σας παραθέσω τι θέλω να κάνω και που κολλάω, Αρχικά προσπαθω να κάνω ασπρομαυρες φωτογραφίες σε εγχρωμες . ο χώρος που δουλεύω δεν ειναι ο rgb, αλλά το Lab, Το πρώτο δίκτυο παρνει σας input το achromatic luminance της εικόνας με διαστάσεις (256,256,1)και κάνει predict το a,b channels δλδ ένα output της μορφής (256,256,2). Τέλος εφαρμόζοντας τα a,b channels πάνω στο luminance παράραγω μια εγχρωμη είκονα. Αντι να μετράω το αποτέλεσμα αυτής, θα ήθελα να φτίαξω ενα ενοποιήμενο δικτυο που αποτέλείτε απο δύο δίκτυα. Το πρώτο δικτυο λειτουργεί μια χαρά , αλλά όταν πάω να δημιουργήσω το "ενοποιήμενο'' δίκτυο το χάνω. vgg_inp=Input(shape=(256, 256, 3)) lossModel = VGG16(include_top=False, weights='imagenet',input_tensor=vgg_inp) #Declare the model not to get its weights updated lossModel.trainable=False for layer in lossModel.layers: layer.trainable=False selectedLayers = [1,2,9,10,17,18] selectedOutputs = [lossModel.layers[i].output for i in selectedLayers] #a new model that has multiple outputs: lossModel = Model(lossModel.inputs,selectedOutputs) Έτσι ορίζω το pretrained VGG δίτκυο. Αλλάζω το input size του VGG απο 224x224x3 σε 256x256x3 ώστε να ταιριάζει στα δικά μου δεδομένα. Οπότε αυτό που θέλω να κάνω στην συνεχεια ειναι να φτιάξω το input shape. Όπως ανέφερα πιο πριν το πρώτο δίκτυο παράγει ένα output της μορης 256x256x2 οπότε βάζω το και το input του προηγούμενου δικτύου που ειναι το luminance για να φτιάξω το input shape που θέλω. Ο λόγος που πολλαπλασιάζω με 128 ειναι για να κάνω unnormalized. tripleOut =concatenate([model.input,model.output*128],axis=-1) Αύτό θα έχει σαν αποτέλεσμα το ζητούμενο output , <tf.Tensor 'concatenate_10/concat:0' shape=(?, 256, 256, 3) dtype=float32> Στην συνέχεια παίρνω το φτιαγμένο output και το περνάω μέσα απο το pretrained VGG ώστε να πάρω το output συγκεκριμένων layers lossModelOutputs = lossModel(tripleOut) όπου αυτό μου γυρίζει μια λσιτα απο tensors απο τα output του selected layers που ζήτησα πριν, [<tf.Tensor 'model_3_1/block1_conv1/Relu:0' shape=(?, 256, 256, 64) dtype=float32>, <tf.Tensor 'model_3_1/block1_conv2/Relu:0' shape=(?, 256, 256, 64) dtype=float32>, <tf.Tensor 'model_3_1/block3_conv3/Relu:0' shape=(?, 64, 64, 256) dtype=float32>, <tf.Tensor 'model_3_1/block3_pool/MaxPool:0' shape=(?, 32, 32, 256) dtype=float32>, <tf.Tensor 'model_3_1/block5_conv3/Relu:0' shape=(?, 16, 16, 512) dtype=float32>, <tf.Tensor 'model_3_1/block5_pool/MaxPool:0' shape=(?, 8, 8, 512) dtype=float32>] Οπότε ήρθε η ώρα να δημιουργήσω ένα ενοποιήμενο δίκτυο που να δέχεται σαν input το luminance και αντι να παράγει το output και να σταματάει να προωθεί το output του πρώτου στο δεύτερο δίκτυο και να έχω σαν output αυτό. fullModel = Model(model.input, lossModelOutputs) Αλλά σε αυτό το σημείο μου έρχεται το μη διευκρινηστικό error message. AttributeError Traceback (most recent call last) <ipython-input-33-0649fb6f52e9> in <module> ----> 1 fullModel = Model(model.input, lossModelOutputs) ~/env/lib/python3.6/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs) 89 warnings.warn('Update your `' + object_name + '` call to the ' + 90 'Keras 2 API: ' + signature, stacklevel=2) ---> 91 return func(*args, **kwargs) 92 wrapper._original_function = func 93 return wrapper ~/env/lib/python3.6/site-packages/keras/engine/network.py in __init__(self, *args, **kwargs) 92 'inputs' in kwargs and 'outputs' in kwargs): 93 # Graph network ---> 94 self._init_graph_network(*args, **kwargs) 95 else: 96 # Subclassed network ~/env/lib/python3.6/site-packages/keras/engine/network.py in _init_graph_network(self, inputs, outputs, name, **kwargs) 239 # Keep track of the network's nodes and layers. 240 nodes, nodes_by_depth, layers, layers_by_depth = _map_graph_network( --> 241 self.inputs, self.outputs) 242 self._network_nodes = nodes 243 self._nodes_by_depth = nodes_by_depth ~/env/lib/python3.6/site-packages/keras/engine/network.py in _map_graph_network(inputs, outputs) 1432 layer=layer, 1433 node_index=node_index, -> 1434 tensor_index=tensor_index) 1435 1436 for node in reversed(nodes_in_decreasing_depth): ~/env/lib/python3.6/site-packages/keras/engine/network.py in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index) 1419 tensor_index = node.tensor_indices[i] 1420 build_map(x, finished_nodes, nodes_in_progress, layer, -> 1421 node_index, tensor_index) 1422 1423 finished_nodes.add(node) ~/env/lib/python3.6/site-packages/keras/engine/network.py in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index) 1419 tensor_index = node.tensor_indices[i] 1420 build_map(x, finished_nodes, nodes_in_progress, layer, -> 1421 node_index, tensor_index) 1422 1423 finished_nodes.add(node) ~/env/lib/python3.6/site-packages/keras/engine/network.py in build_map(tensor, finished_nodes, nodes_in_progress, layer, node_index, tensor_index) 1391 ValueError: if a cycle is detected. 1392 """ -> 1393 node = layer._inbound_nodes[node_index] 1394 1395 # Prevent cycles. AttributeError: 'NoneType' object has no attribute '_inbound_nodes' Έχω δοκιμάσει διάφορα, όπως να χρησιμοποίησω lambda functions για να κάνω την ενοποίηση αλλά δεν έβγαλα κάποια άκρη. Αν τυχόν κανένας έχει αντιμετωπίσει κάποιο αντίστοιχο πρόβλημα ή εχει καμια άλλη ιδέα θα το εκτιμούσα ιδιαίτερα. Ευχαριστώ για το χρόνο σας και συγνώμη για το μεγάλο κείμενο.
Sacadmerde Δημοσ. 27 Ιουνίου 2020 Δημοσ. 27 Ιουνίου 2020 Παράτησα το Keras κατά το 2017 (σου συνηστώ να το παρατήσεις και εσύ, έχουμε 2020, ένα debug θα έπρεπε να μπορείς να το κάνεις στον κώδικα). Από τα λίγα που θυμάμαι, το inbound_nodes είναι ένα list που κρατάει τις εισόδους που θα πάρει ένας layer, ένα node δηλαδή μπορεί να έχει πολλά inbound nodes (αντιστοίχως και το outbound_nodes). Αυτό που βλέπω είναι ότι έχεις δύο models. Από τα λίγα που θυμάμαι, χρησιμοποιώντας το functional API του keras, δεν έπρεπε να υπάρχει πρόβλημα. Εκεί που εντοπίζω το πρόβλημα, είναι στο indexing που κάνεις στον ορισμό του multiple output του VGG. Εικάζω ότι παίρνεις κάποιον node που είτε είναι normalisation, είτε pooling, είτε average/sum/concatenate και δεν μπορεί να χρησιμοποιηθεί. Βάλε ένα debug point στην γραμμή 16 λεπτά πριν, georgeklo είπε lossModel = Model(lossModel.inputs,selectedOutputs) και δες τι layers είναι το `selectedOutputs`. Αυτό που μπορείς να κάνεις επίσης, είναι να βάλεις ένα breakpoint στην γραμμή που πετάγεται το error και να δεις ποιος layer το προκαλεί. Δηλαδή, σε ποιον layer είναι το προβληματικό inbound_nodes list. 1
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 (επεξεργασμένο) 18 minutes ago, Sacadmerde said: Παράτησα το Keras κατά το 2017 (σου συνηστώ να το παρατήσεις και εσύ, έχουμε 2020, ένα debug θα έπρεπε να μπορείς να το κάνεις στον κώδικα). Από τα λίγα που θυμάμαι, το inbound_nodes είναι ένα list που κρατάει τις εισόδους που θα πάρει ένας layer, ένα node δηλαδή μπορεί να έχει πολλά inbound nodes (αντιστοίχως και το outbound_nodes). Αυτό που βλέπω είναι ότι έχεις δύο models. Από τα λίγα που θυμάμαι, χρησιμοποιώντας το functional API του keras, δεν έπρεπε να υπάρχει πρόβλημα. Εκεί που εντοπίζω το πρόβλημα, είναι στο indexing που κάνεις στον ορισμό του multiple output του VGG. Εικάζω ότι παίρνεις κάποιον node που είτε είναι normalisation, είτε pooling, είτε average/sum/concatenate και δεν μπορεί να χρησιμοποιηθεί. Βάλε ένα debug point στην γραμμή και δες τι layers είναι το `selectedOutputs`. Αυτό που μπορείς να κάνεις επίσης, είναι να βάλεις ένα breakpoint στην γραμμή που πετάγεται το error και να δεις ποιος layer το προκαλεί. Δηλαδή, σε ποιον layer είναι το προβληματικό inbound_nodes list. Ευχαριστώ για την απάντηση, παραθέτω το selected output. Ναι κάποιο ειναι maxpooling αλλά δεν είναι αυτό το προβλημα διότι το αφαίρεσα και πάλι έχω το ιδιο θέμα. Tα layers τα έβαλα δοκιαμστικά για δω οτι λειτουργει. Τι θα πρότεινες να παω σε καθαρη tensorflow ; [<tf.Tensor 'block1_conv1_9/Relu:0' shape=(?, 256, 256, 64) dtype=float32>, <tf.Tensor 'block1_conv2_9/Relu:0' shape=(?, 256, 256, 64) dtype=float32>, <tf.Tensor 'block3_conv3_9/Relu:0' shape=(?, 64, 64, 256) dtype=float32>, <tf.Tensor 'block5_conv3_9/Relu:0' shape=(?, 16, 16, 512) dtype=float32>, <tf.Tensor 'block5_pool_9/MaxPool:0' shape=(?, 8, 8, 512) dtype=float32>] Παραθέτω και το loss model Model: "model_16" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_13 (InputLayer) (None, 256, 256, 3) 0 _________________________________________________________________ block1_conv1 (Conv2D) (None, 256, 256, 64) 1792 _________________________________________________________________ block1_conv2 (Conv2D) (None, 256, 256, 64) 36928 _________________________________________________________________ block1_pool (MaxPooling2D) (None, 128, 128, 64) 0 _________________________________________________________________ block2_conv1 (Conv2D) (None, 128, 128, 128) 73856 _________________________________________________________________ block2_conv2 (Conv2D) (None, 128, 128, 128) 147584 _________________________________________________________________ block2_pool (MaxPooling2D) (None, 64, 64, 128) 0 _________________________________________________________________ block3_conv1 (Conv2D) (None, 64, 64, 256) 295168 _________________________________________________________________ block3_conv2 (Conv2D) (None, 64, 64, 256) 590080 _________________________________________________________________ block3_conv3 (Conv2D) (None, 64, 64, 256) 590080 _________________________________________________________________ block3_pool (MaxPooling2D) (None, 32, 32, 256) 0 _________________________________________________________________ block4_conv1 (Conv2D) (None, 32, 32, 512) 1180160 _________________________________________________________________ block4_conv2 (Conv2D) (None, 32, 32, 512) 2359808 _________________________________________________________________ block4_conv3 (Conv2D) (None, 32, 32, 512) 2359808 _________________________________________________________________ block4_pool (MaxPooling2D) (None, 16, 16, 512) 0 _________________________________________________________________ block5_conv1 (Conv2D) (None, 16, 16, 512) 2359808 _________________________________________________________________ block5_conv2 (Conv2D) (None, 16, 16, 512) 2359808 _________________________________________________________________ block5_conv3 (Conv2D) (None, 16, 16, 512) 2359808 _________________________________________________________________ block5_pool (MaxPooling2D) (None, 8, 8, 512) 0 ================================================================= Total params: 14,714,688 Trainable params: 0 Non-trainable params: 14,714,688 Επεξ/σία 27 Ιουνίου 2020 από georgeklo
Sacadmerde Δημοσ. 27 Ιουνίου 2020 Δημοσ. 27 Ιουνίου 2020 @georgeklo Μετά το μήνυμα: 12 λεπτά πριν, Krimson1 είπε tripleOut =concatenate([model.input,model.output*128],axis=-1) Αφου δινουν λυση και στο issue που λινκαρες... Γενικα δεν βγαινει ακρη απο τα λεγομενα σου και τα variable name σου, λες οτι θες να στακαρεις το input του προηγουμενου μοντελου με το output του επομενου αλλα εδω στακαρεις input και output του ιδιου μοντελου. Anyway πρεπει να κανεις κεφαλαιο το C, Concatenate για να ειναι keras layer. Το error αυτο ειναι της python γενικοτερα δεν αφορα μονο το keras. Καπου κληθηκε κατι που εσυ νομιζες οτι ειναι instance κλασης με attribute outbound nodes που φανταζομαι ειναι τα συνδεδεμενα στο layer nodes στο execution graph, αλλα στην πραξη ειχε γινει φαουλ πιο πριν και ηταν None object. Υποθετω λοιπον (ψιλοσιγουρος) οτι ειναι το tripleOut που θα επρεπε να ειναι Concatenate, που ειναι keras layer οποτε εχει το ζητουμενο attribute, ενω τωρα ειναι concatenate. το οποιο επιστρεφει tensor Είδα και εγώ το link, και νομίζω ότι αυτό που σου είπε ο @Krimson1 είναι σωστό. Συγκεκριμένα, στο link που έχεις, διαβάζουμε: The problem is that squeezed_cat_conv2 is not the output of a keras layer. Καταλαβαίνω πως η process `squeezed_cat_conv2` έχει χρησιμοποιηθεί σε κάποιο σου model, και εσύ παίρνεις το output από αυτή με αποτέλεσμα να υπάρχει το πρόβλημα με την καταχώρηση αυτής της λειτουργίας (`squeezed_cat_conv2`) στο inbound_nodes list (αφού δεν είναι κανονικός layer του keras). Γρήγορο fix θα ήταν να βρεις ακριβώς που είναι το πρόβλημα (με ποιον layer που χρησιμοποιείς) κάνε wrap τον tensor που βγάζει η `squeezed_cat_conv2` σε ένα keras layer. Το ίδιο fix προτάθηκε και εδώ 17 λεπτά πριν, Krimson1 είπε Υποθετω λοιπον (ψιλοσιγουρος) οτι ειναι το tripleOut που θα επρεπε να ειναι Concatenate, που ειναι keras layer οποτε εχει το ζητουμενο attribute, ενω τωρα ειναι concatenate. το οποιο επιστρεφει tensor
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 Δοκίμασα οτιδήποτε μου προτάθηκε στο λινκ που έδωσα. Δεν θα κατέληγα να ζητήσω βοήθεια εάν λειτουργούσε ένας από αυτούς τους τόπους. Ευχαριστώ πολύ, ειδικά το Concatenate σου δημιουργεί layer , που δεν μπορεί να χρησιμοποιηθεί σαν input σε μοντέλο.
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 1 hour ago, Krimson1 said: Τι σημαινει αυτο? Για δωσε ινφο. Μα το να το γυρνας σε concatenate, δηλαδη function που γυρναει tensor, δεν λυνει καποιο προβλημα, απλα το καμουφλαρει. Με ενα γρηγορο γκουγκλαρισμα αυτος ειναι ο intended τροπος στο keras, οποτε μαλλον δεν φταιει αυτο Σιγουρα σπαει το execution graph καπου προς τα κει δηλαδη αν κανεις ενα dummy_out= Dense(1, activation=None)(tripleOut) αυτο κανει compile? Ευχαριστώ για το ενδιαφέρον όλους για το ενδιαφέρον! Ναι κάνει compile κανονικά, dummy_out <tf.Tensor 'dense_1/BiasAdd:0' shape=(?, 256, 256, 1) dtype=float32>
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 3 minutes ago, Krimson1 said: Δεν ξερω, και ειναι αδυνατο να γινει και debug αυτο το πραγμα στο keras. Στο pytorch ειναι μια γραμμη εντωμεταξυ fullModel = Model(model.input, triple_out) Αυτο ειπες δουλευει σωστα κιολας, καλα καταλαβα; Ναι λειτουργει
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 14 minutes ago, Krimson1 said: για δες το εντιτ που εκανα Syntax error, δεν λειτουργει έτσι. Ευχαριστώ πάντως
Sacadmerde Δημοσ. 27 Ιουνίου 2020 Δημοσ. 27 Ιουνίου 2020 3 ώρες πριν, georgeklo είπε Δοκίμασα οτιδήποτε μου προτάθηκε στο λινκ που έδωσα. Δεν θα κατέληγα να ζητήσω βοήθεια εάν λειτουργούσε ένας από αυτούς τους τόπους. Ευχαριστώ πολύ, ειδικά το Concatenate σου δημιουργεί layer , που δεν μπορεί να χρησιμοποιηθεί σαν input σε μοντέλο. Βάλε ένα breakpoint στην γραμμή στο script σου, από εκεί που ξεκινάει το error. Ακολούθα τις εντολές και δες, όταν γίνεται το error, ποιος layer είναι αυτός στον οποίο γίνεται το populate του inbound_nodes. Έτσι, θα μπορέσεις να δεις που είναι το λάθος και θα μπορείς να βρεις πιο εύκολα βοήθεια. 1
georgeklo Δημοσ. 27 Ιουνίου 2020 Μέλος Δημοσ. 27 Ιουνίου 2020 (επεξεργασμένο) Καλή ιδέα,βέβαια το network.py σταματαει στις 1525 γραμμές. Η συγκεκριμένη γραμμή δεν υπάρχει.Από το trace εβαλα σε αυτό το σημείο, το τελευταίο που παραπονιέται To αποτέλεσμα ήταν να μου τυπώσει τα παρακάτω μέχρι να παραπονεθεί Tensor("concatenate_1/concat:0", shape=(?, 256, 256, 3), dtype=float32) Tensor("input_1:0", shape=(?, 256, 256, 1), dtype=float32) Tensor("mul:0", shape=(?, 256, 256, 2), dtype=float32) Αν είναι δυνατόν ο πολλαπλασιασμός που έκανα με * 128 για να το κάνω unnormalized δημιουργούσε κάποιο θέμα. Πραγματατικά άξιο αποριάς. Πέρασε. Για scalars πραξεις πρέπει να χρησιμοποιήσεις το Lambda layer. Ευχαριστώ πολύ παιδιά για τον χρόνο σας !!!! Επεξ/σία 27 Ιουνίου 2020 από georgeklo 1
georgeklo Δημοσ. 28 Ιουνίου 2020 Μέλος Δημοσ. 28 Ιουνίου 2020 14 hours ago, Krimson1 said: Χα επεσα μεσα στην προβληματικη γραμμη τουλαχιστον. Αν δεν κανω λαθος δεν χρειαζεται lambda layer απαραιτητα, και ενα tf.mul να κανεις θα δουλεψει? Not sure Καλημέρα, Δεν λειτουργεί με tf.mul. ο μόνος τρόπος που έκανε δουλειά,ήταν με keras lambda layer.γενικα πάντως θα πρότεινατε να μεταβώ σε άλλο framework?
Sacadmerde Δημοσ. 28 Ιουνίου 2020 Δημοσ. 28 Ιουνίου 2020 39 λεπτά πριν, georgeklo είπε γενικα πάντως θα πρότεινατε να μεταβώ σε άλλο framework? Ναι.
georgeklo Δημοσ. 28 Ιουνίου 2020 Μέλος Δημοσ. 28 Ιουνίου 2020 3 hours ago, Sacadmerde said: Ναι. Τι θα προτείνατε? pytorch?
Sacadmerde Δημοσ. 28 Ιουνίου 2020 Δημοσ. 28 Ιουνίου 2020 2 ώρες πριν, georgeklo είπε Τι θα προτείνατε? pytorch? Ναι.
georgeklo Δημοσ. 28 Ιουνίου 2020 Μέλος Δημοσ. 28 Ιουνίου 2020 (επεξεργασμένο) 12 minutes ago, Krimson1 said: τοσο χαζο. Το keras ειναι API, το αναλογο του δεν ειναι το pytorch για να ειμαι ειλικρινης αν θες κατι τοσο υψηλου επιπεδου. Η αντιστοιχια ειναι με ignite/lightning η fastai. Το να αλλαξεις framework απο tensorflow σε pytorch ειναι περισσοτερο προσωπικη προτιμηση τωρα πια που το tensorflow ειναι eagerly executed. Αλλα εχε υπ οψιν οτι ειναι πολυ ευκολοτερο να βρεις απαντηση για τα προβληματα σου σε pytorch Τι θα πρότεινες δλδ ; Επεξ/σία 28 Ιουνίου 2020 από georgeklo
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα