keras lstm(100)和lstm(单位= 100)产生不同的结果?

时间:2017-08-30 21:41:22

标签: neural-network keras lstm

我正在使用keras 2.0.2为分类任务创建一个lstm网络。网络拓扑如下:

from numpy.random import seed
seed(42)
from tensorflow import set_random_seed
set_random_seed(42)
import os
#os.environ['PYTHONHASHSEED'] = '0'

model = Sequential()
model.add(embedding_layer)    
model.add(LSTM(units=100)) #line A
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

相同数据集上,使用当前行A,我得到一个结果:

    precision    recall  f1  support
0   0.68    0.58    0.63    305
2   0.92    0.95    0.93    1520
avg 0.8 0.76    0.78    1825

,其中0,2表示类标签

但是当A行改为

model.add(LSTM(100))

我获得了不同的结果:

    precision    recall  f1  support
0   0.66    0.58    0.62    305
2   0.92    0.94    0.93    1520
avg 0.79    0.76    0.77    1825

根据keras文档https://keras.io/layers/recurrent/#lstm,这对我没有意义,我认为两行应该相同?我误解了什么吗?

1 个答案:

答案 0 :(得分:5)

model.add(LSTM(100))model.add(LSTM(units=100))是等效的。可能导致结果之间差异的是该过程中的随机性。为了避免这种随机性并获得可重现的结果,您应该在代码的开头指定种子。

对于theano后端,添加

from numpy.random import seed
seed(1)

到代码的顶部。

对于tensorflow后端,添加

from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)

到代码的顶部。

上述代码取自this blog post