Я пытаюсь обучить глубокую нейронную сеть, используя трансферное обучение в Керасе с тензорным потоком.Есть разные способы сделать это, если ваши данные небольшие, вы можете позволить себе вычислительные функции, используя предварительно обученную модель для всех данных, а затем использовать эти функции для обучения и тестирования небольшой сети, это хорошо, так как вам не нужнорассчитать эти функции для каждой партии и в каждой эпохе.Тем не менее, если данные большие, вычислить объекты для всех данных будет невозможно, в этом случае мы используем 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,...)