Я обучил тип пользовательской модели 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 вместо слоев пакетной нормализации.