我目前正在执行时间序列预测任务,该任务将在整个序列(批处理,步骤,特征)->(批处理,步骤,类)中生成标签。我有一个TimeDistributed层作为我的最后一层,由于这个原因,我得到了三维输出,我的准确性似乎越来越差。我想知道这是否是由于在损耗中未正确计算三维输出。有更好的方法吗?
K.clear_session()
def acc(y_true, y_pred):
y_pred = tf.argmax(y_pred, 2)
y_true = tf.squeeze(y_true, -1)
return categorical_accuracy(y_true, y_pred)
def loss(labels, logits):
return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)
def build_model():
char_in = Input(shape=(None, None)) #sequence length, word char length
char_emb = Embedding(char_emb_weights.shape[1], 32, weights=char_emb_weights, trainable=False)(char_in)
char_GRU = TimeDistributed(Bidirectional(GRU(32, recurrent_initializer='glorot_uniform'), 'concat'))(char_emb)
lstm = LSTM(64, return_sequences=True, recurrent_initializer='glorot_uniform')(char_GRU)
dense = TimeDistributed(Dense(16, activation='relu'))(lstm)
output = TimeDistributed(Dense(3, activation='softmax'))(dense)
#output = CRF(target_size, sparse_target=True)(dense)
m = Model(inputs=[word_in, char_in], outputs=output)
m.compile(optimizer='sgd', loss=loss, metrics=[acc])
return m
答案 0 :(得分:0)
我解决了这个问题,使用的模型每层具有较低的隐藏节点,从而降低了模型的复杂性并允许收敛。
话虽如此,我仍在寻找关于这是为什么的解释,我也对三维输出以及如果有人能够提供答案如何计算随时间的损失感到好奇。