‘BatchNormalization’ не определен

#python #keras #deep-learning #nameerror #batch-normalization

#python #keras #глубокое обучение #ошибка имени #пакетное нормирование

Вопрос:

Попытка обучить надежную модель CNN, которая определяется следующим образом:

 from keras.datasets import cifar10
from keras.utils import np_utils
from keras import metrics
from keras.models import Sequential
from keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, LSTM, merge
from keras.layers import BatchNormalization
from keras import metrics
from keras.losses import categorical_crossentropy
from keras.optimizers import SGD
import pickle
import matplotlib.pyplot as plt
import numpy as np 
from keras.preprocessing.image import ImageDataGenerator
from keras import layers
from keras.callbacks import EarlyStopping



def Robust_CNN():
    
    model = Sequential()
    model.add(Conv2D(256, (3, 3), activation='relu', padding='same', init='glorot_uniform', input_shape=(2,128,1)))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(1, 2), padding='valid',  data_format=None))
    model.add(layers.Dropout(.3))
    model.add(Conv2D(128, (3, 3), activation='relu', init='glorot_uniform', padding='same'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(1, 2), padding='valid', data_format=None))
    model.add(layers.Dropout(.3))
    model.add(Conv2D(64, (3, 3), activation='relu', init='glorot_uniform', padding='same'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(1, 2), padding='valid', data_format=None))
    model.add(layers.Dropout(.3))
    model.add(Conv2D(64, (3, 3), activation='relu', init='glorot_uniform', padding='same'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(1, 2), padding='valid', data_format=None))
    model.add(layers.Dropout(.3))
    model.add(Flatten())
    model.add(Dense(128, activation='relu', init='he_normal'))
    model.add(BatchNormalization())
    model.add(Dense(11, activation='softmax', init='he_normal'))
    
    return model
  

Однако, при попытке сделать это, я получаю ошибку NameError, которая не определяет имя ‘BatchNormalization’. Полное сообщение об ошибке выглядит следующим образом:

 ---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-11-8084d29438f8> in <module>
     55 # >>>>>>>>>>>>>>>>>>>>> choose a model by un-commenting only one of the three <<<<<<<<<<<<<<<<<<<<<<<<<<<
     56 #xx_shape = (2,128,1)
---> 57 models = Robust_CNN()
     58 #models = CLDNN()
     59 #models = resnet(xx_shape)

~AppDataLocalProgramsPythonPython37ScriptsFYPOptimizing-Modulation-Classification-with-Deep-Learning-masterOptimizing-Modulation-Classification-with-Deep-Learning-masterRobust_CNN Modelmodel.py in Robust_CNN()
     19 def Robust_CNN():
     20 
---> 21     model = Sequential()
     22     model.add(Conv2D(256, (3, 3), activation='relu', padding='same', init='glorot_uniform', input_shape=(2,128,1)))
     23     model.add(BatchNormalization())

NameError: name 'BatchNormalization' is not defined

  

Кажется, не могу понять, почему это происходит, даже если я уже импортировал BatchNormalization.

Комментарии:

1. Не удается воспроизвести ошибку, я только что вставил ваш код, и он работает, я бы сказал, что у вас ошибка где-то в другом месте, возможно, проблема с зависимостью?

2. О, я понимаю. Рассмотрим это подробнее. Большое вам спасибо!

Ответ №1:

Сначала импортируйте BatchNormalization из tensorflow.keras.layers , затем запустите свой код:

 from tensorflow.keras.layers import BatchNormalization
  

Ответ №2:

Добавьте это в свой код-

from tensorflow.keras.layers import BatchNormalization

Ответ №3:

 # import BatchNormalization
from keras.layers.normalization import BatchNormalization
  

Комментарии:

1. из tensorflow.keras. слои импортируют BatchNormalization

Ответ №4:

импортировать BatchNormalization

из tensorflow.keras.слои импортируют BatchNormalization

Комментарии:

1. Уже есть три подобных ответа; зачем добавлять новый?