Monday, June 27, 2022

General PCA processes

Анализ основных компонентов (PCA) — это один из наиболее часто используемых алгоритмов машинного обучения без учителя в различных приложениях: исследовательский анализ данных, уменьшение размерности, сжатие информации, удаление шума из данных и многое другое

 Общие процессы PCA:

1.PCA находит новое начало данных, взяв среднее значение горизонтального и вертикального диапазона всех точек данных (обратите внимание, что PCA проецирует данные на 2D-плоскость).

2.PCA устанавливает новую ось (называемую первой главной составляющей), которая максимизирует инерцию (дисперсию) всех точек данных. Другими словами, эта новая линия или ось имеет наибольшее комбинированное расстояние от точек данных (сумму квадратов расстояний можно найти по теореме Пифагора).

3.PCA устанавливает последующую ось ортогонально первой, а также максимизирует оставшуюся инерцию.

=================================================

Карты PCA и их интерпретации:

После проецирования всех точек данных на новую плоскость PCA исследует отношения в данных как между наблюдениями (строки), так и между переменными (столбцы). Используя различную интерпретацию, основные компоненты помогают объяснить эти отношения.

Карта наблюдений PCA называется факторными оценками. Мы можем интерпретировать карту оценок факторов, оценивая расстояния между точками данных строки, используя такие методы, как поиск средних значений группы, интервалы допуска, интервалы начальной загрузки и кластеризацию. Расстояние между точками представляет собой сходство между ними, точки, расположенные близко друг к другу, являются окрестностями с аналогичными профилями, а точки, расположенные далеко друг от друга, имеют разные профили.

Карта переменных PCA называется нагрузкой. Мы можем интерпретировать карту нагрузки, оценивая углы между ними (лучше всего делать это на круговой карте загрузки, где эффекты переменных стандартизированы). Угол между векторами является аппроксимацией корреляции между переменными. Небольшой угол указывает, что переменные имеют положительную корреляцию, угол 90 градусов указывает, что переменные не коррелированы, а угол, близкий к 180 градусам, указывает на то, что переменные имеют отрицательную корреляцию.

================================================

(.env) boris@boris-All-Series:~/VOTING/PCA$ cat plottingPCA2.py

import pandas as pd

import numpy as np

from sklearn.decomposition import PCA

import matplotlib.pyplot as plt

import seaborn as sns

import warnings

warnings.filterwarnings("ignore")

 

# Get the iris dataset

sns.set_style("white")

df = sns.load_dataset('iris')


# create figure

my_dpi=96

plt.figure(figsize=(480/my_dpi, 480/my_dpi), dpi=my_dpi)

 

# Keep the 'species' column appart + make it numeric for coloring

df['species']=pd.Categorical(df['species'])

my_color=df['species'].cat.codes

df = df.drop('species', 1)

 

# Run The PCA

pca = PCA(n_components=3)

pca.fit(df)

 

# Store results of PCA in a data frame

result=pd.DataFrame(pca.transform(df), columns=['PCA%i' % i for i in range(3)], index=df.index)

 

# Plot initialisation

fig = plt.figure()

ax = fig.add_subplot(111, projection='3d')

ax.scatter(result['PCA0'], result['PCA1'], result['PCA2'], \

           c=my_color, cmap="Set2_r", s=60)

 

# make simple, bare axis lines through space:

xAxisLine = ((min(result['PCA0']), max(result['PCA0'])), (0, 0), (0,0))

ax.plot(xAxisLine[0], xAxisLine[1], xAxisLine[2], 'r')

yAxisLine = ((0, 0), (min(result['PCA1']), max(result['PCA1'])), (0,0))

ax.plot(yAxisLine[0], yAxisLine[1], yAxisLine[2], 'r')

zAxisLine = ((0, 0), (0,0), (min(result['PCA2']), max(result['PCA2'])))

ax.plot(zAxisLine[0], zAxisLine[1], zAxisLine[2], 'r')

 

# label the axes

ax.set_xlabel("PC1")

ax.set_ylabel("PC2")

ax.set_zlabel("PC3")

ax.set_title("PCA on the iris data set")

plt.show()





























(.env) boris@boris-All-Series:~/VOTING/PCA$ cat plot_pca_3d.py
"""
=====================================
Principal components analysis (PCA)
=====================================

Эти рисунки помогают проиллюстрировать, как облако точек может быть очень плоским в одном направлении — именно здесь PCA приходит, чтобы выбрать направление, которое не является плоским.
"""

import numpy as np
from scipy import stats

e = np.exp(1)
np.random.seed(4)

def pdf(x):
    return 0.5 * (stats.norm(scale=0.25 / e).pdf(x) + stats.norm(scale=4 / e).pdf(x))

y = np.random.normal(scale=0.5, size=(30000))
x = np.random.normal(scale=0.5, size=(30000))
z = np.random.normal(scale=0.1, size=len(x))

density = pdf(x) * pdf(y)
pdf_z = pdf(5 * z)

density *= pdf_z

a = x + y
b = 2 * y
c = a - b + z

norm = np.sqrt(a.var() + b.var())
a /= norm
b /= norm

# Plot the figures
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

def plot_figs(fig_num, elev, azim):
    fig = plt.figure(fig_num, figsize=(4, 3))
    plt.clf()
    ax = fig.add_subplot(111, projection="3d", elev=elev, azim=azim)
    ax.set_position([0, 0, 0.95, 1])

    ax.scatter(a[::10], b[::10], c[::10], c=density[::10], marker="+", alpha=0.4)
    Y = np.c_[a, b, c]

    # Using SciPy's SVD, this would be:
    # _, pca_score, Vt = scipy.linalg.svd(Y, full_matrices=False)

    pca = PCA(n_components=3)
    pca.fit(Y)
    V = pca.components_.T

    x_pca_axis, y_pca_axis, z_pca_axis = 3 * V
    x_pca_plane = np.r_[x_pca_axis[:2], -x_pca_axis[1::-1]]
    y_pca_plane = np.r_[y_pca_axis[:2], -y_pca_axis[1::-1]]
    z_pca_plane = np.r_[z_pca_axis[:2], -z_pca_axis[1::-1]]
    x_pca_plane.shape = (2, 2)
    y_pca_plane.shape = (2, 2)
    z_pca_plane.shape = (2, 2)
    ax.plot_surface(x_pca_plane, y_pca_plane, z_pca_plane)
    ax.w_xaxis.set_ticklabels([])
    ax.w_yaxis.set_ticklabels([])
    ax.w_zaxis.set_ticklabels([])

elev = -40
azim = -80
plot_figs(1, elev, azim)

elev = 30
azim = 20
plot_figs(2, elev, azim)
plt.show()





























Sunday, June 26, 2022

McCulloch-Pitts Neuron

Модель нейрона Маккаллоха-Питтса является чрезвычайно упрощенной моделью реальных биологических нейронов. Некоторые из его недостающих функций включают в себя: 

Небинарные входы-выходы, нелинейное суммирование, гладкую пороговую обработку, стохастическую (недетерминированную) и временную обработку информации.Он допускает только двоичное значение (0,1).Он имеет пороговую функцию в качестве функции активации. Это первая математическая модель биологического нейрона.

========================================== 

Ограничения MP-нейрона

1. Внебулевых (скажем, реальных) входных данных?

2. Всегда ли нам нужно вручную кодировать порог? <==

3. Все входы равны? Что, если мы хотим придать большее значение некоторым входным данным?

4. Функции, которые не являются линейно разделимыми? Скажем, функция XOR

Теперь понятно, почему сегодня мы не используем нейрон МП. Преодолев ограничения нейрона MP, Фрэнк Розенблатт, американский психолог, предложил классическую модель восприятия, мощный искусственный нейрон, в 1958 году. Это более обобщенная вычислительная модель, чем нейрон Маккаллоха-Питтса,  где веса и пороги могут быть изучены с течением времени.

========================================

Модель Маккаллоха не может обучаться сама по себе из-за пороговой логики.










Здесь у нас есть запрещающий вход, то есть x_2, поэтому всякий раз, когда x_2 равен 1, выход будет 0. Имея это в виду, мы знаем, что x_1 И !x_2 будут выводить 1 только тогда, когда x_1 равно 1, а x_2 равно 0, поэтому это очевидно. что пороговый параметр должен быть равен 1. Проверим, что g(x), т. е. x_1 + x_2, 

будет ≥ 1 только в 3 случаях:

Случай 1: когда x_1 равно 1, а x_2 равно 0

Случай 2: когда x_1 равно 1, а x_2 равно 1

Случай 3: когда x_1 равен 0, а x_2 равен  1












Посмотрев на приведенный выше график, видно что все точки, которые лежат НА или ВЫШЕ этой плоскости (положительное полупространство), приведут к результату 1 при прохождении через модуль MP функции ИЛИ и все точки, которые лежат НИЖЕ этой плоскости. (отрицательное полупространство) приведет к выводу 0.Только вручную закодировав пороговый параметр, нейрон MP может удобно представлять логические функции,  которые являются линейно разделимыми.

Порог или знак sigmod : не определен  как гладкая (дифференцируемая)  форма пороговой функции.

Линейная отделимость (для логических функций): существует линия (плоскость), такая, что все входы, которые дают 1, лежат по одну сторону от линии (плоскости), а все входы, которые дают 0, лежат по другую сторону линии (плоскость). 




Plotting scheme in Pandas from CSV without headers

Исходный файл для загрузки  без заголовков

(.env) boris@boris-All-Series:~/VOTING/ADDHEADER$ cat dataFile.csv

7058,7069,7060,7061

sravan,bobby,ojaswi,deepu

21,23,22,21

linux,html/css,node-js,php-mysql


(.env) boris@boris-All-Series:~/VOTING/ADDHEADER$ cat dataFrame2.py

import pandas as pd

df = pd.read_csv ('./dataFile.csv',header = None

print (df)

print("\n")

df.set_axis(["person1", "person2", "person3", "person4"],

              axis=1,

              inplace=True)

print(df)

(.env) boris@boris-All-Series:~/VOTING/ADDHEADER$ python3 dataFrame2.py

        0         1        2          3

0    7058      7069     7060       7061

1  sravan     bobby   ojaswi      deepu

2      21        23       22         21

3   linux  html/css  node-js  php-mysql


  person1   person2  person3    person4

0    7058      7069     7060       7061

1  sravan     bobby   ojaswi      deepu

2      21        23       22         21

3   linux  html/css  node-js  php-mysql






























Saturday, June 25, 2022

SVM RBF Classifieng (sample circles)

 (.env) boris@boris-All-Series:~/SVMRBF$ cat  plotting3DSVM1.py

from sklearn.svm import SVC 

from sklearn.datasets  import make_circles

import matplotlib.pyplot as plt

from mpl_toolkits import mplot3d

import numpy as np

from ipywidgets import interact

def plot_svc_decision_function(clf, ax=None):

    """Plot the decision function for a 2D SVC"""

    if ax is None:

        ax = plt.gca()

    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)

    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)

    Y, X = np.meshgrid(y, x)

    P = np.zeros_like(X)

    for i, xi in enumerate(x):

        for j, yj in enumerate(y):

            P[i, j] = clf.decision_function([[xi, yj]])

    # plot the margins

    ax.contour(X, Y, P, colors='k',

               levels=[-1, 0, 1], alpha=0.5,

               linestyles=['--', '-', '--'])

X, y = make_circles(100, factor=.1, noise=.1)

def plot_3D(elev=30, azim=30):

    ax = plt.subplot(projection='3d')

    ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap='spring')

    ax.view_init(elev=elev, azim=azim)

    ax.set_xlabel('x')

    ax.set_ylabel('y')

    ax.set_zlabel('r')

interact(plot_3D, elev=(-90, 90), azip=(-180, 180));

clf = SVC(kernel='rbf')

clf.fit(X, y)

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring')

plot_svc_decision_function(clf)

plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],

            s=200, facecolors='none');

plt.show()





























Friday, June 24, 2022

RBF SVM parameters

(.env) boris@boris-All-Series:~/SVMRBF$ pip install -U scikit-learn scipy

(.env) boris@boris-All-Series:~/SVMRBF$ cat plot_rbf_parameters.py

"""

==================

RBF SVM parameters

==================

Этот пример иллюстрирует влияние параметров gamma и C ядра SVM радиальной базисной функции (RBF).

Интуитивно параметр «гамма» определяет, насколько далеко простирается влияние одного обучающего примера, при этом низкие значения означают «далеко», а высокие значения означают «близко». Параметры «гаммы» можно рассматривать как обратную величину радиуса влияния выборок, выбранных моделью в качестве опорных векторов.Параметр <<C>> компенсирует правильную классификацию обучающих примеров максимизацией запаса решающей функции. Для больших значений <<C>> будет принят меньший запас, если решающая функция лучше правильно классифицирует все обучающие точки. Более низкий «C» будет способствовать большему запасу, следовательно, более простой функции принятия решения за счет точности обучения. Другими словами, <<C>> ведет себя как параметр регуляризации в SVM.

Первый график представляет собой визуализацию решающей функции для множества значений параметров в упрощенной задаче классификации, включающей только 2 входных признака и 2 возможных целевых класса (бинарная классификация). Обратите внимание, что такой график невозможно построить для задач с большим количеством функций или целевых классов.

Второй график представляет собой тепловую карту точности перекрестной проверки классификатора в зависимости от <<C>> и ``gamma``. В этом примере мы исследуем относительно большую сетку для иллюстрации. На практике логарифмическая сетка из

:math:`10^{-3}` до :math:`10^3`. Если лучшие параметры лежат на границах сетки, ее можно расширить в этом направлении при последующем поиске. Обратите внимание, что на графике тепловой карты есть специальная цветная полоса со средним значением, близким к значениям баллов наиболее эффективных моделей, чтобы их можно было легко отличить друг от друга в мгновение ока. Поведение модели очень чувствительно к параметру «гамма». Если «гамма» слишком велика, радиус области влияния опорных векторов включает только сам опорный вектор и никакое количество регуляризация с помощью <<C>> сможет предотвратить переобучение.

Когда «гамма» очень мала, модель слишком ограничена и не может отразить сложность или «форму» данных. Область влияния любого выбранного опорного вектора будет включать в себя всю обучающую выборку. Результирующая модель будет вести себя аналогично линейной модели с набором гиперплоскостей, разделяющих центры высокой плотности любой пары двух классов. Для промежуточных значений мы можем видеть на втором графике, что хорошие модели можно найти на диагонали «C» и «gamma». Гладкие модели (более низкие значения «гаммы») можно сделать более сложными, увеличив важность классификации, каждая точка правильна (большие значения «C»), следовательно, диагональ хороших моделей. Наконец, можно также заметить, что для некоторых промежуточных значений «гаммы» мы получаем одинаково эффективные модели, когда «С» становится очень большим. Это говорит о том, что набор опорных векторов больше не меняется. Радиус ядра RBF сам по себе действует как хороший структурный регуляризатор. Дальнейшее увеличение <<C>> не помогает, вероятно, потому, что больше нет точек обучения с нарушением (внутри поля или неправильно классифицированных), или, по крайней мере, не может быть найдено лучшее решение. При равенстве баллов может иметь смысл использовать меньшую букву «C» значений, так как очень высокие значения «C» обычно увеличивают время подбора. С другой стороны, более низкие значения «C» обычно приводят к большему количеству опорных векторов, что может увеличить время прогнозирования. Таким образом, снижение значения «C» включает в себя компромисс между временем подбора и временем прогнозирования. Мы также должны отметить, что небольшие различия в баллах возникают из-за случайного разделения процедуры перекрестной проверки. Эти ложные вариации можно сгладить, увеличив число итераций CV ``n_splits`` засчет затрат времени вычислений. Увеличение количества значений шагов C_range и ``gamma_range`` увеличит разрешение тепловой карты гиперпараметров.

"""

# Utility class to move the midpoint of a colormap to be around

# the values of interest.

import numpy as np

from matplotlib.colors import Normalize

class MidpointNormalize(Normalize):

    def __init__(self, vmin=None, vmax=None, midpoint=None, clip=False):

        self.midpoint = midpoint

        Normalize.__init__(self, vmin, vmax, clip)

    def __call__(self, value, clip=None):

        x, y = [self.vmin, self.midpoint, self.vmax], [0, 0.5, 1]

        return np.ma.masked_array(np.interp(value, x, y))


# Load and prepare data set

# dataset for grid search

from sklearn.datasets import load_iris

iris = load_iris()

X = iris.data

y = iris.target

# Dataset for decision function visualization: we only keep the first two

# features in X and sub-sample the dataset to keep only 2 classes and

# make it a binary classification problem.

X_2d = X[:, :2]

X_2d = X_2d[y > 0]

y_2d = y[y > 0]

y_2d -= 1

# It is usually a good idea to scale the data for SVM training.

# We are cheating a bit in this example in scaling all of the data,

# instead of fitting the transformation on the training set and

# just applying it on the test set.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X = scaler.fit_transform(X)

X_2d = scaler.fit_transform(X_2d)

# Train classifiers

# For an initial search, a logarithmic grid with basis

# 10 is often helpful. Using a basis of 2, a finer

# tuning can be achieved but at a much higher cost.


from sklearn.svm import SVC

from sklearn.model_selection import StratifiedShuffleSplit

from sklearn.model_selection import GridSearchCV

C_range = np.logspace(-2, 10, 13)

gamma_range = np.logspace(-9, 3, 13)

param_grid = dict(gamma=gamma_range, C=C_range)

cv = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)

grid = GridSearchCV(SVC(), param_grid=param_grid, cv=cv)

grid.fit(X, y)

print(

    "The best parameters are %s with a score of %0.2f"

    % (grid.best_params_, grid.best_score_)

)

# Now we need to fit a classifier for all parameters in the 2d version

# (we use a smaller set of parameters here because it takes a while to train)

C_2d_range = [1e-2, 1, 1e2]

gamma_2d_range = [1e-1, 1, 1e1]

classifiers = []

for C in C_2d_range:

    for gamma in gamma_2d_range:

        clf = SVC(C=C, gamma=gamma)

        clf.fit(X_2d, y_2d)

        classifiers.append((C, gamma, clf))

# Visualization

# draw visualization of parameter effects

import matplotlib.pyplot as plt

plt.figure(figsize=(8, 6))

xx, yy = np.meshgrid(np.linspace(-3, 3, 200), np.linspace(-3, 3, 200))

for k, (C, gamma, clf) in enumerate(classifiers):

    # evaluate decision function in a grid

    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])

    Z = Z.reshape(xx.shape)

    # visualize decision function for these parameters

    plt.subplot(len(C_2d_range), len(gamma_2d_range), k + 1)

    plt.title("gamma=10^%d, C=10^%d" % (np.log10(gamma), np.log10(C)), size="medium")

    # visualize parameter's effect on decision function

    plt.pcolormesh(xx, yy, -Z, cmap=plt.cm.RdBu)

    plt.scatter(X_2d[:, 0], X_2d[:, 1], c=y_2d, cmap=plt.cm.RdBu_r, edgecolors="k")

    plt.xticks(())

    plt.yticks(())

    plt.axis("tight")

scores = grid.cv_results_["mean_test_score"].reshape(len(C_range), len(gamma_range))

# Draw heatmap of the validation accuracy as a function of gamma and C

# The score are encoded as colors with the hot colormap which varies from dark

# red to bright yellow. As the most interesting scores are all located in the

# 0.92 to 0.97 range we use a custom normalizer to set the mid-point to 0.92 so

# as to make it easier to visualize the small variations of score values in the

# interesting range while not brutally collapsing all the low score values to

# the same color.

plt.figure(figsize=(8, 6))

plt.subplots_adjust(left=0.2, right=0.95, bottom=0.15, top=0.95)

plt.imshow(

    scores,

    interpolation="nearest",

    cmap=plt.cm.hot,

    norm=MidpointNormalize(vmin=0.2, midpoint=0.92),

)

plt.xlabel("gamma")

plt.ylabel("C")

plt.colorbar()

plt.xticks(np.arange(len(gamma_range)), gamma_range, rotation=45)

plt.yticks(np.arange(len(C_range)), C_range)

plt.title("Validation accuracy")

plt.show()


























































(.env) boris@boris-All-Series:~/SVMRBF$ cat  plotting3DSVM1.py
from sklearn.svm import SVC 
from sklearn.datasets  import make_circles
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import numpy as np
from ipywidgets import interact

def plot_svc_decision_function(clf, ax=None):
    """Plot the decision function for a 2D SVC"""
    if ax is None:
        ax = plt.gca()
    x = np.linspace(plt.xlim()[0], plt.xlim()[1], 30)
    y = np.linspace(plt.ylim()[0], plt.ylim()[1], 30)
    Y, X = np.meshgrid(y, x)
    P = np.zeros_like(X)
    for i, xi in enumerate(x):
        for j, yj in enumerate(y):
            P[i, j] = clf.decision_function([[xi, yj]])
    # plot the margins
    ax.contour(X, Y, P, colors='k',
               levels=[-1, 0, 1], alpha=0.5,
               linestyles=['--', '-', '--'])

X, y = make_circles(100, factor=.1, noise=.1)

def plot_3D(elev=30, azim=30):
    ax = plt.subplot(projection='3d')
    ax.scatter3D(X[:, 0], X[:, 1], r, c=y, s=50, cmap='spring')
    ax.view_init(elev=elev, azim=azim)
    ax.set_xlabel('x')
    ax.set_ylabel('y')
    ax.set_zlabel('r')

interact(plot_3D, elev=(-90, 90), azip=(-180, 180));

clf = SVC(kernel='rbf')
clf.fit(X, y)

plt.scatter(X[:, 0], X[:, 1], c=y, s=50, cmap='spring')
plot_svc_decision_function(clf)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],
            s=200, facecolors='none');

plt.show()





























Thursday, June 23, 2022

Deep Learning Neural Networks Trained Using Stochastic Gradient Descent Algorithm

 Задача оптимизатора — сделать функцию потерь как можно меньше, чтобы найти подходящие параметры для выполнения определенной задачи. В настоящее время основными оптимизаторами, используемыми при обучении моделей, являются SGD, RMSProp, Adam, AdaDelt и так далее. Оптимизаторы SGD с импульсом широко используются в научных кругах и промышленности, поэтому большинство выпускаемых моделей обучаются с помощью оптимизатора SGD с импульсом. Но у SGD-оптимизатора с импульсом есть два недостатка: во-первых, скорость сходимости низкая, во-вторых, трудно установить начальную скорость обучения, однако, если начальная скорость обучения установлена ​​​​правильно, а модели обучены в достаточном количестве итераций. , модели, обученные SGD с помощью импульса, могут достигать более высокой точности по сравнению с моделями, обученными другими оптимизаторами. Некоторые другие оптимизаторы с адаптивной скоростью обучения, такие как Adam, RMSProp и т. д., стремятся сходиться быстрее, но окончательная точность сходимости будет немного хуже. Если вы хотите обучить модель с более высокой скоростью сходимости, мы рекомендуем вам использовать оптимизаторы с адаптивной скоростью обучения, но если вы хотите обучить модель с более высокой точностью, мы рекомендуем вам использовать оптимизатор SGD с импульсом.

Концепция скорости обучения: скорость обучения — это гиперпараметр для управления скоростью обучения, чем ниже скорость обучения, тем медленнее изменяется значение потерь, хотя использование низкой скорости обучения может гарантировать, что вы не пропустите ни один локальный минимум, но это также означает, что скорость конвергенции медленная, особенно когда градиент попадает в область градиентного плато.

=========================

Нейронные сети глубокого обучения обучаются с использованием алгоритма стохастического градиентного спуска.

Стохастический градиентный спуск — это алгоритм оптимизации, который оценивает градиент ошибки для текущего состояния модели, используя примеры из обучающего набора данных, а затем обновляет веса модели, используя алгоритм обратного распространения ошибок, называемый просто обратным распространением.

Величина, на которую веса обновляются во время обучения, называется размером шага или «скоростью обучения».

В частности, скорость обучения — это настраиваемый гиперпараметр, используемый при обучении нейронных сетей, который имеет небольшое положительное значение, часто в диапазоне от 0,0 до 1,0.Скорость обучения определяет, насколько быстро модель адаптируется к проблеме. Меньшие скорости обучения требуют большего количества эпох обучения, учитывая меньшие изменения, вносимые в веса при каждом обновлении, тогда как более высокие скорости обучения приводят к быстрым изменениям и требуют меньшего количества эпох обучения.Слишком большая скорость обучения может привести к слишком быстрой сходимости модели к неоптимальному решению, тогда как слишком маленькая скорость обучения может привести к зависанию процесса.

Задача обучения нейронных сетей глубокого обучения заключается в тщательном выборе скорости обучения. Это может быть самый важный гиперпараметр для модели.

============================

Стратегия снижения скорости обучения:Во время обучения, если мы всегда используем одну и ту же скорость обучения, мы не можем получить модель с максимальной точностью, поэтому скорость обучения следует регулировать во время обучения. На ранней стадии обучения веса находятся в состоянии случайной инициализации, а градиенты имеют тенденцию к снижению, поэтому мы можем установить относительно большую скорость обучения для более быстрой сходимости. На поздней стадии обучения веса близки к оптимальным значениям, оптимальное значение не может быть достигнуто при относительно большой скорости обучения, поэтому следует использовать относительно меньшую скорость обучения. Во время обучения многие исследователи используют стратегию снижения скорости обучения piecewise_decay, которая представляет собой пошаговое снижение скорости обучения. Например, при обучении ResNet50 начальная скорость обучения, которую установили, равна 0,1, и скорость обучения падает до 1/10 каждые 30 эпох, общее количество эпох для обучения равно 120. Помимо кусочного_распада, многие исследователи также предлагали другие способы уменьшить скорость обучения, например, polynomial_decay, exponential_decay и cosine_decay и т. д. Среди них cosine_decay стал предпочтительным методом снижения скорости обучения для повышения точности модели, поскольку нет необходимости настраивать гиперпараметры, а надежность относительно высока. Кривые скорости обучения cosine_decay и piecewise_decay показаны на следующих рисунках, легко заметить, что в течение всего процесса обучения cosine_decay сохраняет относительно большую скорость обучения, поэтому его сходимость медленнее, но конечная точность сходимости лучше, чем у один с использованием piecewise_decay.













Кроме того, мы также можем видеть из рисунков, что количество эпох с небольшой скоростью обучения в cosine_decay меньше, что повлияет на итоговую точность, поэтому, чтобы заставить cosine_decay играть лучше, рекомендуется использовать cosine_decay в большие эпохи, например, 200 эпох.

ResNet50 — это вариант модели ResNet, который имеет 48 слоев свертки, а также 1 слой MaxPool и 1 средний пул. 

Он имеет 3,8 x 10 ^ 9 операций с плавающей запятой. Это широко используемая модель ResNet и ее архитектура хорошо известна.

========================================

Эффект адаптивных скоростей обучения

========================================

Скорость обучения и графики скорости обучения сложны в настройке и имеют решающее значение для производительности модели нейронной сети с глубоким обучением.Keras предоставляет ряд различных популярных вариантов стохастического градиентного спуска с адаптивной скоростью обучения, таких как:

Adaptive Gradient Algorithm (AdaGrad).

Root Mean Square Propagation (RMSprop).

Adaptive Moment Estimation (Adam).

Каждый из них предоставляет различную методологию адаптации скорости обучения для каждого веса в сети.

Не существует единственного лучшего алгоритма, и результаты алгоритмов гоночной оптимизации для одной задачи вряд ли можно будет перенести на новые задачи.Мы можем изучить динамику различных методов адаптивной скорости обучения в задаче о каплях. Функцию fit_model() можно обновить, чтобы она брала имя алгоритма оптимизации для оценки, которое можно указать в аргументе «оптимизатор» при компиляции модели MLP. Затем будут использоваться параметры по умолчанию для каждого метода.


(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat  AdaptLearnRates.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 keras.optimizers import SGD

from 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()















===========================

Затухание скорости обучения

===========================

Выполнение примера создает единую фигуру, содержащую четыре линейных графика для различных оцененных значений затухания скорости обучения. Точность классификации в обучающем наборе данных отмечена синим цветом, тогда как точность в тестовом наборе данных отмечена оранжевым цветом.

(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat learnRateKeras.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 keras.optimizers import SGD

from 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()















=================================

Влияние скорости обучения и импульса

=================================

Импульсная динамика

Импульс может сгладить прогресс алгоритма обучения, что, в свою очередь, может ускорить процесс обучения

Выполнение примера создает единую фигуру, содержащую четыре линейных графика для различных оцененных значений импульса. Точность классификации в обучающем наборе данных отмечена синим цветом, тогда как точность в тестовом наборе данных отмечена оранжевым цветом.

(.env) boris@boris-All-Series:~/LEARNINGRATE$ cat MomentumDynam.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 keras.optimizers import SGD

from 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()