【问题标题】:Inconsistency in Keras Sequential model vs Functional APIKeras Sequential 模型与功能 API 的不一致
【发布时间】:2018-08-01 20:51:39
【问题描述】:

我正在尝试使用功能 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'])

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

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

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

我在这里错过了什么,

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    activatoin 'relu' 不应用作模型的输出。 (这个种子可能也会使顺序模型卡住,但没有种子,你可能会幸运/不幸地使用任何模型。

    这个激活有一个零梯度的零区域。如果你的模型到达这个区域(当你只有一个神经元时这特别有可能),它将完全停止反向传播。

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

    【讨论】:

    • 自从将激活函数更改为“sigmoid”后,我还没有遇到过精度没有随着时间的推移而提高的问题。什么情况下适合使用“relu”,一般是用在中间层吗?
    • 我不是这个领域的专家,我个人不惜一切代价避免使用relu(它总是可以归零并留在那里)。当你有很多神经元时,有一些为零是没有问题的(这毕竟是意图)。但通常“一切”都归零,模型冻结。必须谨慎使用 Relu,调整学习率,并且可能还需要进行一些批量标准化。
    • 是的,一般只用在中间层。它有一些很好的特性,因为它会产生非线性和稀疏性。他们说它更快,许多人说有很多优势。我真的不能谈论这个。
    • 关于设置“种子”值,在调整和训练模型时使用种子值(就像我所做的那样)是否有益,因为它可以消除种子引入的随机性,因此可以进行任何改进在模型中可以关联到架构而不是随机种子值?关于使用“relu”,在多输入模型中会有所帮助,比如我有 input-a 是主输入,input-b 是辅助输入(支持信息),在中使用“relu”是否有意义辅助(输入-b)路径以减少它对预测的影响,还是有更好的方法来做到这一点?
    • sigmoid 的导数随着值的增加而变为 0。这会导致梯度消失问题,因为早期层没有训练。但是对于 ReLU,只要输入为正,梯度为 1。这很好地消除了梯度消失问题。这是使用 ReLU 的原因之一。使用带有 mse 损失的 sigmoid 输出激活是一个非常糟糕的主意。
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2019-03-31
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多