Keras预测输出与手动计算不太匹配

时间:2019-02-22 22:38:02

标签: python-3.x keras

我使用矩阵乘法来检查使用keras训练的神经网络的预测,我注意到在keras预测和手计算上存在细微差异。我以为问题是因为我使用的是float64而不是float32,但是我对float32也有同样的问题。毫无疑问,我正在做一些愚蠢的事情。我正在使用没有GPU的Tensorflow后端。

(这不是一个最小的工作示例,但我想使用一个成功收敛的网络。)

from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.utils import np_utils

import numpy as np

np.random.seed(220219)

X = np.array([[0,0], [1,0], [0,1], [1,1]], np.float32)
y = np.array([[1,0], [0,1], [0,1], [1,0]], np.float32)

model = Sequential()
model.add(Dense(5, input_shape = (2,), use_bias=True))
model.add(Activation('relu'))
model.add(Dense(2))
model.add(Activation('softmax'))

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])

model.fit(X, y, epochs=1000, batch_size=1, verbose=0);

手工计算:

def relu(x):
    return np.maximum(x, 0)

def softmax(x):
    return np.exp(x)/np.sum(np.exp(x))

l1 = model.layers[0].get_weights()
z1 = relu(X @ l1[0] + l1[1])
l2 = model.layers[2].get_weights()
z2 = z1 @ l2[0] + l2[1]

例如,这两个值略有不同:

model.predict(X)[2][0] #0.25347748
[list(softmax(x)) for x in z2][2][0] #0.25347745

0 个答案:

没有答案