Я пытаюсь взять обученные веса из модели керас и пытаюсь реализовать прямую модель в 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.