Я обучаю три разные архитектуры CNN (VGG16, ResNet50, DenseNet121) на одном и том же наборе данных медицинских изображений, но все три модели выдают одинаковые показатели (одинаковая точность, F1, AUC до 4 десятичных знаков). Это сохраняется при нескольких запусках обучения.
Настройка
Набор данных: 1016 медицинских изображений -> преобразовано в формат .npy (двоичная классификация)
Модели: VGG16, ResNet50, DenseNet121 (все без предварительно обученных весов, обучение с нуля)
Среда: TensorFlow 2.x
Входные данные: изображения в оттенках серого (224x224x1), преобразованные в 3-канальные для совместимости с архитектурой
Структура кода
python# Simplified version
def build_model(backbone_name, random_seed):
tf.random.set_seed(random_seed)
np.random.seed(random_seed)
# Grayscale to 3-channel conversion
image_input = tf.keras.Input(shape=(224, 224, 1))
x = augmentation_layer(image_input)
x = tf.keras.layers.Concatenate()([x, x, x]) # (224, 224, 3)
# Load backbone (VGG16/ResNet50/DenseNet121)
backbone = get_backbone(backbone_name, use_pretrained=False)
features = backbone(x)
# Independent classifier head with unique name
x = Dense(128, activation='relu', name=f'fc1_{backbone_name}_{random_seed}')(features)
x = Dropout(0.5)(x)
x = Dense(64, activation='relu', name=f'fc2_{backbone_name}_{random_seed}')(x)
output = Dense(1, activation='sigmoid', name=f'output_{backbone_name}_{random_seed}')(x)
model = tf.keras.Model(inputs=image_input, outputs=output)
return model
# Training
for model_name, seed in [('VGG16', 100), ('ResNet50', 200), ('DenseNet121', 300)]:
model = build_model(model_name, seed)
model.compile(optimizer=Adam(1e-4), loss='binary_crossentropy', metrics=['accuracy', AUC()])
model.fit(train_ds, validation_data=val_ds, epochs=25)
# Evaluate
predictions = model.predict(test_ds)
# Calculate metrics...
tf.keras.backend.clear_session() # Clear between models
Пример результатов
Model | Accuracy | F1 | AUC
------------|----------|--------|--------
VGG16 | 0.8234 | 0.8156 | 0.8891
ResNet50 | 0.8234 | 0.8156 | 0.8891 ← Identical!
DenseNet121 | 0.8234 | 0.8156 | 0.8891 ← Identical!
Проведенная диагностика
Статистика прогнозов (среднее, стандартное) немного отличается
Количество уникальных прогнозов варьируется (диапазон 100–150)
Истории обучения показывают разные закономерности сходимости
Количество параметров модели различно (VGG: 15M, ResNet: 24M, DenseNet: 7M)
Вопросы
- Может ли это быть ошибкой расчета метрики, когда я случайно повторно использую массивы?
- Существует ли проблема с кэшированием TensorFlow, несмотря на очистку сеансов?
- Могут ли модели действительно работать одинаково в этом наборе данных случайно?
- Я что-то упустил из виду правильной изоляции модели в TensorFlow?
TensorFlow 2.15
Python 3.10
Windows 11
GPU: RTX 3060
Подробнее здесь: https://stackoverflow.com/questions/798 ... 6-densenet
Мобильная версия