Thursday, February 10, 2022

Impact of Learning Rate on Neural Network Performance

Code 0

(.env) [boris@fedora34server SPEEDLN]$ cat  learnSPD00.py

# scatter plot of blobs dataset

from sklearn.datasets import make_blobs

from matplotlib import pyplot

from numpy import where

# generate 2d classification dataset

X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

# scatter plot for each class value

for class_value in range(3):

        # select indices of points with the class label

        row_ix = where(y == class_value)

        # scatter plot for points with a different color

        pyplot.scatter(X[row_ix, 0], X[row_ix, 1])

# show plot

pyplot.show()


***************************

 Code 1

(.env) [boris@fedora34server SPEEDLN]$ cat learnSPD01.py

# study of learning rate on accuracy for blobs problem

from sklearn.datasets import make_blobs

from keras.layers import Dense

from keras.models import Sequential

# from keras.optimizers import SGD

from tensorflow.keras.optimizers import SGD

from tensorflow.keras.utils import to_categorical

from matplotlib import pyplot

# prepare train and test dataset

def prepare_data():

        # generate 2d classification dataset

        X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)

        # one hot encode output variable

        y = to_categorical(y)

        # split into train and test

        n_train = 500

        trainX, testX = X[:n_train, :], X[n_train:, :]

        trainy, testy = y[:n_train], y[n_train:]

        return trainX, trainy, testX, testy

# fit a model and plot learning curve

def fit_model(trainX, trainy, testX, testy, lrate):

        # define model

        model = Sequential()

        model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))

        model.add(Dense(3, activation='softmax'))

        # compile model

        opt = SGD(learning_rate=lrate)

        model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

        # fit model

        history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)

        # plot learning curves

        pyplot.plot(history.history['accuracy'], label='train')

        pyplot.plot(history.history['val_accuracy'], label='test')

        pyplot.title('lrate='+str(lrate), pad=-50)

# prepare dataset

trainX, trainy, testX, testy = prepare_data()

# create learning curves for different learning rates

learning_rates = [1E-0, 1E-1, 1E-2, 1E-3, 1E-4, 1E-5, 1E-6, 1E-7]

for i in range(len(learning_rates)):

        # determine the plot number

        plot_no = 420 + (i+1)

        pyplot.subplot(plot_no)

        # fit model and plot learning curves for a learning rate

        fit_model(trainX, trainy, testX, testy, learning_rates[i])

# show learning curves

pyplot.show()

**************************
Code 2

(.env) [boris@fedora34server SPEEDLN]$ cat learnSPD02.py
# study of momentum on accuracy for blobs problem
from sklearn.datasets import make_blobs
from keras.layers import Dense
from keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import to_categorical
from matplotlib import pyplot
 
# prepare train and test dataset
def prepare_data():
        # generate 2d classification dataset
        X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)
        # one hot encode output variable
        y = to_categorical(y)
        # split into train and test
        n_train = 500
        trainX, testX = X[:n_train, :], X[n_train:, :]
        trainy, testy = y[:n_train], y[n_train:]
        return trainX, trainy, testX, testy
 
# fit a model and plot learning curve
def fit_model(trainX, trainy, testX, testy, momentum):
        # define model
        model = Sequential()
        model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))
        model.add(Dense(3, activation='softmax'))
        # compile model
        opt = SGD(learning_rate=0.01, momentum=momentum)
        model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
        # fit model
        history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)
        # plot learning curves
        pyplot.plot(history.history['accuracy'], label='train')
        pyplot.plot(history.history['val_accuracy'], label='test')
        pyplot.title('momentum='+str(momentum), pad=-80)
 
# prepare dataset
trainX, trainy, testX, testy = prepare_data()
# create learning curves for different momentums
momentums = [0.0, 0.5, 0.9, 0.99]
for i in range(len(momentums)):
        # determine the plot number
        plot_no = 220 + (i+1)
        pyplot.subplot(plot_no)
        # fit model and plot learning curves for a momentum
        fit_model(trainX, trainy, testX, testy, momentums[i])
# show learning curves
pyplot.show()

*****************
Code 3

(.env) [boris@fedora34server SPEEDLN]$ cat learnSPD03.py
# study of decay rate on accuracy for blobs problem
from sklearn.datasets import make_blobs
from keras.layers import Dense
from keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import to_categorical
from matplotlib import pyplot
 
# prepare train and test dataset
def prepare_data():
        # generate 2d classification dataset
        X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)
        # one hot encode output variable
        y = to_categorical(y)
        # split into train and test
        n_train = 500
        trainX, testX = X[:n_train, :], X[n_train:, :]
        trainy, testy = y[:n_train], y[n_train:]
        return trainX, trainy, testX, testy
 
# fit a model and plot learning curve
def fit_model(trainX, trainy, testX, testy, decay):
        # define model
        model = Sequential()
        model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))
        model.add(Dense(3, activation='softmax'))
        # compile model
        opt = SGD(learning_rate=0.01, decay=decay)
        model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
        # fit model
        history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)
        # plot learning curves
        pyplot.plot(history.history['accuracy'], label='train')
        pyplot.plot(history.history['val_accuracy'], label='test')
        pyplot.title('decay='+str(decay), pad=-80)
 
# prepare dataset
trainX, trainy, testX, testy = prepare_data()
# create learning curves for different decay rates
decay_rates = [1E-1, 1E-2, 1E-3, 1E-4]
for i in range(len(decay_rates)):
        # determine the plot number
        plot_no = 220 + (i+1)
        pyplot.subplot(plot_no)
        # fit model and plot learning curves for a decay rate
        fit_model(trainX, trainy, testX, testy, decay_rates[i])
# show learning curves
pyplot.show()

*******************
Code 4

(.env) [boris@fedora34server SPEEDLN]$ cat learnSPD04.py
# study of patience for the learning rate drop schedule on the blobs problem
from sklearn.datasets import make_blobs
from keras.layers import Dense
from keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import to_categorical
from keras.callbacks import Callback
from keras.callbacks import ReduceLROnPlateau
from keras import backend
from matplotlib import pyplot
 
# monitor the learning rate
class LearningRateMonitor(Callback):
        # start of training
        def on_train_begin(self, logs={}):
                self.lrates = list()
 
        # end of each training epoch
        def on_epoch_end(self, epoch, logs={}):
                # get and store the learning rate
                optimizer = self.model.optimizer
                lrate = float(backend.get_value(self.model.optimizer.lr))
                self.lrates.append(lrate)
 
# prepare train and test dataset
def prepare_data():
        # generate 2d classification dataset
        X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)
        # one hot encode output variable
        y = to_categorical(y)
        # split into train and test
        n_train = 500
        trainX, testX = X[:n_train, :], X[n_train:, :]
        trainy, testy = y[:n_train], y[n_train:]
        return trainX, trainy, testX, testy
 
# fit a model and plot learning curve
def fit_model(trainX, trainy, testX, testy, patience):
        # define model
        model = Sequential()
        model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))
        model.add(Dense(3, activation='softmax'))
        # compile model
        opt = SGD(learning_rate=0.01)
        model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
        # fit model
        rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=patience, min_delta=1E-7)
        lrm = LearningRateMonitor()
        history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0, callbacks=[rlrp, lrm])
        return lrm.lrates, history.history['loss'], history.history['accuracy']
 
# create line plots for a series
def line_plots(patiences, series):
        for i in range(len(patiences)):
                pyplot.subplot(220 + (i+1))
                pyplot.plot(series[i])
                pyplot.title('patience='+str(patiences[i]), pad=-80)
        pyplot.show()
 
# prepare dataset
trainX, trainy, testX, testy = prepare_data()
# create learning curves for different patiences
patiences = [2, 5, 10, 15]
lr_list, loss_list, acc_list, = list(), list(), list()
for i in range(len(patiences)):
        # fit model and plot learning curves for a patience
        lr, loss, acc = fit_model(trainX, trainy, testX, testy, patiences[i])
        lr_list.append(lr)
        loss_list.append(loss)
        acc_list.append(acc)
# plot learning rates
line_plots(patiences, lr_list)
# plot loss
line_plots(patiences, loss_list)
# plot accuracy
line_plots(patiences, acc_list)

*************************
Code 5

(.env) [boris@fedora34server SPEEDLN]$ cat learnSPD05.py
# study of sgd with adaptive learning rates in the blobs problem
from sklearn.datasets import make_blobs
from keras.layers import Dense
from keras.models import Sequential
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.utils import to_categorical
from keras.callbacks import Callback
from keras import backend
from matplotlib import pyplot
 
# prepare train and test dataset
def prepare_data():
        # generate 2d classification dataset
        X, y = make_blobs(n_samples=1000, centers=3, n_features=2, cluster_std=2, random_state=2)
        # one hot encode output variable
        y = to_categorical(y)
        # split into train and test
        n_train = 500
        trainX, testX = X[:n_train, :], X[n_train:, :]
        trainy, testy = y[:n_train], y[n_train:]
        return trainX, trainy, testX, testy
 
# fit a model and plot learning curve
def fit_model(trainX, trainy, testX, testy, optimizer):
        # define model
        model = Sequential()
        model.add(Dense(50, input_dim=2, activation='relu', kernel_initializer='he_uniform'))
        model.add(Dense(3, activation='softmax'))
        # compile model
        model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
        # fit model
        history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=200, verbose=0)
        # plot learning curves
        pyplot.plot(history.history['accuracy'], label='train')
        pyplot.plot(history.history['val_accuracy'], label='test')
        pyplot.title('opt='+optimizer, pad=-80)
 
# prepare dataset
trainX, trainy, testX, testy = prepare_data()
# create learning curves for different optimizers
momentums = ['sgd', 'rmsprop', 'adagrad', 'adam']
for i in range(len(momentums)):
        # determine the plot number
        plot_no = 220 + (i+1)
        pyplot.subplot(plot_no)
        # fit model and plot learning curves for an optimizer
        fit_model(trainX, trainy, testX, testy, momentums[i])
# show learning curves
pyplot.show()

References



No comments:

Post a Comment