【发布时间】:2019-05-09 20:22:00
【问题描述】:
我正在尝试通过 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() 的预测没有太大区别。我做错了一些乘法吗?
【问题讨论】:
标签: python python-3.x numpy keras recurrent-neural-network