nb_classes = 1 # number of classes
based_model_last_block_layer_number = 126 # value is based on based model
selected.
img_width, img_height = 299, 299 # change based on the shape/structure of
your images
batch_size = 3 # try 4, 8, 16, 32, 64, 128, 256 dependent on CPU/GPU memory
capacity (powers of 2 values).
nb_epoch = 100 # number of iteration the algorithm gets trained.
learn_rate = 1e-4 # sgd learning rate
momentum = .9 # sgd momentum to avoid local minimum
transformation_ratio = .05 # how aggressive will be the data
augmentation/transformation
train_datagen = ImageDataGenerator(rescale=1. / 255,
rotation_range=transformation_ratio,
shear_range=transformation_ratio,
zoom_range=transformation_ratio,
cval=transformation_ratio,
horizontal_flip=True,
vertical_flip=True)
validation_datagen = ImageDataGenerator(rescale=1. / 255)
os.makedirs(os.path.join(os.path.abspath(train_data_dir), '../preview'), exist_ok=True)
train_generator = train_datagen.flow_from_directory(train_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
validation_generator = validation_datagen.flow_from_directory(validation_data_dir,
target_size=(img_width, img_height),
batch_size=batch_size,
class_mode='binary')
# Optimizer
sgd = SGD(lr=learn_rate, decay=1e-6, momentum=momentum, nesterov=True)
class_weightage = class_weight.compute_class_weight('balanced', np.unique(train_generator.classes),
train_generator.classes)
class_weightage = {0: class_weightage[0], 1: class_weightage[1]}
print(class_weightage)
model.compile(optimizer=sgd,
loss='binary_crossentropy',
metrics=['binary_accuracy'])
final_weights_path = os.path.join(os.path.abspath(model_path), 'model_weights.h5')
callbacks_list = [
ModelCheckpoint(final_weights_path, monitor='val_binary_accuracy', verbose=1, save_best_only=True),
EarlyStopping(monitor='val_binary_accuracy', patience=5, verbose=0),
TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
]
# fine-tune the model
history = model.fit_generator(train_generator,
epochs=nb_epoch,
validation_data=validation_generator,
class_weight=class_weightage,
callbacks=callbacks_list)
Это код, который я использую для обучения своей модели XCeption, инициализированный с помощью весов imagenet, а ниже - код, который я использую для прогнозирования классов
def local_load_image(image_file):
img = image.load_img(image_file, target_size=(299, 299))
image_array = image.img_to_array(img)
image_array = preprocess_input(np.expand_dims(image_array, axis=0))
return image_array
prediction = model.predict(
local_load_image(path_to_image)
)
Выходные прогнозы всегда 1 независимо от того, что я делаю. Я пытаюсь классифицировать простой набор двоичных данных (собаки против кошек), но безуспешно. Я сделал все слои обучаемыми, потому что слои BN мешают обучению и предсказанию. Я также пытался использовать другие архитектуры, такие как VGG16 и ResNet. Я пытался бороться с переобучением с помощью class_weights и снизить скорость обучения до 1e-4.
Я понятия не имею, почему моя модель не может тренироваться на чем-либо, и просто предсказывает все как одно и то же.
После 11 эпох я смог достичь этого
12269/12269 [==============================] - 5983s 488ms/step - loss: 0.4465 - binary_accuracy: 0.8106 val_loss: 0.4395 - val_binary_accuracy: 0.8107
но все предсказания все равно терпят неудачу. Любая помощь будет принята с благодарностью!