我使用矩阵乘法来检查使用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