Sunday, July 24, 2022

Activation Functions In Artificial Neural Networks

Функции активации в искусственных нейронных сетях

Искусственные нейронные сети (ИНС). Эта идея моделируется в искусственных нейронных сетях, где мы представляем нашу модель в виде нейронов, соединенных ребрами (аналогично аксонам). Значение нейрона это просто сумма значений предыдущих нейронов, связанных с ним, взвешенных по весам их ребер. Наконец, нейрон проходит через функцию, чтобы решить, насколько сильно он должен быть активирован, которая называется функцией активации.

RELU в регрессии. Функция активации (ReLU)

Мы применяем функции активации к скрытым и выходным нейронам, чтобы нейроны не опускались слишком низко или слишком высоко, что будет работать против процесса обучения сети. Просто так математика работает лучше.Наиболее важная функция активации применяется к выходному слою. Если NN применяется к проблеме регрессии, то вывод должен быть непрерывным. Для демонстрации мы используем набор данных о ценах на жилье в одном из мегаполисов. Цена дома не может быть отрицательной. Мы навязываем это правило, используя одну из самых интуитивно понятных и полезных функций активации: Rectified Linear Unit. Единственное, что он делает, это; если значение отрицательное, установите его равным нулю.













 Как построить модель нейронной сети с бинарной классификацией (1).

(.env) boris@boris-All-Series:~/NeuralNet$ cat BinaryClassif.py

from collections import Counter

import numpy as np

import matplotlib.pyplot as plt

import numpy as np

import pandas as pd

import tensorflow as tf

from sklearn.datasets import load_boston

from sklearn.model_selection import train_test_split

from tensorflow.keras.layers import Dense, Dropout, Input

from tensorflow.keras.models import Model


tf.random.set_seed(42)

np.random.seed(42)


from sklearn.metrics import classification_report

from sklearn.datasets import load_breast_cancer

from sklearn.utils.class_weight import compute_class_weight


data = load_breast_cancer()

X = data["data"]

y = data["target"]

labels = data["target_names"]

X_train, X_test, y_train, y_test= train_test_split(X, y, random_state=42)


"""

def annotate_bars(ax, patches, horizontal=False, as_int=True):

    for p in patches:

        if horizontal:

            w = p.get_width()

            w = int(w) if as_int else round(w, 3)

            if w == 0:

                continue

            ax.annotate(f"{w}", (p.get_width()* 1.01, p.get_y() +0.1), fontsize=14)

        else:

            h = p.get_height()

            h = int(h) if as_int else round(h, 3)

            if h == 0:

                continue

            ax.annotate(f"{h}", (p.get_x() +p.get_width()/2, p.get_height()* 1.01), fontsize=14)

    return ax

counter = Counter(y)

keys = counter.keys()

values = counter.values()

fig = plt.figure(figsize=(16, 9))

bar = plt.bar(keys, values)

annotate_bars(plt, bar.patches)

plt.xticks([0, 1], labels=["malignant", "benign"])

plt.xlabel("Class", fontsize=16)

plt.ylabel("Frequency", fontsize=16)

plt.title("Labels Distribution", fontsize=22)

plt.show()

"""

classes = [0, 1]

class_weight = compute_class_weight('balanced',classes=classes, y=y_train)

class_weight

class_weight_dict = dict(zip([0, 1], class_weight))

class_weight_dict

input_shape = X.shape[1] # number of features, which is 30

output_shape = 1

inputs = Input(shape=(input_shape,))

h = Dense(32, activation="relu")(inputs)

h = Dense(16, activation="relu")(h)

h = Dense(8, activation="relu")(h)

h = Dense(4, activation="relu")(h)

out = Dense(output_shape, activation="sigmoid")(h)

model = Model(inputs=inputs, outputs=[out])

model.summary()

model.compile(optimizer="adam", loss="binary_crossentropy", metrics="accuracy")

H = model.fit(

    x=X_train,

    y=y_train,

    validation_data=(

        X_test, y_test

    ),

    class_weight=class_weight_dict,

    epochs=50,

)


f, axarr = plt.subplots(1,2, figsize=(16, 9))

axarr[0].plot(H.history["loss"], label="loss")

axarr[0].plot(H.history["val_loss"], label="validation loss")

axarr[0].legend()


axarr[1].plot(H.history["accuracy"], label="accuracy")

axarr[1].plot(H.history["val_accuracy"], label="validation accuracy")

axarr[1].legend()

axarr[1].set_yticks(np.arange(0.4, 1, 0.05))

plt.draw()


pred_probs = model.predict(X_test) # predicted probabilities

y_pred=  pred_probs>=0.5 # higher than 50% probability means a positive class (i.e. class 1 or malignant)

print(classification_report(y_test, y_pred))

plt.show()
































(.env) boris@boris-All-Series:~/NeuralNet$ cat ActivationFunc.py (2)
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.datasets import load_boston
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Dense, Dropout, Input
from tensorflow.keras.models import Model
import seaborn as sns

tf.random.set_seed(42)
np.random.seed(42)

data = load_boston()
X = data["data"]
y = data["target"]
df = pd.DataFrame(X, columns=data["feature_names"])
df["PRICE"] = y
print(df)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
input_shape = X.shape[1] # number of features, which is 13
# this is regression
# so we only need one neuron to represent the prediction
output_shape = 1

# we set up our input layer
inputs = Input(shape=(input_shape,))
# we add 3 hidden layers with diminishing size. This is a common practice in designing a neural network
# as the features get more and more abstracted, we need less and less neurons.
h = Dense(16, activation="relu")(inputs)
h = Dense(8, activation="relu")(h)
h = Dense(4, activation="relu")(h)
# and finally we use the ReLU activation function on the output layer
out = Dense(output_shape, activation="relu")(h)
model = Model(inputs=inputs, outputs=[out])
model.summary()

model.compile(optimizer="adam", loss="mean_squared_error")
H = model.fit(
    x=X_train,
    y=y_train,
    validation_data=(
        X_test, y_test
    ),
    epochs=100,
)

fig = plt.figure(figsize=(16, 9))
plt.plot(H.history["loss"], label="loss")
plt.plot(H.history["val_loss"], label="validation loss")
plt.draw()

sns.displot(x=y, kde=True, aspect=16/9)

# Add labels
plt.title(f'Histogram of house prices\nMean: {round(np.mean(y), 2)}\nStandard Deviation: {round(np.std(y), 2)}', fontsize=22)
plt.xlabel('House Price Range', fontsize=16)
plt.ylabel('Frequency', fontsize=16)
plt.xticks(np.arange(0, 50, 2))
plt.draw()


y_pred = model.predict(X_test)
print(f"RMSE: {np.sqrt(mean_squared_error(y_test, y_pred))}")
print(f"MAE: {mean_absolute_error(y_test, y_pred)}")
print(f"R2: {r2_score(y_test, y_pred)}")

plt.show()
































No comments:

Post a Comment