Применять шаги также к данным проверки или только к данным обучения? - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с классификацией изображений, и я хочу использовать предварительно обученную модель EfficicentNetB0 (приложения keras: https://keras.io/api/applications/efficientnet/#efficientnetb0 -функция и бумага: https://arxiv.org/abs/1905.11946) с весами из Представьте eNet для этой проблемы классификации.

Я загрузил и импортировал модель и ее вес следующим образом:

!pip install git+https://github.com/qubvel/segmentation_models
import efficientnet.keras as efn
efnB0_model = efn.EfficientNetB0(include_top=False, weights="imagenet", input_shape=(224, 224, 3))
efnB0_model.trainable = False

Я не буду включать верхнюю часть этой модели, потому что она не соответствует проблеме, которую я анализирую, поэтому я установил include_top на False. Более того, я не хочу обучать параметры Efficien tNet, поэтому efnB0_model.trainable = False.

Теперь я хотел бы применить efnB0_model к обучающим данным X_train один раз ( нет необходимости делать это более одного раза, потому что веса уже есть и не должны быть изменены) и заморозить все эти нижние слои впоследствии.

Поэтому я создал DataGenerator_X.

class DataGenerator_X(Sequence):

    def __init__(self, x_set, batch_size):
        self.x = x_set
        self.batch_size = batch_size

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def __getitem__(self, idx):
        batch_x = self.x[idx*self.batch_size : (idx + 1)*self.batch_size]
        batch_x = [imread(file_name) for file_name in batch_x]
        batch_x = np.array(batch_x)
        batch_x = batch_x * 1./255
        

        return batch_x

Этот DataGenerator_X создает пакеты и делит их на 255 (что предпочитает Efficicen tNet).

После этого я применяю этот DataGenerator_X к X_train (который является file_path к мои изображения).

training_generator = DataGenerator_X(X_train, batch_size=32)

И затем я предсказываю значения X_train после запуска на них нижней части модели Efficien tNet -B0 (X_after_efn), чтобы не делать этого. каждую эпоху снова, потому что все нижние слои модели заморожены. Я делаю это с помощью этого кода:

X_after_efn_train = efnB0_model.predict(training_generator, verbose=1)

Мне интересно, нужно ли мне применить все эти шаги и к данным проверки? Итак, мне также нужно создать validation_generator и X_after_efn_val?

1 Ответ

2 голосов
/ 14 июля 2020

Короче да. Вам нужно будет создать validation_generator, а затем запустить на нем efnB0_model.predict().

Основная причина этого в том, что функция predict() принимает только один набор входных выборок (проверьте входные x по методу predict https://keras.io/api/models/model_training_apis/#predict -метод ).

С другой стороны, это не так уж и много работы, так как вы можете использовать тот же генератор.

val_generator = DataGenerator_X(X_val, batch_size=32)
X_after_efn_val = efnB0_model.predict(val_generator, verbose=1)

Вы также можете проверить часть этого блога, посвященную использованию узких мест. Они делают нечто подобное. https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html

...