Tensorflow: точность пользовательской модели CNN, истощенная тренировкой = False - PullRequest
0 голосов
/ 24 апреля 2020

Я обучил тип пользовательской модели CNN, которая выглядит следующим образом:

class MyModel(tf.keras.Model):
    def __init__(self):
        self.layers = [Conv2D(filters=4,kernel_size=(12,12),input_shape=28,28,1),padding='same',activation='relu'),\
            BatchNormalization(axis=-1 if tf.keras.backend.image_data_format() == 'channels_last' else 1),\
            Conv2D(filters=16,kernel_size=(2,2),padding='same',activation='sigmoid'),\
            BatchNormalization(axis=-1 if tf.keras.backend.image_data_format() == 'channels_last' else 1),\
            Conv2D(filters=1,kernel_size=(3,3),padding='same',activation='relu'),\
            Conv2D(28, (9, 9), input_shape=(28,28,2), activation='sigmoid'), \
            BatchNormalization(axis=-1 if tf.keras.backend.image_data_format() == 'channels_last' else 1), Conv2D(28, (3, 3), activation='sigmoid'), \
            Conv2D(14, (3, 3), activation='relu'), BatchNormalization(axis=-1 if tf.keras.backend.image_data_format() == 'channels_last' else 1), \
            MaxPooling2D((2, 2)), Conv2D(56, (3, 3), activation='relu'), BatchNormalization(axis=-1 if tf.keras.backend.image_data_format() == 'channels_last' else 1), \
            Conv2D(56, (3, 3), activation='relu'), MaxPooling2D((2, 2)), Flatten(),\
            Dense(200, activation="relu"), Dense(100, activation="relu"), Dense(10, activation='softmax', name='class_output')]

    def call(self, inputs, training=False):
        x = self.layers[0](inputs, training=training)
        for lyr in range(1,len(self.layers)):
            x = lyr(x, training=training)

и иногда (не всегда!) Точность тестирования падает до нуля при установке переменной training в значение False.

Если я протестирую обученную модель с чем-то вроде:

def test_model(model, test_dataset, training=False):
    accuracy = tf.keras.metrics.Accuracy(name='Test Accuracy')
    for (x, y) in test_dataset:
        test_preds = model(x, training=training) 
        accuracy.update_state(y, tf.argmax(test_preds, 1))
    print("{}: {}\n".format(accuracy.name, accuracy.result()*100))

Я получаю, например, 0,018% с обучением = False, но 98,9% с обучением = True. Есть идеи о том, что может вызвать такое поведение? На самом деле он не выглядит фиксированным для самой пакетной нормализации, так как я впервые испытал подобное поведение со слоями Dropout вместо слоев пакетной нормализации.

...