Моя задача - классифицировать китайские предложения.Я использовал bert для извлечения функций, а затем провел обучение на основе функций и меток предложений.Мне кажется, что я могу получить функции, используя концентратор тензорного потока
import tensorflow as tf
import tensorflow_hub as hub
bert_module = hub.Module("https://tfhub.dev/google/bert_uncased_L-12_H-768_A-12/1")
bert_inputs = ... # a list of sentences
bert_outputs = bert_module(bert_inputs, signature="tokens", as_dict=True)
pooled_output = bert_outputs["pooled_output"]
sequence_output = bert_outputs["sequence_output"]
sess = tf.Session()
sess.run(tf.global_variables_initializer())
with sess.as_default():
bert_features_sentence = pooled_output.eval() #sentence features
bert_features_tokens = sequence_output.eval() #token features
Я также могу получить функции, используя "extract_features.py"
python extract_features.py \
--input_file=/tmp/input.txt \
--output_file=/tmp/output.jsonl \
--vocab_file=$BERT_BASE_DIR/vocab.txt \
--bert_config_file=$BERT_BASE_DIR/bert_config.json \
--init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
--layers=-1 \
--max_seq_length=128 \
--batch_size=8
Так что вопрос: Дают ли эти два метода одинаковые результаты? Я испробовал оба метода и обнаружил, что точность обучения, основанная на функциях, полученных этими двумя методами, значительно отличается (36% и 63%).Интересно, почему?Я также обнаружил, что «bert_features_tokens» в первой части имеет фиксированное количество токенов, например, n_sentence * 128 * 768, в то время как «output.jsonl» во второй части имеет гибкое количество токенов, например, n_sentence * Flexible_sen_length * 768. Это причина?