Как понять веса "извлечения признаков" в простой нейронной сети Tensorflow / Keras? - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь максимально использовать 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])]

Что я понимаю имеет следующий вид:

  1. features[0] - входные значения X_train
  2. features[1] - веса первого плотного слоя
  3. features[2] - веса плотного слоя после сигмовидной функции активации
  4. features[3] - веса второго плотного слоя
  5. features[4] - веса второго плотного слоя после функции активации softmax

Я не понимаю следующего:

  1. Как мне узнать значение вклада каждой функции во входном слое (4 функции) в вес первого плотного слоя?

  2. Разве не должна быть где-нибудь матрица размером 4 x 3 = 12 весов, показывающая вклад каждой из 4 характеристик в каждый из 3 нейронов в первом плотном слое?

Без такого понимания этот алгоритм представляет собой черный ящик.

...