hdims = 128
vocab_size = tokenizer.vocab_size

inputs = Input(shape=(maxlen, ))
x = Embedding(input_dim=vocab_size, output_dim=hdims, mask_zero=True)(inputs)
# x = Dropout(0.1, noise_shape=(None, maxlen, hdims))(x)
# x = LayerNormalization()(x)
x = Bidirectional(LSTM(hdims, return_sequences=True), merge_mode="ave")(x)
# x = Dense(hdims)(x)
x = Dense(num_classes)(x)
# x = Dropout(0.3)(x)
crf = CRF(lr_multiplier=1, trans_initializer="glorot_normal", trainable=True)
outputs = crf(x)

base = Model(inputs=inputs, outputs=outputs)
model = ModelWithCRFLoss(base)
model.summary()
model.compile(optimizer="adam")

batch_size = 64
epochs = 7
steps_per_epoch = len(X_train) // batch_size + 1
gen = batch_paded_generator(X_train, y_train, label2id, tokenizer, batch_size,
                            epochs)

X_val, y_val = load_dataset("dev")
data_title_pairs = [(X_train, y_train, "train"), (X_val, y_val, "dev")]
ner = NamedEntityRecognizer(model, tokenizer, maxlen, id2label)
evaluator = NEREvaluator(ner, data_title_pairs)

if __name__ == "__main__":
mask = Lambda(lambda x: tf.not_equal(x, 0))(inputs) # 全局mask
x = Embedding(input_dim=vocab_size, output_dim=hdims)(inputs)
x = LayerNormalization()(x)
# 用三层Conv1D替代BiLSTM
x = Conv1D(128, 3, activation="relu", padding="same")(x)
x = Conv1D(128, 3, activation="relu", padding="same")(x)
x = Conv1D(128, 3, activation="relu", padding="same")(x)
x = Dense(hdims)(x)
x = Dense(num_classes)(x)
crf = CRF(trans_initializer="glorot_uniform")
# CRF需要mask来完成不定长序列的处理,这里是手动传入
# 可以设置Embedding参数mask_zero=True,避免手动传入
outputs = crf(x, mask=mask)

base = Model(inputs=inputs, outputs=outputs)
model = ModelWithCRFLoss(base)
model.summary()
model.compile(optimizer="adam")

X_train, y_train = preprocess_dataset(X_train, y_train, maxlen, tokenizer, lbtokenizer)
X_val, y_val = load_dataset("dev")
X_val, y_val = preprocess_dataset(X_val, y_val, maxlen, tokenizer, lbtokenizer)

batch_size = 32
epochs = 10
file = "weights/weights.task.pos.bilstm.crf"
model.fit(
    X_train,
    y_train,
    batch_size=batch_size,
    epochs=epochs,
Beispiel #3
0
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras import *
from crf import CRF, ModelWithCRFLoss

vocab_size = 5000
hdims = 128
inputs = Input(shape=(None, ), dtype=tf.int32)
# 设置mask_zero=True获得全局mask
x = Embedding(vocab_size, hdims, mask_zero=True)(inputs)
x = Bidirectional(LSTM(hdims, return_sequences=True))(x)
x = Dense(4)(x)
crf = CRF(trans_initializer="glorot_uniform")
outputs = crf(x)
base = Model(inputs, outputs)
model = ModelWithCRFLoss(base)
model.summary()
model.compile(optimizer="adam")
X = tf.random.uniform((32 * 100, 64),
                      minval=0,
                      maxval=vocab_size,
                      dtype=tf.int32)
y = tf.random.uniform((32 * 100, 64), minval=0, maxval=4, dtype=tf.int32)
model.fit(X, y)
tags = model.predict(X)
print(tags.shape)