我试图从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实现有什么问题。在
我没有用python测试实现,而是用c++测试。我把
eps
放在平方根内,结果与10e-4或更好的keras实现类似:相关问题 更多 >
编程相关推荐