【问题标题】:ImportError: cannot import name 'LayerNormalization' from 'tensorflow.python.keras.layers.normalization'ImportError:无法从“tensorflow.python.keras.layers.normalization”导入名称“LayerNormalization”
【发布时间】:2021-08-05 12:47:59
【问题描述】:

我正在使用 Python 3.8、Tensorflow 2.5.0 和 keras 2.3.1,我正在尝试制作模型,但我从 keras 收到错误。

这是我的代码:

import cv2
import os
import numpy as np
from keras.layers import Conv2D,Dropout, Flatten, Dense,MaxPooling2D, MaxPool2D
import keras.layers.normalization
#from tensorflow.keras.layers import Conv2D,Dropout, Flatten, Dense,MaxPooling2D, MaxPool2D
from keras_preprocessing.image import ImageDataGenerator
from sklearn.model_selection import train_test_split
from keras.models import Sequential
import pandas as pd
import random
from tensorflow.python.keras.utils.np_utils import to_categorical

count = 0
images = []
classNo = []
labelFile = 'signnames.csv'
classes = 43
testRatio = 0.2  # if 1000 images split will 200 for testing
validationRatio = 0.2  # if 1000 images 20% from remaining 800 will be 160 for valid
path_current = os.getcwd()
imageDim = (32, 32, 3)

####IMPORTING THE IMAGES FROM TRAIN FOLDER

for j in range(classes):
    path = os.path.join(path_current, 'train', str(j))
    imagesList = os.listdir(path)
    for i in imagesList:
        image = cv2.imread(path + '\\' + i)
        imageResized = cv2.resize(image, (32, 32))
        imageResized = np.array(imageResized)
        images.append(imageResized)
        classNo.append(count)
    count += 1

images = np.array(images)
classNo = np.array(classNo)

print(images.shape, classNo.shape)

##### Split Data - make the train
X_train, X_test, y_train, y_test = train_test_split(images, classNo, test_size=testRatio)
X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size=validationRatio)


#####processing all the images from train, test, validation
X_train = np.array(list(map(preprocessing, X_train)))  # for all the images
X_validation = np.array(list(map(preprocessing, X_validation)))
X_test = np.array(list(map(preprocessing, X_test)))
cv2.imshow("GrayScale Images", X_train[random.randint(0, len(X_train) - 1)])  # just to verify the tain
# cv2.waitKey(5000)


##### add a depth of 1 - for better lines
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], X_train.shape[2], 1)
X_validation = X_validation.reshape(X_validation.shape[0], X_validation.shape[1], X_validation.shape[2], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], X_test.shape[2], 1)

####augmentation of images : to make from some images more images, making it more generic, creating various similar images
dataGen = ImageDataGenerator(width_shift_range=0.1,  # 10%
                             height_shift_range=0.1,
                             zoom_range=0.2,
                             shear_range=0.1,  # distorted along an axis(aplecata)
                             rotation_range=10)  # degrees

dataGen.fit(X_train)
batches = dataGen.flow(X_train, y_train, batch_size=20)  # generate 20 images when it s called
X_batch, y_batch = next(batches)

#######from label to one encoding(making matrix with 0 and 1 based on classes number)
y_test = to_categorical(y_test, classes)
y_train = to_categorical(y_train, classes)
y_validation = to_categorical(y_validation, classes)


###########convolution neural network model
def myModel():
    nodesNr = 500
    filterNr = 60  ##to dont remove pixels based on filter size
    filterSize = (5, 5)  ##the kernel that move around the image to get the features
    # making padding
    filterSize2 = (3, 3)
    poolSize = (
    2, 2)  # for more generalize, to reduce overfitting(when detail and noise in training and go to negative result)

    model = Sequential();
    model.add(Conv2D(filterNr, filterSize, activation='relu', input_shape=X_train.shape[1:]))
    model.add(Conv2D(filterNr, filterSize, activation='relu'))
    model.add(MaxPooling2D(pool_size=poolSize))

    model.add(Conv2D(filterNr // 2, filterSize2, activation='relu'))
    model.add(Conv2D(filterNr // 2, filterSize2, activation='relu'))
    model.add(MaxPool2D(pool_size=poolSize))
    model.add(Dropout(0.5))

    model.add(Flatten())
    model.add(Dense(nodesNr, activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(classes, activation='softmax'))  # output layer

    model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])
    return model


####TRAIN

model = myModel()
print(model.summary())

model.save('traffic_classifier.h5')

我正在使用 PyCharm,但在第 8 行第一次导入 keras 时出现错误。

有错误:

Using TensorFlow backend.
2021-05-15 20:43:16.281415: I tensorflow/stream_executor/platform/default/dso_loader.cc:53] Successfully opened dynamic library cudart64_110.dll
Traceback (most recent call last):
  File "E:/FACULTATE ANUL 3 SEMESTRUL 2/Procesarea Imaginilor/proiect/main.py", line 8, in <module>
    from keras.layers import Conv2D,Dropout, Flatten, Dense,MaxPooling2D, MaxPool2D
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\__init__.py", line 3, in <module>
    from . import utils
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\utils\__init__.py", line 6, in <module>
    from . import conv_utils
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\utils\conv_utils.py", line 9, in <module>
    from .. import backend as K
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\backend\__init__.py", line 1, in <module>
    from .load_backend import epsilon
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\backend\load_backend.py", line 90, in <module>
    from .tensorflow_backend import *
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\keras\backend\tensorflow_backend.py", line 5, in <module>
    import tensorflow as tf
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\__init__.py", line 41, in <module>
    from tensorflow.python.tools import module_util as _module_util
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\__init__.py", line 48, in <module>
    from tensorflow.python import keras
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\__init__.py", line 25, in <module>
    from tensorflow.python.keras import models
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\models.py", line 20, in <module>
    from tensorflow.python.keras import metrics as metrics_module
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\metrics.py", line 37, in <module>
    from tensorflow.python.keras import activations
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\activations.py", line 18, in <module>
    from tensorflow.python.keras.layers import advanced_activations
  File "C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\layers\__init__.py", line 146, in <module>
    from tensorflow.python.keras.layers.normalization import LayerNormalization
ImportError: cannot import name 'LayerNormalization' from 'tensorflow.python.keras.layers.normalization' (C:\Users\My-Pc\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\keras\layers\normalization\__init__.py)

【问题讨论】:

  • 您是否为同一个包尝试过其他导入路径?
  • 你说的“其他导入路径”是什么意思?
  • from keras.layers import LayerNormalization -- 这个导入对我有用

标签: python python-3.x tensorflow keras


【解决方案1】:

尝试通过 Tensorflow 存储库而不是 Keras 存储库导入您的模块。

例如:

from tensorflow.keras.models import Sequential

【讨论】:

  • 我已经添加了只使用这个的模型。这是行不通的 。 ImportError:无法从“tensorflow.python.keras.layers.normalization”导入名称“LayerNormalization”(C:\ProgramData\Anaconda3\lib\site-packages\tensorflow\python\keras\layers\normalization_init_.py)
【解决方案2】:

我在使用 Python 3.8、Tensorflow 2.5.0 和 keras 2.3.1 时遇到了同样的错误。经历了来自所有来源的众多解决方案。为我解决的问题是将 Python 降级到 3.7。由于某种原因,Keras LayerNormalization 似乎与我计算机上本地的 Python 3.8 不兼容,即使我无法通过 Colab 复制该问题。

如果您使用 Anaconda,您可以为 Tensorflow 创建一个新环境。这对我有用:

conda create -n tensorflow_env tensorflow
conda activate tensorflow_env

其中安装了 Python 3.7.10 和 Tensorflow 2.0.0。然后您可以将 TensorFlow 升级到 2.5.0。

【讨论】:

    【解决方案3】:

    这似乎是 python/tensorflow/keras 之间版本不匹配的组合。这是对我有用的版本python 3.8.6/tensorflow==2.5.0/keras==2.4.3 并摆脱了 layer_normalization 错误

    【讨论】:

      【解决方案4】:

      软件包已重命名。这个导入对我有用。

      from keras.layers.normalization import layer_normalization
      

      【讨论】:

        【解决方案5】:

        可能与原始问题不是 100% 相关,但已经来到这里尝试在 conda 环境中的 MacBook Pro M1 上解决此问题

        我的最终解决方法是从多个地方连接点点滴滴:

        pip uninstall -y tensorflow keras tf-nightly keras-nightly

        python -m pip install tensorflow-macos

        【讨论】:

          【解决方案6】:

          如果您想在基础环境中安装 tensorflow,请使用 pip install tensorflow==2.2.0 --user 命令。

          【讨论】:

          • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
          【解决方案7】:

          加入 2022 年的解决方案 - 我遇到了同样的问题

          tensorflow == 2.5.0
          python == 3.9
          

          升级到tensorflow == 2.7.0 为我做了这件事

          pip install --upgrade tensorflow
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-22
            • 2022-01-22
            • 2021-06-30
            • 2020-10-19
            • 2018-08-13
            • 2015-01-26
            相关资源
            最近更新 更多