【发布时间】:2020-03-10 14:40:27
【问题描述】:
为了真正理解卷积层,我在basic numpy中重新实现了单个keras Conv2D层的前向方法。两个接缝的输出几乎相同,但有一些细微差别。
获取 keras 输出:
inp = K.constant(test_x)
true_output = model.layers[0].call(inp).numpy()
我的输出:
def relu(x):
return np.maximum(0, x)
def forward(inp, filter_weights, filter_biases):
result = np.zeros((1, 64, 64, 32))
inp_with_padding = np.zeros((1, 66, 66, 1))
inp_with_padding[0, 1:65, 1:65, :] = inp
for filter_num in range(32):
single_filter_weights = filter_weights[:, :, 0, filter_num]
for i in range(64):
for j in range(64):
prod = single_filter_weights * inp_with_padding[0, i:i+3, j:j+3, 0]
filter_sum = np.sum(prod) + filter_biases[filter_num]
result[0, i, j, filter_num] = relu(filter_sum)
return result
my_output = forward(test_x, filter_weights, biases_weights)
结果大致相同,但以下是一些差异示例:
Mine: 2.6608338356018066
Keras: 2.660834312438965
Mine: 1.7892705202102661
Keras: 1.7892701625823975
Mine: 0.007190803997218609
Keras: 0.007190565578639507
Mine: 4.970898151397705
Keras: 4.970897197723389
我尝试将所有内容都转换为 float32,但这并不能解决问题。有什么想法吗?
编辑: 我绘制了错误的分布,它可能会对正在发生的事情有所了解。可以看出,误差都具有非常相似的值,分为四组。然而,这些误差并不完全是这四个值,而几乎都是围绕这四个峰值的唯一值。
我对如何让我的实现与 keras 完全匹配非常感兴趣。不幸的是,当实现多层时,错误似乎成倍增加。任何见解都会对我有很大帮助!
【问题讨论】:
-
你在 Keras 中使用
padding='same'吗? -
是的,没错!
标签: python numpy keras floating-point precision