Exemple #1
0
def train(model_name: str, name: str = "nofolds") -> None:
    """ Loads model from file and trains it. """
    model = keras.models.load_model(model_name)
    model.summary()

    map3 = Map3Metric(x_val, y_val, name)
    # early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss',
    #                     min_delta=0.01, patience=10, verbose=1)
    lr_shed = keras.callbacks.LearningRateScheduler(cyclic_lr, verbose=1)
    # time_stopping = TimedStopping(timeout=15*60*60, verbose=1)

    datagen = keras.preprocessing.image.ImageDataGenerator(
        width_shift_range=
        0,  # randomly shift images horizontally (fraction of total width)
        horizontal_flip=False,  # randomly flip images
        preprocessing_function=get_random_eraser(
            v_l=np.min(x_train), v_h=np.max(x_train))  # random eraser
    )

    datagen = MixupGenerator(x_train,
                             y_train,
                             alpha=1.0,
                             batch_size=BATCH_SIZE,
                             datagen=datagen)
    # datagen = AugGenerator(x_train, y_train, alpha=1.0, batch_size=BATCH_SIZE,
    #                           datagen=None, shuffle=False)

    model.fit_generator(datagen,
                        epochs=NUM_EPOCHS,
                        verbose=1,
                        validation_data=[x_val, y_val],
                        use_multiprocessing=True,
                        workers=12,
                        callbacks=[map3, lr_shed])

    print("best MAP@3 value: %.04f at epoch %d" %
          (map3.best_map3, map3.best_epoch))
Exemple #2
0
def train_model(params: Dict[str, Any], name: str ="nofolds") -> float:
    """ Creates model and trains it. Returns MAP@3 metric. """
    print("training with params", params)

    shift           = float(params["shift"])
    flip            = bool(params["flip"])
    erase           = bool(params["erase"])
    alpha           = float(params["alpha"])
    mixup           = bool(params["mixup"])

    x = inp = keras.layers.Input(shape=x_train.shape[1:])
    x = keras.layers.Reshape((x_train.shape[1], x_train.shape[2], 1))(x)

    x = keras.layers.Convolution2D(32, (4, 10), padding="same")(x)
    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)
    x = keras.layers.MaxPool2D()(x)

    x = keras.layers.Convolution2D(32, (4, 10), padding="same")(x)
    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)
    x = keras.layers.MaxPool2D()(x)

    x = keras.layers.Convolution2D(32, (4, 10), padding="same")(x)
    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)
    x = keras.layers.MaxPool2D()(x)

    x = keras.layers.Convolution2D(32, (4, 10), padding="same")(x)
    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)
    x = keras.layers.MaxPool2D()(x)
    x = keras.layers.Flatten()(x)

    x = keras.layers.Dense(64)(x)
    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)

    out = keras.layers.Dense(NUM_CLASSES, activation="softmax")(x)

    model = keras.models.Model(inputs=inp, outputs=out)
    model.summary()

    model.compile(loss="categorical_crossentropy", optimizer="adam",
                  metrics=["accuracy"])

    map3 = Map3Metric(x_val, y_val, name)
    reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss',
                    factor=0.33, patience=7, verbose=1, min_lr=3e-6)

    datagen = keras.preprocessing.image.ImageDataGenerator(
        width_shift_range=shift, # 0.4,  # randomly shift images horizontally (fraction of total width)
        horizontal_flip=flip,   # randomly flip images
        preprocessing_function=
            # random eraser
            get_random_eraser(v_l=np.min(x_train), v_h=np.max(x_train)) if erase else None
    )

    if mixup:
        mixupgen = MixupGenerator(x_train, y_train, alpha=alpha,
                                  batch_size=BATCH_SIZE, datagen=datagen)
    else:
        mixupgen = AugGenerator(x_train, y_train, alpha=alpha,
                                batch_size=BATCH_SIZE, datagen=datagen)

    model.fit_generator(mixupgen,
                        epochs=NUM_EPOCHS, verbose=1,
                        validation_data=[x_val, y_val],
                        use_multiprocessing=True, workers=12,
                        callbacks=[map3, reduce_lr])

    print("best MAP@3 value: %.04f at epoch %d" % (map3.best_map3, map3.best_epoch))
    return map3.best_map3
Exemple #3
0
def train_model(params: Dict[str, Any], name: str ="nofolds") -> float:
    """ Creates model and trains it. Returns MAP@3 metric. """
    cnn_dropout     = float(params["cnn_dropout"])
    dropout_coeff   = float(params["dropout_coeff"])
    reg_coeff       = float(params["reg_coeff"])
    reg_coeff2      = reg_coeff
    conv_depth      = 27 # int(params["conv_depth"])
    num_hidden      = int(params["num_hidden"])
    conv_width      = 4 # int(params["conv_width"])
    conv_height     = 6 # int(params["conv_height"])
    conv_count      = 4 # int(params["conv_count"])

    # TODO: search for the best pooling size

    shift           = float(params["shift"])
    flip            = False # bool(params["flip"])
    erase           = bool(params["erase"])
    alpha           = float(params["alpha"])
    mixup           = True # bool(params["mixup"])

    print("training with params", params)

    reg = keras.regularizers.l2(10 ** reg_coeff)
    reg2 = keras.regularizers.l2(10 ** reg_coeff2)

    x = inp = keras.layers.Input(shape=x_train.shape[1:])
    x = keras.layers.Reshape((x_train.shape[1], x_train.shape[2], 1))(x)

    for _ in range(conv_count):
        x = keras.layers.Convolution2D(conv_depth, (conv_width, conv_height),
                                       padding="same")(x)
        x = keras.layers.BatchNormalization()(x)
        x = keras.layers.Activation("relu")(x)
        x = keras.layers.MaxPool2D()(x)

        if cnn_dropout > 0.001:
            x = keras.layers.Dropout(cnn_dropout)(x)

    x = keras.layers.Flatten()(x)
    x = keras.layers.Dense(num_hidden,
                           kernel_regularizer=reg,
                           bias_regularizer=reg,
                           activity_regularizer=reg,
                           )(x)

    if dropout_coeff > 0.001:
        x = keras.layers.Dropout(dropout_coeff)(x)

    x = keras.layers.BatchNormalization()(x)
    x = keras.layers.Activation("relu")(x)

    out = keras.layers.Dense(NUM_CLASSES,
                             kernel_regularizer=reg2,
                             bias_regularizer=reg2,
                             activity_regularizer=reg2,
                             activation="softmax")(x)

    model = keras.models.Model(inputs=inp, outputs=out)
    model.summary()

    model.compile(loss="categorical_crossentropy", optimizer="adam",
                  metrics=["accuracy"])

    map3 = Map3Metric(x_val, y_val, name)
    reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss',
                    factor=0.33, patience=7, verbose=1, min_lr=3e-6)

    datagen = keras.preprocessing.image.ImageDataGenerator(
        width_shift_range=shift, # 0.4,  # randomly shift images horizontally (fraction of total width)
        horizontal_flip=flip,   # randomly flip images
        preprocessing_function=
            # random eraser
            get_random_eraser(v_l=np.min(x_train), v_h=np.max(x_train)) if erase else None
    )

    if mixup:
        mixupgen = MixupGenerator(x_train, y_train, alpha=alpha,
                                  batch_size=BATCH_SIZE, datagen=datagen)
    else:
        mixupgen = AugGenerator(x_train, y_train, alpha=alpha,
                                batch_size=BATCH_SIZE, datagen=datagen)

    model.fit_generator(mixupgen,
                        epochs=NUM_EPOCHS, verbose=1,
                        validation_data=[x_val, y_val],
                        use_multiprocessing=True, workers=12,
                        callbacks=[map3, reduce_lr])

    print("best MAP@3 value: %.04f at epoch %d" % (map3.best_map3,
                                                   map3.best_epoch + 1))
    return map3.best_map3
def train_model_with_params(params: Dict[str, str],
                            name: str = "nofolds") -> float:
    """ Creates model with given parameters. """
    print("training with params", params)

    batch_size = int(params["batch_size"])
    num_hidden = int(params["num_hidden"])
    num_fc_layers = int(params["num_fc_layers"])
    num_conv_layers = int(params["num_conv_layers"])
    conv_depth = int(params["conv_depth"])
    conv_depth_mul = float(params["conv_depth_mul"])
    conv_width = int(params["conv_width"])
    conv_height = int(params["conv_height"])
    pooling_size = int(params["pooling_size"])
    pooling_type = params["pooling_type"]
    dropout_coeff = float(params["dropout_coeff"])
    reg_coeff = float(params["reg_coeff"])
    residuals = ""  # params["residuals"]

    shift = float(params["shift"])
    flip = bool(params["flip"])
    erase = False  # bool(params["erase"])
    alpha = float(params["alpha"])

    if residuals is not "":
        conv_depth_mul = 1

    fc_bias_reg = fc_activity_reg = fc_kernel_reg = make_reg(reg_coeff)

    print("x_train:", x_train.shape)
    x = inp = keras.layers.Input(shape=x_train.shape[1:])
    # x = keras.layers.Reshape((x_train.shape[1], x_train.shape[2], 1))(x)

    w, h = x_train.shape[1], x_train.shape[2]
    conv_layers = []

    for L in range(num_conv_layers):
        if pooling_type.startswith("local"):
            w, h = (w + 1) / pooling_size, (h + 1) / pooling_size
            if w < 2 or h < 2:
                break

        conv_layers.append(x)
        if L % 2 == 0:
            prev = x

        d = min(int(conv_depth * (conv_depth_mul**L)), 100)
        x = keras.layers.Convolution2D(d, (conv_width, conv_height),
                                       padding="same")(x)
        x = keras.layers.BatchNormalization()(x)

        if pooling_type.startswith("global"):
            if residuals == "resnet" and L % 2 == 1:
                x = keras.layers.Add()([prev, x])
            elif residuals == "densenet":
                # print("conv_layers", conv_layers)
                x = keras.layers.Add()(conv_layers + [x])

        x = keras.layers.Activation("relu")(x)

        if pooling_type == "local_max":
            x = keras.layers.MaxPooling2D((pooling_size, pooling_size))(x)
        elif pooling_type == "local_avg":
            x = keras.layers.AveragePooling2D((pooling_size, pooling_size))(x)

    if pooling_type == "global_max":
        x = keras.layers.GlobalMaxPooling2D()(x)
    elif pooling_type == "global_avg":
        x = keras.layers.GlobalAveragePooling2D()(x)
    else:
        x = keras.layers.Flatten()(x)

    for _ in range(num_fc_layers):
        x = keras.layers.Dense(num_hidden,
                               kernel_regularizer=fc_kernel_reg,
                               bias_regularizer=fc_bias_reg,
                               activity_regularizer=fc_activity_reg)(x)
        x = keras.layers.Dropout(dropout_coeff)(x)
        x = keras.layers.BatchNormalization()(x)
        x = keras.layers.Activation("relu")(x)

    out = keras.layers.Dense(NUM_CLASSES,
                             kernel_regularizer=fc_kernel_reg,
                             bias_regularizer=fc_bias_reg,
                             activity_regularizer=fc_activity_reg,
                             activation="softmax")(x)

    model = keras.models.Model(inputs=inp, outputs=out)
    model.summary()

    model.compile(loss="categorical_crossentropy",
                  optimizer="adam",
                  metrics=["accuracy"])

    if model.count_params() >= 4 * 10**6:
        return 0.5

    map3 = Map3Metric(x_val, y_val, name)
    # early_stopping = keras.callbacks.EarlyStopping(monitor='val_loss',
    #                     min_delta=0.01, patience=10, verbose=1)
    lr_shed = keras.callbacks.LearningRateScheduler(cyclic_lr, verbose=1)
    time_stopping = TimedStopping(timeout=15 * 60 * 60, verbose=1)

    datagen = keras.preprocessing.image.ImageDataGenerator(
        width_shift_range=
        shift,  # 0.4,  # randomly shift images horizontally (fraction of total width)
        horizontal_flip=flip,  # randomly flip images
        preprocessing_function=get_random_eraser(v_l=np.min(x_train),
                                                 v_h=np.max(x_train))
        if erase else None  # random eraser
    )
    mixupgen = MixupGenerator(x_train,
                              y_train,
                              alpha=alpha,
                              batch_size=batch_size,
                              datagen=datagen)

    model.fit_generator(mixupgen,
                        epochs=NUM_EPOCHS,
                        verbose=1,
                        validation_data=[x_val, y_val],
                        use_multiprocessing=True,
                        workers=12,
                        callbacks=[map3, lr_shed, time_stopping])

    print("best MAP@3 value: %.04f at epoch %d" %
          (map3.best_map3, map3.best_epoch))
    return map3.last_map3