Как сделать кастомную функцию активации в Keras

Обзор

В этом руководстве мы будем использовать набор данных mnist от kaggle.

  1. Сначала подготовим данные для обучения
  2. Во-вторых, настроим функцию активации в python (RELU, предоставляется нашей функцией)
  3. Скомпилируем нейронную сеть
  4. Обучим нейронную сеть
  5. Проверим, дает ли это хорошие результаты

Загрузка данных из kaggle.

Будет 2 файла

  • train.csv.zip
  • test.csv.zip

Тестовый файл не имеет смысла, так как там нет ярлыков.
https://www.kaggle.com/oddrationale/mnist-in-csv

При использование Google Colab

Перетащите файл train.csv.zip в файлы

!unzip archive.zip
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.style.use('ggplot')
import keras
import matplotlib.pyplot as plt

from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

Подготовка данных для обучения

train_df = pd.read_csv('/content/train.csv') #might be in other place
train_labels = train_df['label'] #We need Y values - labels
train_labels = train_labels.to_numpy() # nothing smart just convert to numpy array
del train_df['label'] # remove label from original dataframe to use it as X
train_data = train_df.to_numpy()


# we can't use values 1,2,3,4,4,5 for Y
# instead we should use smth like [1,0,0,0,0,0], [0,1,0,0,0,0], ...
y = LabelBinarizer().fit_transform(train_labels) 


#Split train and test data
X_train, X_test, y_train, y_test = train_test_split(train_data, y, test_size=0.1)

Создание индивидуальной функции активации


from keras import backend as K
from keras.layers.core import Activation
from keras.utils.generic_utils import get_custom_objects

### Note! You cannot use random python functions, activation function gets as an input tensorflow tensors and should return tensors. There are a lot of helper functions in keras backend.
def custom_activation(x):
  
    return (1/(1 + K.exp(-x)))
     
get_custom_objects().update({'custom_activation': Activation(custom_activation)})

Скомпилирование нейронной сети

# Define sequential model

model = keras.Sequential()

# Define the first layer
model.add(keras.layers.Dense(128, activation="custom_activation", input_shape=(784,)))
model.add(keras.layers.Dense(128, activation="custom_activation", input_shape=(128,)))
model.add(keras.layers.Dense(128, activation="custom_activation", input_shape=(128,)))
model.add(keras.layers.Dense(128, activation="custom_activation", input_shape=(128,)))

# Add activation function to classifier
model.add(keras.layers.Dense(10, activation='softmax'))

# Finish the modecl compilation
model.compile('adam', loss='categorical_crossentropy', metrics=['accuracy'])

# Complete the model fit operation

Обучение нейронной сети

model.fit(train_data, y, epochs=10, validation_data=(X_test, y_test), callbacks=[], verbose=0)

Ответить