Валидация и оценка Metri c Проблемы в TensorFlow при передаче обучения - PullRequest
0 голосов
/ 14 января 2020

Я сталкивался с некоторыми странными поведениями при обучении CNN с Tensorflow 2.0 и был бы признателен за любую помощь в их решении. Я занимаюсь трансферным обучением (просто обучаю главу классификации), используя предварительно обученные сети, доступные в 'tenorflow.keras.applications', и заметил следующее:

  1. Для первой эпохи метрики валидации всегда ноль, независимо от того, что я делаю.
  2. При обучении после первой эпохи показатели обучения улучшаются, как и следовало ожидать, но показатели проверки по сути являются случайными догадками, даже когда EXACT один и тот же набор данных используется в качестве обучающего и проверочного набора данных. Это похоже на то, что она не использует обучаемую модель для оценки.

Я пробовал VGG16, MobileNetV2 и ResNet50V2, и все они демонстрируют одинаковое поведение.

Конфигурации, на которых я могу это воспроизвести:

  • Ubuntu 18.04LTS, Nvidia RTX2080ti с версией драйвера 430.50, CUDA10.0, TensorFlow-gpu == 2.0.0
  • MacBook Pro, TensorFlow == 2.0.0 (cpu)

Оба работают в средах Conda, и я установил TensorFlow с pip. Я поместил некоторый пример кода, чтобы показать суть моего рабочего процесса ниже на случай, если я делаю что-то явно глупое. Любая помощь будет очень признательна, так как я в растерянности относительно того, как это исправить.

def parse_function(example_proto):
    image_feature_description = {
        'label': tf.io.FixedLenFeature([], tf.int64),
        'image_raw': tf.io.FixedLenFeature([], tf.string)
    }
    parsed_example = tf.io.parse_single_example(example_proto, image_feature_description)
    image = tf.io.decode_image(
                            parsed_example['image_raw'], 
                            channels = 3, 
                            dtype = tf.float32, 
                            expand_animations = False
                            )
    image = tf.image.per_image_standardization(image)
    label = tf.one_hot(parsed_example['label'], 24, dtype=tf.float32) 
    return (image, label)

def load_dataset(TFRecord_dir, record_name):
    record_files = tf.io.matching_files(os.path.join(TFRecord_dir, record_name + '.tfrecords-????'))
    shards = tf.data.TFRecordDataset(record_files)
    shards = shards.shuffle(tf.cast(tf.shape(record_files)[0], tf.int64))
    dataset = shards.map(map_func=parse_function)
    dataset = dataset.batch(batch_size=16, drop_remainder = True)
    dataset = dataset.prefetch(16)
    return dataset



base_model = tf.keras.applications.ResNet50V2(
                                            input_shape=(224,224,3),
                                            weights='imagenet',
                                            include_top = False
                                            )
base_model.trainable = False

model = tf.keras.Sequential([
        base_model,
        tf.keras.layers.GlobalAveragePooling2D(),
        tf.keras.layers.Dropout(0.5),
        tf.keras.layers.Dense(24, activation = 'softmax')
        ])

model.compile(
    optimizer=tf.keras.optimizers.Adam(),
    loss=tf.keras.losses.CategoricalCrossentropy(),
    metrics=[ 
            tf.keras.metrics.CategoricalAccuracy(),
            tf.keras.metrics.TopKCategoricalAccuracy(),
            tf.keras.metrics.Precision(),
            tf.keras.metrics.Recall()
            ])

train_dataset = load_dataset(train_dir, 'train')

model.fit(train_dataset,
                verbose = 1,
                epochs= 5,
                validation_data = train_dataset)
model.evaluate(train_dataset)

Ответы [ 2 ]

0 голосов
/ 27 января 2020

У меня больше нет этой проблемы, так как вместо этого я начал использовать предоставленные docker изображения. Должно быть, что-то было установлено неправильно, но я не знаю что.

Кроме того, для тех, кто находится в том же положении, я обнаружил во время отладки, что если вы нормализуете свои изображения, используя image = (image/127.5) - 1, как в обучении переносу с предварительно обученной обучающей программой CNN , измените на image = tf.image.per_image_standardization(image), поскольку он демонстрирует то же поведение, даже в контейнере docker, показатели ietraining улучшатся, но показатели проверки будут оставаться случайными в том же наборе данных, который использовался для обучения.

0 голосов
/ 14 января 2020

При обучении после первой эпохи показатели обучения улучшаются, как и следовало ожидать, но показатели проверки по существу являются случайными догадками, даже когда тот же самый набор данных EXACT используется в качестве обучающего и проверочного набора данных. Это похоже на то, что она не использует обучаемую модель для своей оценки.

Это означает, что ваша сеть не может изучить все, и она просто перегружена. Случайные предположения означают, что у вас есть точность 1 / n, где n - это число классов.

Вы можете захотеть изменить learning_rate до гораздо более низкого значения (1e-5) для начала, а затем даже разморозить некоторые из нижние слои (близко к вашему GAP + Dropout + Dense).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...