Прогнозы Keras не совсем соответствуют ручным вычислениям - PullRequest
0 голосов
/ 23 февраля 2019

Я использовал матричное умножение, чтобы проверить предсказания нейронной сети, обученной с использованием керас, и заметил небольшое расхождение в предсказаниях керас и ручных вычислениях.Я думал, что проблема была в том, что я использовал 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...