Я сталкивался с некоторыми странными поведениями при обучении CNN с Tensorflow 2.0 и был бы признателен за любую помощь в их решении. Я занимаюсь трансферным обучением (просто обучаю главу классификации), используя предварительно обученные сети, доступные в 'tenorflow.keras.applications', и заметил следующее:
- Для первой эпохи метрики валидации всегда ноль, независимо от того, что я делаю.
- При обучении после первой эпохи показатели обучения улучшаются, как и следовало ожидать, но показатели проверки по сути являются случайными догадками, даже когда 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)