Exemple #1
0
def find_lr(data_index):
    D = AutoSpeechDataset(
        os.path.join(
            r"/home/chengfeng/autospeech/data/data0{}".format(data_index),
            'data0{}.data'.format(data_index)))
    D.read_dataset()
    metadata = D.get_metadata()
    x_train, y_train = D.get_train()
    my_model = CrnnModel()
    x_train = my_model.preprocess_data(x_train)
    log(f'x_train shape: {x_train.shape}; y_train shape: {y_train.shape}')
    y_train = ohe2cat(y_train)
    my_model.init_model(input_shape=x_train.shape[1:],
                        num_classes=metadata[CLASS_NUM])

    lr_finder = LRFinder(my_model._model)
    lr_finder.find(x_train,
                   y_train,
                   start_lr=0.0001,
                   end_lr=1,
                   batch_size=64,
                   epochs=200)

    # Plot the loss, ignore 20 batches in the beginning and 5 in the end
    lr_finder.plot_loss(n_skip_beginning=20, n_skip_end=5)

    lr_finder.plot_loss_change(sma=20,
                               n_skip_beginning=20,
                               n_skip_end=5,
                               y_lim=(-0.01, 0.01))
Exemple #2
0
def plot_lr(model, X_train, y_train):
    """
    Plots learning rate vs loss for model on training set.
    :param model: Keras model to find learning rate of.
    :param X_train: Training data.
    :param y_train: Training labels.
    """
    lr_finder = LRFinder(model)
    # Adam default LR = 0.001
    lr_finder.find(X_train, y_train, start_lr=0.0001, end_lr=1)
    lr_finder.plot_loss()
    plt.show()
Exemple #3
0
    'similarity_pred': 'binary_crossentropy',
    'final_pred': 'categorical_crossentropy'
}

metrics = {'similarity': 'accuracy', 'final_pred': 'accuracy'}

siamese_model_full.compile(optimizer="adagrad", loss=losses, metrics=metrics)

# In[ ]:

from keras_lr_finder import LRFinder
from math import ceil

training_steps = ceil(4825 / 8)

lr_finder = LRFinder(siamese_model_full)
lr_finder.find_generator(train_gen(),
                         0.00001,
                         1,
                         epochs=5,
                         steps_per_epoch=training_steps)

# In[ ]:

from keras.callbacks import ModelCheckpoint, EarlyStopping
from math import ceil

training_steps = ceil(4825 / 8)
validation_steps = ceil(603 / 8)
pre_file_path = "siamese-classifier-"
post_file_path = "--{epoch:02d}-{val_loss:.2f}.hdf5"
Exemple #4
0
# 'x' is the array of input variables, 'y' is the q/pT
x_train, x_test, y_train, y_test, w_train, w_test, x_mask_train, x_mask_test, x_road_train, x_road_test = \
      muon_data_split(infile_muon, reg_pt_scale=reg_pt_scale, test_size=0.31)

## Use ShuffleSplit as the CV iterator
#from nn_data import muon_data
#from sklearn.model_selection import ShuffleSplit
#x, y, w, x_mask, x_road = muon_data(infile_muon, reg_pt_scale=reg_pt_scale, correct_for_eta=False)
#cv = ShuffleSplit(n_splits=1, test_size=0.31)

# ______________________________________________________________________________
# Create LRFinder

from keras_lr_finder import LRFinder
epochs = 20
batch_size = 4096

model = create_model_sequential_bn2(nvariables=nvariables, lr=learning_rate, clipnorm=gradient_clip_norm,
                                    l1_reg=l1_reg, l2_reg=l2_reg,
                                    nodes1=30, nodes2=25, nodes3=20)

lr_finder = LRFinder(model)
lr_finder.find(x_train, y_train, 0.0001, 1, batch_size=batch_size, epochs=epochs)
print len(lr_finder.lrs)

#lr_finder.plot_loss(n_skip_beginning=100, n_skip_end=50)

#lr_finder.plot_loss_change(sma=100, n_skip_beginning=100, n_skip_end=50, y_lim=(-0.1, 0.1))

logger.info('DONE')
]
# Set containers for tests
test_learning_rates = []
test_losses = []
test_loss_changes = []
labels = []
# Perform each test
for test_optimizer, label in tests:

  # Compile the model
  model.compile(loss=loss_function,
                optimizer=test_optimizer,
                metrics=['accuracy'])

  # Instantiate the Learning Rate Range Test / LR Finder
  lr_finder = LRFinder(model)

  # Perform the Learning Rate Range Test
  outputs = lr_finder.find(X_train, y_train, start_lr=start_lr, end_lr=end_lr, batch_size=batch_size, epochs=no_epochs)

  # Get values
  learning_rates  = lr_finder.lrs
  losses          = lr_finder.losses
  loss_changes = []

  # Compute smoothed loss changes
  # Inspired by Keras LR Finder: https://github.com/surmenok/keras_lr_finder/blob/master/keras_lr_finder/lr_finder.py
  for i in range(moving_average, len(learning_rates)):
    loss_changes.append((losses[i] - losses[i - moving_average]) / moving_average)

  # Append values to container
Exemple #6
0
model.add(Dense(1))
model.compile(loss="mean_squared_error",
              optimizer="adam",
              metrics=["mean_absolute_error"])


#model.fit(x_train, y_train, epochs=0)
#custom callback to print learning rate
class MyCallback(callbacks.Callback):
    def on_epoch_end(self, epoch, logs=None):
        print(K.eval(self.model.optimizer.lr))


#learning rate search
# model is a Keras model
lr_finder = LRFinder(model)

#searches learning rates from 0.00001 to 1 and plots loss
lr_finder.find(x_train,
               y_train,
               start_lr=0.00001,
               end_lr=1,
               batch_size=64,
               epochs=20)
lr_finder.plot_loss()

#gets a region to zoom in on
min_lr = float(input("Enter the lowest learning rate to show    "))
max_lr = float(input("Enter the highest learning rate to show    "))

#same again but with the new region
                                                 decay=0.0,
                                                 nesterov=False),
                  loss="MSE",
                  metrics=["MAE", "MSE"])
    lrate = keras.callbacks.LearningRateScheduler(step_decay, verbose=1)
    callbacks = [check_point, early_stopping, tbCallBack, lrate]
elif config.optimizer == "Adam" or config.optimizer == "adam":
    model.compile(optimizer="Adam", loss="MSE", metrics=["MAE", "MSE"])
    callbacks = [check_point, early_stopping, tbCallBack]
else:
    raise

while config.batch_size > 1:
    # To find a largest batch size that can be fit into GPU
    try:
        lr_finder = LRFinder(model)
        lr_finder.find_generator(
            generate_pair(x_train, config.batch_size, status="train"),
            start_lr=0.00001,
            end_lr=2,
            epochs=5,
            steps_per_epoch=x_train.shape[0] // config.batch_size,
        )
        print("\n\nBest learning rate = {}".format(
            lr_finder.get_best_lr(sma=20)))
        K.set_value(model.optimizer.lr, lr_finder.get_best_lr(sma=20))

        model.fit_generator(
            generate_pair(x_train, config.batch_size, status="train"),
            validation_data=generate_pair(x_valid,
                                          config.batch_size,
Exemple #8
0
    def train(self, train_data, devtest_data):
        train_data.extend(devtest_data)
        # x_train = [np.asarray(x[1].split()) for x in train_data]
        x_train = [x[1] for x in train_data]
        y_train = [x[0] for x in train_data]
        y_train = np.asarray(y_train)
        # finally, vectorize the text samples into a 2D integer tensor
        self.tokenizer = Tokenizer(num_words=MAX_NUM_WORDS, char_level=False)
        self.tokenizer.fit_on_texts(x_train)
        sequences = self.tokenizer.texts_to_sequences(x_train)
        word_index = self.tokenizer.word_index
        print('Found %s unique tokens.' % len(word_index))
        data = pad_sequences(sequences, maxlen=MAX_SEQUENCE_LENGTH)

        indices = np.arange(data.shape[0])
        np.random.shuffle(indices)
        data = data[indices]
        labels = y_train[indices]
        num_validation_samples = int(VALIDATION_SPLIT * data.shape[0])

        x_train = data[:-num_validation_samples]
        y_train = labels[:-num_validation_samples]
        x_val = data[-num_validation_samples:]
        y_val = labels[-num_validation_samples:]

        # prepare embedding matrix
        num_words = min(MAX_NUM_WORDS, len(word_index) + 1)
        embedding_matrix = np.zeros((num_words, EMBEDDING_DIM))
        for word, i in word_index.items():
            # print(i)
            # print(word)
            if i >= MAX_NUM_WORDS:
                continue
            embedding_vector = self.embeddings_index.get(word)
            # print(embedding_vector)
            if embedding_vector is not None:
                # words not found in embedding index will be all-zeros.
                embedding_matrix[i] = embedding_vector
        # load pre-trained word embeddings into an Embedding layer
        # note that we set trainable = False so as to keep the embeddings fixed
        embedding_layer = Embedding(num_words,
                                    EMBEDDING_DIM,
                                    weights=[embedding_matrix],
                                    input_length=MAX_SEQUENCE_LENGTH,
                                    trainable=False)

        print('Training model.')

        # train a 1D convnet with global maxpooling
        sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH, ), dtype='int32')
        embedded_sequences = embedding_layer(sequence_input)
        x = Conv1D(256, 5, activation='relu')(embedded_sequences)
        x = GlobalMaxPooling1D()(x)
        x = Dense(256, activation='relu')(x)
        x = Dropout(rate=0.5)(x)
        preds = Dense(1, activation='sigmoid')(x)

        self.model = Model(sequence_input, preds)
        self.model.compile(loss='binary_crossentropy',
                           optimizer='adam',
                           metrics=['accuracy'])

        plot_model(self.model, to_file='model.png')

        self.model.summary()

        self.model_output_dir = os.path.join(
            'models', datetime.strftime(datetime.now(), "%Y-%m-%d_%H-%M-%S"))

        filepath = os.path.join(
            self.model_output_dir,
            "weights-improvement-{epoch:02d}-{val_loss:.4f}.hdf5")

        checkpoint = ModelCheckpoint(filepath,
                                     monitor='val_loss',
                                     verbose=1,
                                     save_best_only=True,
                                     mode='min')

        early_stopping = EarlyStopping(monitor='val_loss',
                                       min_delta=0.0001,
                                       patience=3,
                                       verbose=0,
                                       mode='auto')

        prtensorboard_dir = os.path.join(self.model_output_dir,
                                         'pr_tensorboard_logs')
        lr_finder = LRFinder(min_lr=1e-5,
                             max_lr=1e-2,
                             steps_per_epoch=np.ceil(x_train.shape[0] /
                                                     BATCH_SIZE),
                             epochs=10)

        self.model.fit(x_train,
                       y_train,
                       batch_size=BATCH_SIZE,
                       epochs=10,
                       callbacks=[
                           checkpoint, early_stopping,
                           PRTensorBoard(log_dir=prtensorboard_dir), lr_finder
                       ],
                       validation_data=(x_val, y_val))

        lr_finder.plot_loss()