Я пытаюсь максимально использовать c базовых c нейронных сетей, чтобы познакомиться с извлечением функций в Tensorflow 2.x и, в частности, с keras.
В основном то, что я пытаюсь сделать, это следующее с моим упрощенным набором данных по радужной оболочке (т.е. сетоса или нет)
Использовать 4 функции в качестве входных данных Плотный слой из 3 функций активации сигмовидной железы каждый класс) Активация Softmax Двоичная перекрестная энтропия / лог-потеря как моя функция потерь
Вот как я строю нейронную сеть (обратите внимание, производительность ужасная, но я просто использую этот игрушечный пример):
# Load data
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
X, y = load_iris(return_X_y=True, as_frame=True)
X = X.astype("float32")
X.index = X.index.map(lambda i: "iris_{}".format(i))
X.columns = X.columns.map(lambda j: j.split(" (")[0].replace(" ","_"))
y.index = X.index
y = y.map(lambda i:iris.target_names[i])
y_simplified = y.map(lambda i: {True:1, False:0}[i == "setosa"])
Y = pd.get_dummies(y_simplified, columns=["setosa", "not_setosa"])
# Traing test split
from sklearn.model_selection import train_test_split
seed=0
X_train,X_test, Y_train,Y_test= train_test_split(X,Y, test_size=0.3, random_state=seed)
# Simple neural network
import tensorflow as tf
tf.random.set_seed(seed)
# Input[4 features] -> Dense layer of 3 neurons -> Activation function -> Dense layer of 2 (one per class) -> Softmax
inputs = tf.keras.Input(shape=(4))
x = tf.keras.layers.Dense(3)(inputs)
x = tf.keras.layers.Activation(tf.nn.sigmoid)(x)
x = tf.keras.layers.Dense(2)(x)
outputs = tf.keras.layers.Activation(tf.nn.softmax)(x)
model = tf.keras.Model(inputs=inputs, outputs=outputs, name="simple_binary_iris")
model.compile(loss="binary_crossentropy", metrics=[ "accuracy"] )
model.summary()
history = model.fit(X_train, Y_train, batch_size=64, epochs=10, validation_split=0.2)
Вот сводка:
Model: "simple_binary_iris"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_2 (InputLayer) [(None, 4)] 0
_________________________________________________________________
dense_4 (Dense) (None, 3) 15
_________________________________________________________________
activation_2 (Activation) (None, 3) 0
_________________________________________________________________
dense_5 (Dense) (None, 2) 8
_________________________________________________________________
activation_3 (Activation) (None, 2) 0
=================================================================
Total params: 23
Trainable params: 23
Non-trainable params: 0
Вот код извлечения функции из keras FAQ :
# https://keras.io/getting_started/faq/#how-can-i-obtain-the-output-of-an-intermediate-layer-feature-extraction
extractor = tf.keras.Model(
inputs=model.inputs,
outputs=[layer.output for layer in model.layers],
)
features = extractor(X_train.values)
list(map(lambda weights: weights.shape, features))
# [TensorShape([105, 4]),
# TensorShape([105, 3]),
# TensorShape([105, 3]),
# TensorShape([105, 2]),
# TensorShape([105, 2])]
Что я понимаю имеет следующий вид:
features[0]
- входные значения X_train
features[1]
- веса первого плотного слоя features[2]
- веса плотного слоя после сигмовидной функции активации features[3]
- веса второго плотного слоя features[4]
- веса второго плотного слоя после функции активации softmax
Я не понимаю следующего:
Как мне узнать значение вклада каждой функции во входном слое (4 функции) в вес первого плотного слоя?
Разве не должна быть где-нибудь матрица размером 4 x 3 = 12 весов, показывающая вклад каждой из 4 характеристик в каждый из 3 нейронов в первом плотном слое?
Без такого понимания этот алгоритм представляет собой черный ящик.