Search code examples
pythontensorflowkerasgoogle-colaboratory

Problem with running 3D CNNs on Google colab using Keras


I am trying to train a model that includes 3D Conv layers using keras library on google colab. I run into this error:

AttributeError                            Traceback (most recent call last)

<ipython-input-5-c6ef25f2bc4a> in <module>()
      8 
      9 model = Sequential()
---> 10 model.add(Conv3D(16,kernel_size=(3,5,3),padding='same', activation='relu', kernel_initializer='he_normal', input_shape=(20,25,3,1),data_format='channels_first'))
     11 model.add(Conv3D(32,kernel_size=(3,3,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_first'))
     12 model.add(Dropout(0.5))

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in _get_available_gpus()
    504             _LOCAL_DEVICES = [x.name for x in devices]
    505         else:
--> 506             _LOCAL_DEVICES = tf.config.experimental_list_devices()
    507     return [x for x in _LOCAL_DEVICES if 'device:gpu' in x.lower()]
    508 
AttributeError: module 'tensorflow._api.v2.config' has no attribute 'experimental_list_devices'

This problem doesnt happen when I try 2D conv layers. Only with 3D conv layers. I should also mention that this code run on my local machine just fine.

The whole code block is

import keras
from keras.models import Sequential, Model
from keras.layers import Dense, Flatten, Conv3D, MaxPooling3D, Dropout, BatchNormalization, Input
from keras.utils import to_categorical
from keras import regularizers



model = Sequential()
model.add(Conv3D(16,kernel_size=(3,5,3),padding='same', activation='relu', kernel_initializer='he_normal', input_shape=(20,25,3,1),data_format='channels_first'))
model.add(Conv3D(32,kernel_size=(3,3,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_first'))
model.add(Dropout(0.5))
#model.add(MaxPooling3D(pool_size=(2, 2,2)))
model.add(Conv3D(64,kernel_size=(3,5,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_first'))
model.add(MaxPooling3D(pool_size=(2, 2,2)))
model.add(Dropout(0.5))
model.add(Conv3D(128,kernel_size=(3,5,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_first'))
#model.add(MaxPooling3D(pool_size=(2, 2,2)))
#model.add(Conv3D(64,kernel_size=(3,3,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_last'))
#model.add(Conv3D(128,kernel_size=(3,3,3),padding='same', activation='relu', kernel_initializer='he_normal',data_format='channels_last'))
model.add(BatchNormalization(center=True, scale=True))
model.add(Flatten())
model.add(Dropout(0.5))
#model.add(Dense(10000, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(5000, activation='relu', kernel_initializer='he_normal'))
model.add(Dropout(0.5))
model.add(Dense(300, activation='relu', kernel_initializer='he_normal'))
model.add(Dense(20, activation='softmax'))


from keras.callbacks import ReduceLROnPlateau
model.compile(loss='categorical_crossentropy',
              optimizer=keras.optimizers.Adam(lr=0.001),
              metrics=['accuracy'])
model.summary()
reduce_lr = ReduceLROnPlateau(monitor='val_accuracy', factor=0.8,mode = 'max',patience=5, min_lr=0.0001)
# Fit data to model
history = model.fit(X_train, y_train,
            callbacks =[reduce_lr],
            batch_size=128,
            epochs=300,
            verbose=1,
            validation_split=0.2)

score, acc = model.evaluate(X_test, y_test,
                            batch_size=128)
print('Test score:', score)
print('Test accuracy:', acc)

Solution

  • Try to add this code

    import tensorflow as tf
    import keras.backend.tensorflow_backend as tfback
    print("tf.__version__ is", tf.__version__)
    print("tf.keras.__version__ is:", tf.keras.__version__)
    
    def _get_available_gpus():
        """Get a list of available gpu devices (formatted as strings).
    
        # Returns
            A list of available GPU devices.
        """
        #global _LOCAL_DEVICES
        if tfback._LOCAL_DEVICES is None:
            devices = tf.config.list_logical_devices()
            tfback._LOCAL_DEVICES = [x.name for x in devices]
        return [x for x in tfback._LOCAL_DEVICES if 'device:gpu' in x.lower()]
    
    tfback._get_available_gpus = _get_available_gpus
    

    you should also look at this for further solution: https://github.com/keras-team/keras/issues/13684