Как сделать кастомную функцию активации в Keras
Обзор
В этом руководстве мы будем использовать набор данных mnist от kaggle.
- Сначала подготовим данные для обучения
- Во-вторых, настроим функцию активации в python (RELU, предоставляется нашей функцией)
- Скомпилируем нейронную сеть
- Обучим нейронную сеть
- Проверим, дает ли это хорошие результаты
Загрузка данных из 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)
+1
+1
+1
+1
+1