Я использовал матричное умножение, чтобы проверить предсказания нейронной сети, обученной с использованием керас, и заметил небольшое расхождение в предсказаниях керас и ручных вычислениях.Я думал, что проблема была в том, что я использовал float64 вместо float32, но у меня та же проблема с float32.Без сомнения, я делаю что-то глупое.Я использую бэкэнд тензорного потока без графического процессора.
(Это не совсем минимальный рабочий пример, но я хотел использовать сеть, которая успешно сходится.)
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