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