我正在使用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,这对我没有意义,我认为两行应该相同?我误解了什么吗?
答案 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。