Search code examples
pythontensorflowkeras

ImportError: cannot import name 'BatchNormalization' from 'keras.layers.normalization'


i have an import problem when executing my code:

from keras.models import Sequential
from keras.layers.normalization import BatchNormalization
2021-10-06 22:27:14.064885: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'cudart64_110.dll'; dlerror: cudart64_110.dll not found
2021-10-06 22:27:14.064974: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
Traceback (most recent call last):
  File "C:\Data\breast-cancer-classification\train_model.py", line 10, in <module>
    from cancernet.cancernet import CancerNet
  File "C:\Data\breast-cancer-classification\cancernet\cancernet.py", line 2, in <module>
    from keras.layers.normalization import BatchNormalization
ImportError: cannot import name 'BatchNormalization' from 'keras.layers.normalization' (C:\Users\Catalin\AppData\Local\Programs\Python\Python39\lib\site-packages\keras\layers\normalization\__init__.py)
  • Keras version: 2.6.0
  • Tensorflow: 2.6.0
  • Python version: 3.9.7

The library it is installed also with

pip install numpy opencv-python pillow tensorflow keras imutils scikit-learn matplotlib

Do you have any ideas?

library path


Solution

  • You're using outdated imports for tf.keras. Layers can now be imported directly from tensorflow.keras.layers:

    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import (
        BatchNormalization, SeparableConv2D, MaxPooling2D, Activation, Flatten, Dropout, Dense
    )
    from tensorflow.keras import backend as K
    
    
    class CancerNet:
        @staticmethod
        def build(width, height, depth, classes):
            model = Sequential()
            shape = (height, width, depth)
            channelDim = -1
    
            if K.image_data_format() == "channels_first":
                shape = (depth, height, width)
                channelDim = 1
    
            model.add(SeparableConv2D(32, (3, 3), padding="same", input_shape=shape))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(MaxPooling2D(pool_size=(2, 2)))
            model.add(Dropout(0.25))
    
            model.add(SeparableConv2D(64, (3, 3), padding="same"))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(SeparableConv2D(64, (3, 3), padding="same"))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(MaxPooling2D(pool_size=(2, 2)))
            model.add(Dropout(0.25))
    
            model.add(SeparableConv2D(128, (3, 3), padding="same"))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(SeparableConv2D(128, (3, 3), padding="same"))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(SeparableConv2D(128, (3, 3), padding="same"))
            model.add(Activation("relu"))
            model.add(BatchNormalization(axis=channelDim))
            model.add(MaxPooling2D(pool_size=(2, 2)))
            model.add(Dropout(0.25))
    
            model.add(Flatten())
            model.add(Dense(256))
            model.add(Activation("relu"))
            model.add(BatchNormalization())
            model.add(Dropout(0.5))
    
            model.add(Dense(classes))
            model.add(Activation("softmax"))
    
            return model
    
    model = CancerNet()