Загрузите модель из Кераса и исследуйте детали - PullRequest
0 голосов
/ 05 мая 2020

Я использую Keras для соответствия функции, и я новичок в Keras. С очень простой сетью Keras очень хорошо подходит для моей функции, я просто хочу знать, что это за функция, и попытаться понять, почему она работает очень хорошо. Но функция «предсказать» скрывает детали.

Вот код, который я создаю для сети:

import numpy as np
import tensorflow as tf
from tensorflow import keras

LABEL_COLUMN = "shat"
BATCH_SIZE = 16
EPOCHS = 20

trainfilePath = "F:\\PyworkingFolder\\WWSHat\\_Data\\alpha0train.csv"
testfilePath = "F:\\PyworkingFolder\\WWSHat\\_Data\\alpha0test.csv"

with open(trainfilePath, encoding='utf-8') as txtContent:
    trainArray = np.loadtxt(txtContent, delimiter=",")

with open(testfilePath, encoding='utf-8') as txtContent:
    testArray = np.loadtxt(txtContent, delimiter=",")

trainSample = trainArray[:, 0:14]
trainLable = trainArray[:, 14]
testSample = testArray[:, 0:14]
testLable = testArray[:, 14]

model = keras.Sequential([
    keras.layers.Dense(14, activation='relu', input_shape=[14]),
    keras.layers.Dense(15, activation='relu'),
    keras.layers.Dense(1)
])

optimizer = tf.keras.optimizers.RMSprop(0.001)
# optimizer = keras.optimizers.Adadelta(lr=1.0, rho=0.95, epsilon=None, decay=0.0)
model.compile(loss='mse',
              optimizer=optimizer,
              metrics=['mae', 'mse'])

model.summary()
history = model.fit(trainSample, trainLable, epochs=EPOCHS, batch_size=BATCH_SIZE)
model.evaluate(testSample, testLable, verbose=1)
model.save("F:\\PyworkingFolder\\WWSHat\\_Data\\alpha0.h5")

Я понимаю, что слои - это весовые матрицы и базовые матрицы, это работает как

out = max (0, вес * ввод + базис)

После некоторого поиска я обнаружил, что могу прочитать файл .h5, используя

import h5py
import numpy as np

FILENAME = "F:\\PyworkingFolder\\WWSHat\\_Data\\alpha0.h5"

with h5py.File(FILENAME, 'r') as f:
    dense_1 = f['/model_weights/dense_1/dense_1']
    dense_1_bias = dense_1['bias:0'][:]
    dense_1_kernel = dense_1['kernel:0'][:]

    dense_2 = f['/model_weights/dense_2/dense_2']
    dense_2_bias = dense_2['bias:0'][:]
    dense_2_kernel = dense_2['kernel:0'][:]

# print("Weight matrix 1:\n")
# print(dense_1_kernel)

# print("Basis matrix 1:\n")
# print(dense_1_bias)

# print("Weight matrix 2:\n")
# print(dense_2_kernel)

# print("Basis matrix 2:\n")
# print(dense_2_bias)


def layer_output(v, kernel, bias):
    return np.dot(v, kernel) + bias


reluFunction = np.vectorize(lambda x: x if x >= 0.0 else 0.0)

testV = np.array([[-0.004090321213057993,
                   0.009615388501909157,
                   -0.24223693596921558,
                   0.015504079563927319,
                   -0.02659541428995062,
                   0.018512968977547152,
                   0.00836788544720289,
                   -0.10874776132746002,
                   -0.045863474556415526,
                   -0.010195799916571194,
                   0.09474219315939948,
                   0.03606698737846194,
                   -0.004560110004741025,
                   0.028042417959738858]])


output_1 = layer_output(testV, dense_1_kernel, dense_1_bias)
output_2 = reluFunction(output_1)
output_3 = layer_output(output_2, dense_2_kernel, dense_2_bias)
output_4 = reluFunction(output_3)

, однако, результат output_4 сильно отличается от того, что я использую

loaded_model = keras.models.load_model("F:\\PyworkingFolder\\WWSHat\\_Data\\alpha0.h5")
predicted = loaded_model(testV)

«Прогнозируемое» очень близко к истинной действительности, в то время как «output_4» далеко от истины. Я застрял здесь и не знаю, почему, и не смог найти информацию о том, как извлечь нужную мне функцию из модели Keras, мне нужна ваша помощь!

Спасибо!

1 Ответ

1 голос
/ 05 мая 2020
model = keras.Sequential([
    keras.layers.Dense(14, activation='relu', input_shape=[14]),
    keras.layers.Dense(15, activation='relu'),
    keras.layers.Dense(1)
])

В вашей модели 3 слоя, последний плотный слой также имеет вес и смещения, вы не учли их в своих расчетах.

...