Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα,

'Ηθελα να ρωτήσω εαν κάποιος μπορέι να με βοηθήσει στο συγκεκριμένο πρόβλημα που αντιμετωπίζω, προσπαθώ να ενοιποιήσω δύο νευρωνικά δίκτυα, ένα 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 για να κάνω την ενοποίηση αλλά δεν έβγαλα κάποια άκρη. Αν τυχόν κανένας έχει αντιμετωπίσει κάποιο αντίστοιχο πρόβλημα ή εχει καμια άλλη ιδέα θα το εκτιμούσα ιδιαίτερα. Ευχαριστώ για το χρόνο σας και συγνώμη για το μεγάλο κείμενο.

Δημοσ.

Παράτησα το 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. 

  • Like 1
Δημοσ. (επεξεργασμένο)
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

 

Επεξ/σία από georgeklo
Δημοσ.

@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

 

Δημοσ.

Δοκίμασα οτιδήποτε μου προτάθηκε στο λινκ που έδωσα. Δεν θα κατέληγα να ζητήσω βοήθεια εάν λειτουργούσε ένας από αυτούς τους τόπους. Ευχαριστώ πολύ, ειδικά το Concatenate σου δημιουργεί layer , που δεν μπορεί να χρησιμοποιηθεί σαν input σε μοντέλο.

 

Δημοσ.
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>

 

Δημοσ.
3 minutes ago, Krimson1 said:

Δεν ξερω, και ειναι αδυνατο να γινει και debug αυτο το πραγμα στο keras. Στο pytorch ειναι μια γραμμη εντωμεταξυ :P


fullModel = Model(model.input, triple_out)

Αυτο ειπες δουλευει σωστα κιολας, καλα καταλαβα;

Ναι λειτουργει

Δημοσ.
3 ώρες πριν, georgeklo είπε

Δοκίμασα οτιδήποτε μου προτάθηκε στο λινκ που έδωσα. Δεν θα κατέληγα να ζητήσω βοήθεια εάν λειτουργούσε ένας από αυτούς τους τόπους. Ευχαριστώ πολύ, ειδικά το Concatenate σου δημιουργεί layer , που δεν μπορεί να χρησιμοποιηθεί σαν input σε μοντέλο.

Βάλε ένα breakpoint στην γραμμή στο script σου, από εκεί που ξεκινάει το error. 
 

Ακολούθα τις εντολές και δες, όταν γίνεται το error, ποιος layer είναι αυτός στον οποίο γίνεται το populate του inbound_nodes. Έτσι, θα μπορέσεις να δεις που είναι το λάθος και θα μπορείς να βρεις πιο εύκολα βοήθεια. 

  • Like 1
Δημοσ. (επεξεργασμένο)

Καλή ιδέα,βέβαια το network.py σταματαει στις 1525 γραμμές. Η συγκεκριμένη γραμμή δεν υπάρχει.Από το trace εβαλα σε αυτό το σημείο, το τελευταίο που παραπονιέται

 

Screenshot from 2020-06-27 17-32-30.png

 

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 Ευχαριστώ πολύ παιδιά για τον χρόνο σας !!!!

Επεξ/σία από georgeklo
  • Like 1
Δημοσ.
14 hours ago, Krimson1 said:

Χα επεσα μεσα στην προβληματικη γραμμη τουλαχιστον. Αν δεν κανω λαθος δεν χρειαζεται lambda layer απαραιτητα, και ενα tf.mul να κανεις θα δουλεψει? Not sure

Καλημέρα, Δεν λειτουργεί με tf.mul. ο μόνος τρόπος που έκανε δουλειά,ήταν με keras lambda layer.γενικα πάντως θα πρότεινατε να μεταβώ σε άλλο framework?

Δημοσ. (επεξεργασμένο)
12 minutes ago, Krimson1 said:

τοσο χαζο. Το keras ειναι API, το αναλογο του δεν ειναι το pytorch για να ειμαι ειλικρινης αν θες κατι τοσο υψηλου επιπεδου. Η αντιστοιχια ειναι με ignite/lightning η fastai. Το να αλλαξεις framework απο tensorflow σε pytorch ειναι περισσοτερο προσωπικη προτιμηση τωρα πια που το tensorflow ειναι eagerly executed. Αλλα εχε υπ οψιν οτι ειναι πολυ ευκολοτερο να βρεις απαντηση για τα προβληματα σου σε pytorch

Τι θα πρότεινες δλδ ;

Επεξ/σία από georgeklo

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...