Keras顺序模型与功能性API中的不一致

时间:2018-08-01 07:38:25

标签: python tensorflow keras

我正在尝试使用功能性API重写顺序模型,但是当我这样做时,使用功能性API创建的模型在fit()阶段停留在非常低的精度上,并且也没有任何改进在各个时期之间的准确性。

在对开发模型提供了一段时间的研究之后,这些模型提供了类似的结果,我将种子值设置为如下,但仍然没有运气;

import numpy as np
np.random.seed(2017)

from tensorflow import set_random_seed
set_random_seed(2017)

import random as rn
rn.seed(2017) 

使用功能性API定义的模型代码如下;

length=257
inputs = Input(shape=(length,))
embedding = Embedding(vocab_size, 100, weights=[embedding_matrix], input_length=257, trainable=False)(inputs)
bilstm = Bidirectional(LSTM(10, return_sequences=True))(embedding)
dense1 = Dense(10, activation='sigmoid')(bilstm)
bilstm2 = Bidirectional(LSTM(10))(dense1)
dense2 = Dense(1)(bilstm2)
output = Activation('relu')(dense2)
new_model = Model(inputs=inputs, outputs=output)

使用顺序模型创建的模型如下;

model = Sequential()
e = Embedding(vocab_size, 100, weights=[embedding_matrix], input_length=257, trainable=False)
model.add(e)
model.add(Bidirectional(LSTM(10, return_sequences=True)))
model.add(Dense(10, activation='sigmoid'))
model.add(Bidirectional(LSTM(10)))
model.add(Dense(1))
model.add(Activation('relu')) 
model.compile(loss='binary_crossentropy', optimizer='adam', metrics = ['accuracy'])

在两种情况下,我都在shuffle=False函数中设置了fit()

model.summary()返回相同的输出,除了输入层。在fit()过程中,顺序模型的准确性在每个时期都会提高,但是使用功能性API创建的模型仍保持较低的值,并且在周期内不会提高。

我知道两个模型都不会返回相同的精度,但是我想知道为什么一个模型的精度会提高而另一个模型在周期内却没有提高。请注意,x_trainy_train也相同。

我在这里想念什么,

1 个答案:

答案 0 :(得分:2)

激活'relu'不应用作模型的输出。 (此种子可能也会使顺序模型陷入困境,但是如果没有种子,您可能会对任何模型都感到幸运/不走运。)

此激活具有零区域,其零梯度。如果您的模型到达此区域(当您只有一个神经元时,这很可能会发生),它将完全停止反向传播。

  • 如果您的模型要在0到1之间输出,请使用Activation('sigmoid')
  • 如果要从0输出到无穷大,请尝试Activation('softplus')
  • 如果要从0到C输出,请使用Lambda(lambda x: C*K.sigmoid(x))