В настоящее время я работаю над реализацией задачи прогнозирования временных рядов, которая будет создавать метки в последовательности (пакет, шаги, функции) -> (пакет, шаги, классы). У меня есть слой 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