tensorflow / tensorflow/probability

AttributeError: 'tuple' object has no attribute 'layer' when using ActivationsVisualizationCallback

Open
#643 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug layers
Dominant language
Jupyter Notebook
Stars
4.4k
Forks
1.1k
PR merge metrics
No merged PRs in 30d

Description

Hi, I am getting the same error.
**print(tf.__version__)**:

2.0

**print(tf.keras.__version__)**

2.2.4-tf

I have tensorflow-gpu installed. I am getting this error when I run the following code:

import tf_explain
from tf_explain.callbacks.activations_visualization import ActivationsVisualizationCallback

callbacks = [
    ActivationsVisualizationCallback(validation_data=(x_val, y_val),
                                     layers_name=["hidden_layer_1"],
        output_dir="/home/raov/Desktop/Share/uni_freiburg/Datasets",
    ),
]


model.fit(x= x_train, y = y_train, batch_size=2, epochs=2, verbose= 1, callbacks=callbacks, validation_data= (x_val, y_val))

I guess it has something to do with the callback function. The source of the above code is https://github.com/sicara/tf-explain

Please note, that I tried model.fit with and without the validation data. Both the times I get the same error, so it has nothing to do with the validation data I guess

I did see the answer from the similar post "AttributeError: 'tuple' object has no attribute 'layer' #478". It didn't help me

Any idea how to solve this problem?

Output

Train on 40000 samples, validate on 10000 samples
Epoch 1/2
40000/40000 [==============================] - 245s 6ms/step - loss: 0.7130 - accuracy: 0.8195 - val_loss: 0.6355 - val_accuracy: 0.8540

Traceback

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-49-9049e3b5856c> in <module>
     36 
     37 
---> 38 model.fit(x= x_train, y = y_train, batch_size=2, epochs=2, verbose= 1, callbacks=callbacks, validation_data= (x_val, y_val))

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1237                                         steps_per_epoch=steps_per_epoch,
   1238                                         validation_steps=validation_steps,
-> 1239                                         validation_freq=validation_freq)
   1240 
   1241     def evaluate(self,

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/keras/engine/training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    214                         epoch_logs['val_' + l] = o
    215 
--> 216         callbacks.on_epoch_end(epoch, epoch_logs)
    217         if callbacks.model.stop_training:
    218             break

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/keras/callbacks/callbacks.py in on_epoch_end(self, epoch, logs)
    150         logs = logs or {}
    151         for callback in self.callbacks:
--> 152             callback.on_epoch_end(epoch, logs)
    153 
    154     def on_train_batch_begin(self, batch, logs=None):

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tf_explain/callbacks/activations_visualization.py in on_epoch_end(self, epoch, logs)
     48         """
     49         explainer = ExtractActivations()
---> 50         grid = explainer.explain(self.validation_data, self.model, self.layers_name)
     51 
     52         # Using the file writer, log the reshaped image.

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tf_explain/core/activations.py in explain(self, validation_data, model, layers_name)
     29             np.ndarray: Grid of all the activations
     30         """
---> 31         activations_model = self.generate_activations_graph(model, layers_name)
     32 
     33         predictions = activations_model.predict(

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tf_explain/core/activations.py in generate_activations_graph(model, layers_name)
     53         """
     54         outputs = [layer.output for layer in model.layers if layer.name in layers_name]
---> 55         activations_model = tf.keras.models.Model(model.inputs, outputs=outputs)
     56         activations_model.compile(optimizer="sgd", loss="categorical_crossentropy")
     57 

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/training.py in __init__(self, *args, **kwargs)
    144 
    145   def __init__(self, *args, **kwargs):
--> 146     super(Model, self).__init__(*args, **kwargs)
    147     _keras_api_gauge.get_cell('model').set(True)
    148     # initializing _distribution_strategy here since it is possible to call

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py in __init__(self, *args, **kwargs)
    165         'inputs' in kwargs and 'outputs' in kwargs):
    166       # Graph network
--> 167       self._init_graph_network(*args, **kwargs)
    168     else:
    169       # Subclassed network

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tensorflow_core/python/training/tracking/base.py in _method_wrapper(self, *args, **kwargs)
    455     self._self_setattr_tracking = False  # pylint: disable=protected-access
    456     try:
--> 457       result = method(self, *args, **kwargs)
    458     finally:
    459       self._self_setattr_tracking = previous_value  # pylint: disable=protected-access

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py in _init_graph_network(self, inputs, outputs, name, **kwargs)
    271 
    272     self._base_init(name=name, **kwargs)
--> 273     self._validate_graph_inputs_and_outputs()
    274 
    275     # A Network does not create weights of its own, thus it is already

~/.virtualenvs/deep_learning/lib/python3.6/site-packages/tensorflow_core/python/keras/engine/network.py in _validate_graph_inputs_and_outputs(self)
   1284       # Check that x is an input tensor.
   1285       # pylint: disable=protected-access
-> 1286       layer = x._keras_history.layer
   1287       if len(layer._inbound_nodes) > 1 or (
   1288           layer._inbound_nodes and layer._inbound_nodes[0].inbound_layers):

AttributeError: 'tuple' object has no attribute 'layer'

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the traceback entries in tf_explain/callbacks/activations_visualization.py and tf_explain/core/activations.py, especially generate_activations_graph and its model.inputs and layer.output handling. Reproduce the failure with TensorFlow 2.0 and the shown ActivationsVisualizationCallback configuration, then determine the compatibility change needed and add a regression check demonstrating that the callback completes.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
machine-learning
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
15/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.