Разница между fit и fit_generator при выполнении трансферного обучения в керасе - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь обучить глубокую нейронную сеть, используя трансферное обучение в Керасе с тензорным потоком.Есть разные способы сделать это, если ваши данные небольшие, вы можете позволить себе вычислительные функции, используя предварительно обученную модель для всех данных, а затем использовать эти функции для обучения и тестирования небольшой сети, это хорошо, так как вам не нужнорассчитать эти функции для каждой партии и в каждой эпохе.Тем не менее, если данные большие, вычислить объекты для всех данных будет невозможно, в этом случае мы используем ImageDataGenerator, flow_from_directory и fit_generator.В этом случае функции вычисляются каждый раз перед каждой партией в каждую эпоху, что значительно замедляет работу.Я предполагал, что оба подхода дают одинаковые результаты с точки зрения точности и потерь.Проблема в том, что я взял небольшой набор данных, перепробовал оба подхода и получил совершенно разные результаты.Я буду признателен, если кто-то скажет, что что-то не так в предоставленном коде и / или почему я получаю другие результаты, пожалуйста?

Подход при большом наборе данных:

from keras.applications.inception_v3 import InceptionV3,preprocess_input
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model

datagen= ImageDataGenerator(preprocessing_function=preprocess_input)

train_generator = datagen.flow_from_directory('data/train', 
                                              class_mode='categorical',
                                              batch_size=64,...)
vaild_generator = datagen.flow_from_directory('data/valid',
                                              class_mode='categorical',
                                              batch_size=64,...)

base_model = InceptionV3(weights='imagenet', include_top=False)
x = base_model.output
x = Conv2D(filters = 128 , kernel_size = (2,2)) (x)
x = MaxPooling2D()(x)
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=predictions)

for layer in base_model.layers:
    layer.trainable = False

model.compile(optimizer='rmsprop', loss='categorical_crossentropy',...)

model.fit_generator(generator = train_generator,
                    steps_per_epoch = len (train_generator),
                    validation_data = valid_generator ,
                    validation_steps = len(valid_generator),
                    ...)

Подходпри небольшом наборе данных:

from keras.applications.inception_v3 import InceptionV3,preprocess_input
from keras.models import Sequential
from keras.utils import np_utils

base_model = InceptionV3(weights='imagenet', include_top=False)
train_features = base_model.predict(preprocess_input(train_data))
valid_features = base_model.predict(preprocess_input(valid_data))

model = Sequential()
model.add(Conv2D(filters = 128 , kernel_size = (2,2),
                 input_shape=(train_features [1],
                              train_features [2],
                              train_features [3])))
model.add(MaxPooling2D())
model.add(GlobalAveragePooling2D())
model.add(Dense(1024, activation='relu'))
model.add(Dense(2, activation='softmax'))     

model.compile(optimizer='rmsprop', loss='categorical_crossentropy',...)

model.fit(train_features, np_utils.to_categorical(y_train,2), 
          validation_data=(valid_features, np_utils.to_categorical(y_valid,2)),
          batch_size=64,...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...