Search code examples
pythontensorflowmachine-learningkeraspython-3.7

Colab - Keras - TypeError: 'int' object is not iterable


I was trying to train and test a network to recognize numbers using keras mnist dataset , and it works perfectly on my computer, but it does not work in Google Colab.

Notebook settings:

  • Hardware accelerator GPU

Notebook code:

%tensorflow_version 2.x

import tensorflow as tf
import keras
import numpy as np
tf.test.gpu_device_name()
from tensorflow.python.client import device_lib
device_lib.list_local_devices()

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
from keras import backend as k 
from keras.callbacks import TensorBoard

batchsize=100
num_clases=10
epocas=10 #10*100 = 1000
filas,columnas=28,28

#Entrada y salida
(xt,yt),(xtest, ytest) = mnist.load_data()

xt=xt.reshape(xt.shape[0], filas, columnas, 1)
xtest=xtest.reshape(xtest.shape[0], filas, columnas, 1)

xt=xt.astype('float32')
xtest=xtest.astype('float32')

xt=xt/255
xtest=xtest/255

yt=keras.utils.to_categorical(yt,num_clases)
ytest=keras.utils.to_categorical(ytest,num_clases)

modelo=Sequential()
modelo.add(Conv2D(64, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)))
modelo.add(Conv2D(128, kernel_size=(3,3), activation='relu'))
modelo.add(MaxPooling2D(pool_size=(2,3)))
modelo.add(Flatten())
modelo.add(Dense(70,activation='relu'))
modelo.add(Dropout(0,25))
modelo.add(Dense(num_clases, activation='softmax'))

modelo.compile(loss=keras.losses.categorical_crossentropy, metrics=['categorical_accuracy'], optimizer=keras.optimizers.Adam())

modelo.fit(xt, yt, batch_size=batchsize, epochs=epocas, validation_data=[xtest, ytest], verbose=1)

puntuacion=modelo.evaluate(xtest, ytest, batch_size=batchsize)

print(puntuacion)

This is the complete error log that Google Colab shows me:

TypeError                                 Traceback (most recent call last)

<ipython-input-19-cac37ad8c603> in <module>()
     45 modelo.compile(loss=keras.losses.categorical_crossentropy, metrics=['categorical_accuracy'], optimizer=keras.optimizers.Adam())
     46 
---> 47 modelo.fit(xt, yt, batch_size=batchsize, epochs=epocas, validation_data=[xtest, ytest], verbose=1)
     48 
     49 puntuacion=modelo.evaluate(xtest, ytest, batch_size=batchsize)

/usr/local/lib/python3.7/dist-packages/tensorflow/python/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_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1098                 _r=1):
   1099               callbacks.on_train_batch_begin(step)
-> 1100               tmp_logs = self.train_function(iterator)
   1101               if data_handler.should_sync:
   1102                 context.async_wait()

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
    826     tracing_count = self.experimental_get_tracing_count()
    827     with trace.Trace(self._name) as tm:
--> 828       result = self._call(*args, **kwds)
    829       compiler = "xla" if self._experimental_compile else "nonXla"
    830       new_tracing_count = self.experimental_get_tracing_count()

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
    869       # This is the first call of __call__, so we have to initialize.
    870       initializers = []
--> 871       self._initialize(args, kwds, add_initializers_to=initializers)
    872     finally:
    873       # At this point we know that the initialization is complete (or less

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in _initialize(self, args, kwds, add_initializers_to)
    724     self._concrete_stateful_fn = (
    725         self._stateful_fn._get_concrete_function_internal_garbage_collected(  # pylint: disable=protected-access
--> 726             *args, **kwds))
    727 
    728     def invalid_creator_scope(*unused_args, **unused_kwds):

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in _get_concrete_function_internal_garbage_collected(self, *args, **kwargs)
   2967       args, kwargs = None, None
   2968     with self._lock:
-> 2969       graph_function, _ = self._maybe_define_function(args, kwargs)
   2970     return graph_function
   2971 

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in _maybe_define_function(self, args, kwargs)
   3359 
   3360           self._function_cache.missed.add(call_context_key)
-> 3361           graph_function = self._create_graph_function(args, kwargs)
   3362           self._function_cache.primary[cache_key] = graph_function
   3363 

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/function.py in _create_graph_function(self, args, kwargs, override_flat_arg_shapes)
   3204             arg_names=arg_names,
   3205             override_flat_arg_shapes=override_flat_arg_shapes,
-> 3206             capture_by_value=self._capture_by_value),
   3207         self._function_attributes,
   3208         function_spec=self.function_spec,

/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in func_graph_from_py_func(name, python_func, args, kwargs, signature, func_graph, autograph, autograph_options, add_control_dependencies, arg_names, op_return_value, collections, capture_by_value, override_flat_arg_shapes)
    988         _, original_func = tf_decorator.unwrap(python_func)
    989 
--> 990       func_outputs = python_func(*func_args, **func_kwargs)
    991 
    992       # invariant: `func_outputs` contains only Tensors, CompositeTensors,

/usr/local/lib/python3.7/dist-packages/tensorflow/python/eager/def_function.py in wrapped_fn(*args, **kwds)
    632             xla_context.Exit()
    633         else:
--> 634           out = weak_wrapped_fn().__wrapped__(*args, **kwds)
    635         return out
    636 

/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args, **kwargs)
    975           except Exception as e:  # pylint:disable=broad-except
    976             if hasattr(e, "ag_error_metadata"):
--> 977               raise e.ag_error_metadata.to_exception(e)
    978             else:
    979               raise

TypeError: in user code:

    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:805 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:795 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1259 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2730 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3417 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:788 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:754 train_step
        y_pred = self(x, training=True)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py:1012 __call__
        outputs = call_fn(inputs, *args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/sequential.py:375 call
        return super(Sequential, self).call(inputs, training=training, mask=mask)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/functional.py:425 call
        inputs, training=training, mask=mask)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/functional.py:560 _run_internal_graph
        outputs = node.layer(*args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/base_layer.py:1012 __call__
        outputs = call_fn(inputs, *args, **kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py:231 call
        lambda: array_ops.identity(inputs))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/utils/control_flow_util.py:115 smart_cond
        pred, true_fn=true_fn, false_fn=false_fn, name=name)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/smart_cond.py:54 smart_cond
        return true_fn()
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py:226 dropped_inputs
        noise_shape=self._get_noise_shape(inputs),
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/layers/core.py:215 _get_noise_shape
        for i, value in enumerate(self.noise_shape):

    TypeError: 'int' object is not iterable

Why am i getting this error?


Solution

  • The issue is with the input to the Dropout Layer

    modelo.add(Dropout(0,25))
    

    The first parameter takes in the fraction of the input units to drop. The second is a 1D integer tensor representing the shape of the binary dropout mask that will be multiplied with the input. I think you meant to just set the first parameter. If you change it to the line below it will run.

    modelo.add(Dropout(0.4))
    

    Another issue is that the input for the validation data has to be a tuple and not an array so change this line as well:

    modelo.fit(xt, y=yt, batch_size=batchsize, epochs=epocas, validation_data=(xtest, ytest), verbose=1)
    

    Output from training and evaluation:

    Epoch 10/10
    600/600 [==============================] - 4s 7ms/step - loss: 0.0225 - categorical_accuracy: 0.9924 - val_loss: 0.0280 - val_categorical_accuracy: 0.9933
    100/100 [==============================] - 0s 3ms/step - loss: 0.0280 - categorical_accuracy: 0.9933
    [0.0280386321246624, 0.9933000206947327]