流序列检测(二进制分类)LSTM/GRU

数据挖掘 机器学习 喀拉斯 张量流 lstm rnn
2022-03-13 16:29:58

我目前正在尝试实现一个模型,该模型可以根据训练数据检测特定序列,如下所示:

x_train = [...] # shape: (timesteps, features)
y_train = [[0], [0], [0], [0], [1]]  # shape: (timesteps, 1)

该模型:

    rnn = GRU(units=32,
        activation="tanh", recurrent_activation="sigmoid",
        recurrent_dropout=0.0, stateful=True,
        return_sequences=True,
        unroll=False, use_bias=True, reset_after=True,
        dropout=0.2)

    dense_pre = Dense(units=32, activation=relu)
    dense_post = Dense(units=1, activation="sigmoid")

    # Input
    input_shape = (39, 20)
    inputs = Input(
        shape=input_shape,
        batch_size=batch_size,
        dtype=tf.float32
    )

    # Feed input through the network

    outputs = dense_pre(inputs)
    outputs = rnn(outputs)
    outputs = dense_post(outputs)

    outputs = tf.reshape(outputs, tf.shape(outputs)[:-1])

    adam_opt = Adam()
    metrics = ["accuracy"]

    model = Model(inputs=inputs, outputs=outputs)
    model.compile(optimizer=adam_opt,
        loss=binary_crossentropy,
        metrics=metrics)

通过stateful=True模型应该学会支持“流”功能,这样当我们进行推理时,我们可以分块地输入网络数据,而无需手动重置状态。

return_sequences=True我们可以为每个时间步生成一个概率

我目前面临的问题是它以某种方式收敛得太快,同时很快达到低损失(我认为低损失会导致学习过程的停滞)。我想知道这种方法是否在某种程度上是次优的,或者我是否在这里遗漏了一些非常重要的东西。

我也怀疑损失函数/y_true 在这里可能不是最优的。

火车加速 火车损失

0个回答
没有发现任何回复~