我目前正在尝试实现一个模型,该模型可以根据训练数据检测特定序列,如下所示:
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 在这里可能不是最优的。

