【问题标题】:Keras Masking for RNN with Varying Time Steps具有不同时间步长的 RNN 的 Keras 掩蔽
【发布时间】:2017-07-10 05:36:33
【问题描述】:

我正在尝试使用具有不同时间长度的序列在 Keras 中拟合 RNN。我的数据位于格式为(sample, time, feature) = (20631, max_time, 24) 的Numpy 数组中,其中max_time 在运行时确定为具有最多时间戳的样本可用的时间步数。我已经用0 填充了每个时间序列的开头,显然最长的除外。

我最初是这样定义我的模型的......

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(max_time, 24)))
model.add(LSTM(100, input_dim=24))
model.add(Dense(2))
model.add(Activation(activate))
model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01))
model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y))

为了完整起见,这里是损失函数的代码:

def weibull_loglik_discrete(y_true, ab_pred, name=None):
    y_ = y_true[:, 0]
    u_ = y_true[:, 1]
    a_ = ab_pred[:, 0]
    b_ = ab_pred[:, 1]

    hazard0 = k.pow((y_ + 1e-35) / a_, b_)
    hazard1 = k.pow((y_ + 1) / a_, b_)

    return -1 * k.mean(u_ * k.log(k.exp(hazard1 - hazard0) - 1.0) - hazard1)

这是自定义激活函数的代码:

def activate(ab):
    a = k.exp(ab[:, 0])
    b = k.softplus(ab[:, 1])

    a = k.reshape(a, (k.shape(a)[0], 1))
    b = k.reshape(b, (k.shape(b)[0], 1))

    return k.concatenate((a, b), axis=1)

当我拟合模型并做出一些测试预测时,测试集中的每个样本都会得到完全相同的预测,这看起来很可疑。

如果我移除遮罩层,情况会好转,这让我觉得遮罩层有问题,但据我所知,我完全按照文档进行了操作。

掩蔽层是否有错误指定?我还缺少其他东西吗?

【问题讨论】:

  • 我有几个cmets:1.为什么float32的准确率实际上是1e-7,却设置了1e-35常量?
  • 就我的赏金而言,我真的只是想要一个为不同长度的序列正确使用遮罩层的示例。不用担心网络细节。
  • 1e-35 来自这里:ragulpr.github.io/assets/…,p。 53. 只是为了避免“数值不稳定”(因为这里没有定义零)。认为应该更高?

标签: python numpy neural-network keras recurrent-neural-network


【解决方案1】:

您实现屏蔽的方式应该是正确的。如果您有形状为 (samples, timesteps, features) 的数据,并且您想使用与 features 参数大小相同的零掩码来掩盖缺少数据的时间步,则添加 Masking(mask_value=0., input_shape=(timesteps, features))。见这里:keras.io/layers/core/#masking

您的模型可能过于简单,和/或您的时期数可能不足以使模型区分您的所有类。试试这个模型:

model = Sequential()
model.add(Masking(mask_value=0., input_shape=(max_time, 24)))
model.add(LSTM(256, input_dim=24))
model.add(Dense(1024))
model.add(Dense(2))
model.add(Activation(activate))
model.compile(loss=weibull_loglik_discrete, optimizer=RMSprop(lr=.01))
model.fit(train_x, train_y, nb_epoch=100, batch_size=1000, verbose=2, validation_data=(test_x, test_y)) 

如果这不起作用,请尝试将 epoch 加倍几次(例如 200、400),看看是否会改善结果。

【讨论】:

    【解决方案2】:

    没有实际数据我无法验证,但我在使用 RNN 时也有类似的经历。就我而言,规范化解决了这个问题。向您的模型添加规范化层。

    【讨论】:

    • 我很抱歉在这件事上擅离职守,我感谢大家的意见。这确实是问题所在——我在尝试拼凑一个最小可行示例时跳过了规范化,但这是一个致命错误。对于那些感兴趣的人,结果模型(虽然不同的数据)在这里:github.com/daynebatten/keras-wtte-rnn
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 2022-01-14
    • 2018-09-15
    • 2019-01-20
    • 2017-10-31
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多