def get_accuracy_iterator(mod, Xdatagen, k=1): acc = 0 npoints = 0 for i in range(len(Xdatagen)): Xfr, yfr = next(Xdatagen) ypred = mod.predict(Xfr) npoints += len(yfr) acc += np.sum(top_k_categorical_accuracy(yfr, ypred, k=k)) del Xfr del yfr del ypred gc.collect() return acc / npoints
batch_size=train_batch_size) valid_batches = ImageDataGenerator( preprocessing_function= tensorflow.keras.applications.xception.preprocess_input).flow_from_directory( valid_path, target_size=(image_size, image_size), batch_size=val_batch_size) # Train the model # Define Top2 and Top3 Accuracy from tensorflow.keras.metrics import categorical_accuracy, top_k_categorical_accuracy def top_3_accuracy(y_true, y_pred) return top_k_categorical_accuracy(y_true, y_pred, k=3) def top_2_accuracy(y_true, y_pred) return top_k_categorical_accuracy(y_true, y_pred, k=2) # Compile the model model.compile(Adam(lr=0.01), loss='categorical_crossentropy', metrics=[categorical_accuracy, top_2_accuracy, top_3_accuracy]) # Add weights to make the model more sensitive to melanoma # Declare the filepath for the saved model filepath = model_xception_crop.h5 # Declare a checkpoint to save the best version of the model checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_best_only=True, mode='min')
def top_2_accuracy(y_true, y_pred): """Calculate Top2 Accuracy return: Top2 accuracy """ return top_k_categorical_accuracy(y_true, y_pred, k=2)
def top_3_accuracy(y_true, y_pred): """Calculate Top3 Accuracy return: top3 accuracy """ return top_k_categorical_accuracy(y_true, y_pred, k=3)
def top3_accuracy(y, predic): return metrics.top_k_categorical_accuracy(y, predic, k=3)
def top_2_accuracy(x, y): return top_k_categorical_accuracy(x, y, k=2)
def top_5_accuracy(x, y): return top_k_categorical_accuracy(x, y, 5) def create_model_fn(params, is_optimizer_adam=True):
def top_3_accuracy(x, y): t3 = top_k_categorical_accuracy(x, y, 3) return t3
def top_5_categorical_error(y_true, y_pred): return 1.0 - metrics.top_k_categorical_accuracy(y_true, y_pred, 5)
def top_1_categorical_accuracy(y_true, y_pred): s = K.prod(K.shape(y_true)[1:]) y_true = K.reshape(y_true, [-1, s]) y_pred = K.reshape(y_pred, [-1, s]) return metrics.top_k_categorical_accuracy(y_true, y_pred, k=1)
def train_model_with_augmentations(model, datagen, X_test, Y_test, epochs=100, batch_size=256, batches_per_epoch=4, patience=15, savename="model.h5"): """ Train the model until it can not be trained anymore! """ train_loss = [] valid_loss = [] train_top1_acc = [] valid_top1_acc = [] train_top5_acc = [] valid_top5_acc = [] down_rounds = 0 best_loss = np.inf Y_test_cat = to_categorical(Y_test) # Create a data flow data_flow = datagen.flow(X_train, Y_train, batch_size=batch_size, shuffle=True) for epoch in range(epochs): batch_loss = [] batch_top1 = [] batch_top5 = [] for batch in range(batches_per_epoch): X_batch, Y_batch = next(data_flow) step_loss = model.train_on_batch(X_batch, Y_batch) batch_loss.append(step_loss) batch_top1.append( np.mean( top_k_categorical_accuracy(Y_batch, model.predict(X_batch), k=1))) batch_top5.append( np.mean( top_k_categorical_accuracy(Y_batch, model.predict(X_batch), k=5))) # End of epoch logging Y_pred = model.predict(X_test) valid_top1_acc.append( np.mean( top_k_categorical_accuracy(Y_test_cat, model.predict(X_test), k=1))) valid_top5_acc.append( np.mean( top_k_categorical_accuracy(Y_test_cat, model.predict(X_test), k=5))) train_top1_acc.append(np.mean(batch_top1)) train_top5_acc.append(np.mean(batch_top5)) train_loss.append(np.mean(batch_loss)) valid_loss.append(model.evaluate(X_test, Y_test_cat)) # Model checkpoint and early stopping. if valid_loss[epoch] < best_loss: best_loss = valid_loss[epoch] down_rounds = 0 model.save(savename) print( "[New Best] Epoch {0}, Training Loss: {1:8.4f}, Testing Loss: {2:8.4f}, Training Top-1: {3:8.4f}, Testing Top-1: {4:8.4f}" .format(epoch, train_loss[epoch], valid_loss[epoch], train_top1_acc[epoch], valid_top1_acc[epoch])) else: down_rounds += 1 if down_rounds >= patience: print("Earlying stopping at epoch {}.".format(epoch)) break return train_loss, valid_loss, train_top1_acc, valid_top1_acc, train_top5_acc, valid_top5_acc
def top_3_accuracy(y_test, y_pred): return top_k_categorical_accuracy(y_test, y_pred, k=3)
def top_n_categorical_accuracy(y_pred, y_label): return metrics.top_k_categorical_accuracy(y_pred, y_label, k=TOP_N)
def top_3_metrics(y_true, y_pred): return top_k_categorical_accuracy(y_true, y_pred, k=3)
def top_5_accuracy(self, y_true, y_pred): y_true = y_true[:, :self.num_class] y_pred = y_pred[:, :self.num_class] return top_k_categorical_accuracy(y_true, y_pred)
def top_2_accuracy(y_true, y_pred): return top_k_categorical_accuracy(y_true, y_pred, k=2)
def top_5_accuracy(self, y_true, y_pred): return top_k_categorical_accuracy(y_true, y_pred, k=5)
def top_50_accuracy(y_true,y_pred): return metrics.top_k_categorical_accuracy(y_true,y_pred,k=50)
def top_2_accuracy(in_gt, in_pred): return top_k_categorical_accuracy(in_gt, in_pred, k=2)