Воссоздание модели Keras в NumPy - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь взять обученные веса из модели керас и пытаюсь реализовать прямую модель в numpy.В настоящее время результаты, которые я получаю, отличаются от результатов моей модели keras.

Я сократил разницу до того, где я реализую batch_normalisation.Просто интересно, что я сделал не так с моей реализацией BN ниже:

weights = model.get_weights()
h1_w = weights[0] #no bias term

h2_w, h2_b, bn2_gamma, bn2_beta, bn2_mean, bn2_var = weights[1:7]

def relu(x, w, b):
    return np.maximum(0, np.matmul(x, w) + b)

def bn(x, mean, var, gamma, beta, eps=1e-3):
    return (x-mean)/(np.sqrt(var) + eps)*gamma + beta

def reconstruct_model(x, x_offset):
    h1_act = np.maximum(0, np.matmul(x, h1_w))   
    h2_act = relu(h1_act, h2_w, h2_b)
    h2 = bn(h2_act, bn2_mean, bn2_var, bn2_gamma, bn2_beta)
    return h2

Для сравнения моя модель Keras выглядит следующим образом:

x_in = Input(shape=(X_train.shape[1:]))
h = Dense(20, use_bias=False, activation='relu', kernel_regularizer=l1(1e-5))(x_in)
h = Dense(10, activation='relu')(h)
out = BatchNormalization()(h)

model = Model([x_in], out)
model.compile(loss='mse', optimizer='adam')

Также обратите внимание, что 1. Я понимаю, что вы неположить BN на последний слой.Я просто урезал до первого слоя, где я заметил расхождения.2. Разница не связана с проблемами float64 и float32 (моя самая большая разница была около 0,6).

В общем, что не так с моей реализацией BN.

1 Ответ

0 голосов
/ 13 июня 2018

Я тестировал не реализацию на python, а на c ++.Я помещаю eps в квадратный корень, и мои результаты похожи на реализацию keras на 10e-4 или лучше:

def bn(x, mean, var, gamma, beta, eps=1e-3):
    return (x-mean)/(np.sqrt(var + eps))*gamma + beta
...