Я пытаюсь воспроизвести через Numpy вывод, который я получу, используя Keras 'model.predict()
.Мои уровни модели keras следующие:
_________________________________________________________________
Layer (type) Output Shape Param
=================================================================
main_input (InputLayer) (None, 10, 76) 0
_________________________________________________________________
masking (Masking) (None, 10, 76) 0
_________________________________________________________________
rnn (SimpleRNN) [(None, 64), (None, 64)] 9024
_________________________________________________________________
dropout_15 (Dropout) (None, 64) 0
_________________________________________________________________
dense1 (Dense) (None, 64) 4160
_________________________________________________________________
denseoutput (Dense) (None, 1) 65
=================================================================
Total params: 13,249
Trainable params: 13,249
Non-trainable params: 0
Второй вывод слоя SimpleRNN - это состояние, возвращаемое return_state=True
.
Я пробовал 2 разных подхода.Сначала я вычислил WXt + Us + b , где W - это ядро, Xt - это ввод, U - рекуррентное ядро., s - это состояние, полученное через return_state=True
, а b - это смещение.Это вернуло результат, аналогичный полученному с помощью predict()
(функция mult_1
).
После этого я попробовал аналогичный подход с функцией mult_2
, но получил худшие результаты, чем с mult_1
.
def mult_1(X):
X = ma.masked_values(X, -99)
s = (model.predict(X)[1])
W = (model.get_weights()[0])
U = (model.get_weights()[1])
b = (model.get_weights()[2])
Wx = np.dot(X[:,-1,:], W)
Us = np.dot(s,U)
output = Wx + Us + b
return np.tanh(output)
def mult2(X):
max_habitantes = X.shape[1]
i = 0
s_0 = np.ones((X.shape[0], 64)) # initial state
X = ma.masked_values(X, -99)
while i < 10:
Xt = X[:,i,:]
if i == 0:
s = s_0
else:
s = output
W = (model.get_weights()[0])
U = (model.get_weights()[1])
b = (model.get_weights()[2])
Wx = np.dot(Xt, W)
Us = np.dot(s,U)
output = np.tanh(Wx + Us +b)
i = i+1
return output
Прогнозы несколько схожи, хотя и ничем не отличаются от прогнозов predict()
.Я делаю некоторые умножения неправильно?