在numpy中重建Keras模型

2024-10-19 16:24:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从keras模型中获取经过训练的权重,并尝试在numpy中实现forward模型。目前,我得到的结果与我的keras模型的输出是不同的。在

我已经将差异缩小到实现批处理标准化的地方。只是想知道我的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模型如下:

^{pr2}$

还要注意1。我知道你没有把BN放在最后一层。我只是简单地删减到第一层,在那里我发现了差异。2这种差异并不是由于float64和float32的问题造成的(我最大的差异是0.6左右)。在

总之,我的BN实现有什么问题。在


Tags: 模型returnvardefnph2差异mean
1条回答
网友
1楼 · 发布于 2024-10-19 16:24:03

我没有用python测试实现,而是用c++测试。我把eps放在平方根内,结果与10e-4或更好的keras实现类似:

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

相关问题 更多 >