ПРЕДУПРЕЖДЕНИЕ: tensorflow: градиенты не существуют для переменных — Conv-6 CNN для CIFAR-10

#python #keras #deep-learning #conv-neural-network #tensorflow2

#python #keras #глубокое обучение #conv-нейронная сеть #tensorflow2

Вопрос:

Я пытаюсь создать Conv-6 CNN для классификации с использованием набора данных CIFAR-10. Этот CNN использует 3 блока, где каждый блок имеет 2 уровня conv, за которыми следует максимальный уровень объединения. Это сглаживается и передается в два плотных слоя перед передачей на выходной слой.

Код, который у меня есть, таков:

 # input image dimensions
img_rows, img_cols = 32, 32

# Load CIFAR-10 dataset-
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.cifar10.load_data()

if tf.keras.backend.image_data_format() == 'channels_first':
    X_train = X_train.reshape(X_train.shape[0], 3, img_rows, img_cols)
    X_test = X_test.reshape(X_test.shape[0], 3, img_rows, img_cols)
    input_shape = (3, img_rows, img_cols)
else:
    X_train = X_train.reshape(X_train.shape[0], img_rows, img_cols, 3)
    X_test = X_test.reshape(X_test.shape[0], img_rows, img_cols, 3)
    input_shape = (img_rows, img_cols, 3)

print("n'input_shape' which will be used = {0}n".format(input_shape))
# 'input_shape' which will be used = (32, 32, 3)

# Convert datasets to floating point types-
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# Normalize the training and testing datasets-
X_train /= 255.0
X_test /= 255.0

# Convert class vectors/target to binary class matrices or one-hot encoded values-
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)

print("nDimensions of training and testing sets are:")
print("X_train.shape = {0}, y_train.shape = {1}".format(X_train.shape, y_train.shape))
print("X_test.shape = {0}, y_test.shape = {1}".format(X_test.shape, y_test.shape))
# Dimensions of training and testing sets are:
# X_train.shape = (50000, 32, 32, 3), y_train.shape = (50000, 10)
# X_test.shape = (10000, 32, 32, 3), y_test.shape = (10000, 10)


class Conv6(Model):
    def __init__(self, **kwargs):
        super(Conv6, self).__init__(**kwargs)
        self.conv1 = Conv2D(
            filters = 64, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.conv2 = Conv2D(
            filters = 64, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.pool1 = MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
            )
        self.conv3 = Conv2D(
            filters = 128, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.conv4 = Conv2D(
            filters = 128, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.pool2 = MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
            )
        self.conv5 = Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.conv6 = Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation = 'relu', kernel_initializer = tf.initializers.GlorotNormal(),
            strides = (1, 1), padding = 'same'
            )
        self.flatten = Flatten()
        self.dense1 = Dense(
            units = 256, activation = 'relu',
            kernel_initializer = tf.initializers.GlorotNormal()
            )
        self.dense2 = Dense(
            units = 256, activation = 'relu',
            kernel_initializer = tf.initializers.GlorotNormal()
            )
        self.op = Dense(
            units = num_classes, activation = 'softmax'
            )
    
    def call(self, inputs):
        x = self.conv1(inputs)
        x = self.conv2(x)
        x = self.pool1(inputs)
        x = self.conv3(x)
        x = self.conv4(x)
        x = self.pool2(x)
        x = self.conv5(x)
        x = self.conv6(x)
        x = self.flatten(x)
        x = self.dense1(x)
        x = self.dense2(x)
        return self.op(x)


# Initialize a Conv-6 CNN model-
model = Conv6()

# Compile defined model-
model.compile(
    loss=tf.keras.losses.categorical_crossentropy,
    # optimizer='adam',
    optimizer=tf.keras.optimizers.Adam(lr = 0.0003),
    metrics=['accuracy']
    )

# Define early stopping callback-
early_stopping_callback = tf.keras.callbacks.EarlyStopping(
        monitor = 'val_loss', min_delta = 0.001,
        patience = 3)

# Train defined and compiled model-
history = model.fit(
    x = X_train, y = y_train,
    batch_size = batch_size, shuffle = True,
    epochs = num_epochs,
    callbacks = [early_stopping_callback],
    validation_data = (X_test, y_test)
    )
 

При вызове «model.fit ()» он выдает мне следующие предупреждения:

ПРЕДУПРЕЖДЕНИЕ: tensorflow: градиенты не существуют для переменных [‘conv6 / conv2d / kernel:0’, ‘conv6 / conv2d / bias:0’, ‘conv6 / conv2d_1 / kernel:0’, ‘conv6 / conv2d_1 /bias:0’] при минимизации потерь. ПРЕДУПРЕЖДЕНИЕ: tensorflow: градиенты не существуют для переменных [‘conv6 / conv2d / kernel:0’, ‘conv6 / conv2d / bias:0’, ‘conv6 / conv2d_1 / kernel:0’, ‘conv6 / conv2d_1 /bias:0’] при минимизации потерь.

Несмотря на предупреждения, определенная модель CNN достигает точности проверки около 72% за 9 эпох.

Почему я получаю эти предупреждения?

Спасибо!

Ответ №1:

В методе «call ()» используйте следующую строку кода для удаления предупреждений:

 x = self.pool1(inputs)