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

Ziq*_*iqi 1 neural-network lstm keras

我正在使用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'])
Run Code Online (Sandbox Code Playgroud)

同一数据集上,使用当前行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
Run Code Online (Sandbox Code Playgroud)

,其中0,2表示类标签

但是当A行改为

model.add(LSTM(100))
Run Code Online (Sandbox Code Playgroud)

我得到了不同的结果:

    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
Run Code Online (Sandbox Code Playgroud)

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

Mir*_*ber 5

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

对于theano后端,添加

from numpy.random import seed
seed(1)
Run Code Online (Sandbox Code Playgroud)

到你的代码顶部.

对于tensorflow后端,请添加

from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)
Run Code Online (Sandbox Code Playgroud)

到你的代码顶部.

以上代码摘自此博客文章.