Я классифицирую набор данных медицинских изображений как нормальный против ненормального, где применяю трансферное обучение с помощью ResNet50v2. Я немного изменил последний слой, а затем для точной настройки разморозил слой.
Поиск этого типа запроса, но не смог найти ни одного.
Я использую Keras с TensorFlow.
Мой вопрос:
model.save() этот метод подойдет для любого будущего обучения.
# Create a MirroredStrategy.
import tensorflow as tf
from tensorflow import keras
def f1_m(y_true, y_pred):
precision = precision_m(y_true, y_pred)
recall = recall_m(y_true, y_pred)
return 2*((precision*recall)/(precision+recall+K.epsilon()))
def recall_m(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
return recall
def precision_m(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
dependencies = {
'f1_m': f1_m,
'recall_m': recall_m,
'precision_m': precision_m,
}
# I am using multi GPU and custom metrices so loading need these custom arguments.
strategy = tf.distribute.MirroredStrategy()
print("Number of devices: {}".format(strategy.num_replicas_in_sync))
# Open a strategy scope.
with strategy.scope():
adam = tf.keras.optimizers.Adam(learning_rate=0.00005, amsgrad=True, name='Adam',)
model = keras.models.load_model('/home/classifier/model/resnet50_-36.hdf5', custom_objects=dependencies)
model.summary()
model.trainable = True
model.compile(loss='binary_crossentropy',optimizer=adam,metrics=metric)
Сейчас вот компилирую модель и тут я запутался что важно компилировать после разморозки или нужно сохранять чекпойнт и потом загружать модель и потом разморозить и начать обучение?
Сохранение модели:
model.save("path")
# Load the save model like before
model.trainable = True
model.compile(loss='binary_crossentropy',optimizer=adam,metrics=metric)






Вы должны скомпилировать модель после разморозки, а затем начать обучение, не нужно предварительно сохранять ее на диск.
Спасибо @Noltibus за ваш ответ, но в то время я искал некоторые технические детали, которые я изучил сейчас, и я делюсь здесь своим опытом.
Во-первых, у нас есть два типа обучения, в то время как мы используем предварительно обученный models обученный imagenet набор данных.
> Обучение классификатору:
Пока мы пытаемся изменить последний слой и обучить нашу начальную модель без изменений в слоях извлечения признаков. Затем мы выбираем лучшую модель во время обучения, а затем настраиваем размораживание слои convolutional.
> Fintune, разморозив сверточные слои:
Выбирается лучшая модель, а затем размораживаются слои сколько угодно и снова компилируется модель и подгоняется под модель.
Код для обучения классификатора:
image_size = 512
input_shape = (image_size, image_size, 3)
pre_trained_model = tf.keras.applications.ResNet50V2(input_shape=input_shape, include_top=False, weights = "imagenet")
for layer in pre_trained_model.layers:
layer.trainable = False
gap = keras.layers.GlobalAveragePooling2D()(pre_trained_model.output, training=False)
output = keras.layers.Dense(1, activation='sigmoid')(gap)
model = keras.Model(inputs=pre_trained_model.input, outputs=output)
model.compile(loss='binary_crossentropy',
optimizer=adam,
metrics=metric)#'accuracy'
history = model.fit(train_gen,
use_multiprocessing=True,
workers=16,
epochs=50,
class_weight=class_weights,
steps_per_epoch=train_steps,
validation_data=val_gen,
validation_steps=val_steps,
shuffle=True,
callbacks=call_backs)
В приведенном выше коде говорится, что мы просто загружаем предварительно обученную модель, а затем меняем ее окончательные слои, компилируем и подгоняем модель.
Теперь мы проводим точную настройку тех же данных, чтобы изучить больше функций, поэтому, когда вы разморозите, вам придется снова скомпилировать модель, а затем переобучить. Имейте в виду, что вам нужно проверить, какой слой вы хотите обучить, соответствует вашей проблеме.
Код для Finetune:
# Create a MirroredStrategy.
import tensorflow as tf
from tensorflow import keras
def f1_m(y_true, y_pred):
precision = precision_m(y_true, y_pred)
recall = recall_m(y_true, y_pred)
return 2*((precision*recall)/(precision+recall+K.epsilon()))
def recall_m(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
recall = true_positives / (possible_positives + K.epsilon())
adam = tf.keras.optimizers.Adam(learning_rate=0.00005, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
return recall
def precision_m(y_true, y_pred):
true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
precision = true_positives / (predicted_positives + K.epsilon())
return precision
dependencies = {
'f1_m': f1_m,
'recall_m': recall_m,
'precision_m': precision_m,
}
strategy = tf.distribute.MirroredStrategy()
print("Number of devices: {}".format(strategy.num_replicas_in_sync))
# Open a strategy scope.
with strategy.scope():
adam = tf.keras.optimizers.Adam(learning_rate=0.00005, amsgrad=True, name='Adam',)
model = keras.models.load_model('/home/xylexa/Desktop/normal_abnormal/final experiments/10000_sample/finetune/best_resnet50_finetune_10000_sample.h5', custom_objects=dependencies)
model.summary()
# Let's take a look to see how many layers are in the base model
print("Total number of layers in the Base model: ", len(model.layers))
print("Total number of layers to be Train in Base model: ",len(model.trainable_variables))
любые обновления и предложения будут оценены. :)