У меня проблема с классификацией изображений, и я хочу использовать предварительно обученную модель 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
?