尝试重新创建 Adhikari 等人的 BiLSTM 模型。 2019 年 (LSTM_reg) 在 Tensorflow 中

Trying to recreate BiLSTM model from Adhikari et al. 2019 (LSTM_reg) in Tensorflow

我正在尝试在 TensorFlow 中从 this paper 重新创建此模型 LSTM_reg 以用于解决我的问题。我想出了以下代码:

def get_model(lr=0.001):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(nb_words, output_dim=embed_size, weights=[embedding_matrix], input_length = maxlen, trainable=False))
    model.add(tf.keras.layers.Dropout(0.2)) # embedding dropouts
    model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(256, return_sequences=True, recurrent_dropout=0.2, activation = 'tanh'))) # weight drop on recurrent layers using recurrent_dropout
    model.add(tf.keras.layers.MaxPooling1D(pool_size=2, padding = 'valid'))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.Dense(512, activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(20))
    model.add(tf.keras.layers.Activation('sigmoid'))

    model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam', metrics = ['accuracy', tfa.metrics.F1Score(num_classes = 20)])
    return model

我做对了吗?在训练我的数据集时得到了一些非常奇怪的值,因此想知道我的实现。这个模型有一个 pytorch 实现 here。但是我不确定我是否正确地复制了这个。

我能看到的一个主要区别是这篇论文使用了全局最大池化,而你只使用了内核大小为 2 的最大池化:

def get_model(lr=0.001):
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(nb_words, output_dim=embed_size, weights=[embedding_matrix], input_length = maxlen, trainable=False))
    model.add(tf.keras.layers.Dropout(0.2)) # embedding dropouts
    model.add(tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(256, return_sequences=True, recurrent_dropout=0.2, activation = 'tanh'))) # weight drop on recurrent layers using recurrent_dropout
    model.add(tf.keras.layers.GlobalMaxPooling1D())
    model.add(tf.keras.layers.Dense(512, activation='relu'))
    model.add(tf.keras.layers.Dropout(0.5))
    model.add(tf.keras.layers.Dense(20))
    model.add(tf.keras.layers.Activation('sigmoid'))

    model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam', metrics = ['accuracy', tfa.metrics.F1Score(num_classes = 20)])
    return model

我显然没有你的数据,所以请确保参数设置正确:https://keras.io/api/layers/pooling_layers/global_max_pooling1d/

另一个变化是你分享的pytorch repo在LSTM之后有一个ReLU(我不知道为什么)。您可以尝试将其添加进去,看看是否有帮助。