Создание сиамской сети с оценщиком тензорного потока и концентратором

Я пытаюсь настроить универсальный кодировщик предложений, создав сиамскую сеть с кодировщиком. Я хотел бы обучить веса модуля универсального кодировщика tensorflow_hub во время обучения, но я не уверен, как это сделать с помощью оценщика.

Мои вопросы: если с моей настройкой ниже, используя два hub.text_embedding_column, будет ли она обучать две отдельные сети, а не обучать их, как будто они являются сиамской сетью. Если веса не разделены, как бы я изменил его, чтобы веса были разделены и обучены. Я могу загрузить модули с локальной машины, если это поможет.

def train_and_evaluate_with_module(hub_module, train_module=False):
    embedded_text_feature_column1 = hub.text_embedding_column(
      key="sentence1", module_spec=hub_module, trainable=train_module)

    embedded_text_feature_column2 = hub.text_embedding_column(
      key="sentence2", module_spec=hub_module, trainable=train_module)


    estimator = tf.estimator.DNNClassifier(
      hidden_units=[500, 100],
      feature_columns=[embedded_text_feature_column1,embedded_text_feature_column2],
      n_classes=2,
      optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))

    estimator.train(input_fn=train_input_fn, steps=1000)

    train_eval_result = estimator.evaluate(input_fn=predict_train_input_fn)
    test_eval_result = estimator.evaluate(input_fn=predict_test_input_fn)

    training_set_accuracy = train_eval_result["accuracy"]
    test_set_accuracy = test_eval_result["accuracy"]

    return {
      "Training accuracy": training_set_accuracy,
      "Test accuracy": test_set_accuracy
    }



results  = train_and_evaluate_with_module("https://tfhub.dev/google/universal-sentence-encoder-large/3", True)

person PDPDPDPD    schedule 07.08.2019    source источник


Ответы (1)


Я не очень хорошо разбираюсь в том, как использовать tf.estimator, но когда дело доходит до сиамской архитектуры, этого достаточно:

sentences1 = ["the cat sat on the mat", "the cat didn't sat on the mat"]
sentences2 = ["the dog sat on the mat", "the dog didn't sat on the mat"]
encoder = hub.Module("https://tfhub.dev/google/universal-sentence-encoder-large/3", trainable=True)
sentences1_embedding = encoder(sentences1)
sentences2_embedding = encoder(sentences2)
# Now, you can proceed with doing whatever you want with the embeddings

Затем, когда вы вычисляете потери и обратное распространение градиентов, universal-sentence-encoder будет обновляться из обеих ветвей вашей модели.

Другими словами, создайте один экземпляр модуля и используйте его для получения вложений из двух или более предложений сиамской нейронной сети.


В вашем случае я предполагаю, что должно быть достаточно следующего:

embedded_text_feature_column = hub.text_embedding_column(
  key="sentence", module_spec=hub_module, trainable=train_module)

estimator = tf.estimator.DNNClassifier(
  hidden_units=[500, 100],
  feature_columns=[embedded_text_feature_column, embedded_text_feature_column],
  n_classes=2,
  optimizer=tf.train.AdagradOptimizer(learning_rate=0.003))

Итак, вы создаете экземпляр одного text_embedding_column с module, а затем используете тот же text_embedding_column для встраивания обоих столбцов функций в tf.estimator.DNNClassifier.

person gorjan    schedule 07.08.2019
comment
Спасибо за ответ. Я пытаюсь найти ответ в отношении структуры оценки, поскольку я гораздо менее хорошо разбираюсь в Tensorflow, чем в pytorch, и просто хочу быстро что-то протестировать. - person PDPDPDPD; 07.08.2019
comment
Спасибо за помощь. Ключ с embedded_text_feature_column соответствует вводу данных. Таким образом, обе функции embedded_text_feature_column будут иметь одинаковое значение. Я пытаюсь передать модели разные предложения. Идея состоит в том, чтобы встроить два предложения в одну модель встраивания, а затем поместить классификатор в конец, чтобы предсказать, насколько предложения связаны на основе метки. Я использую это для тонкой настройки USE. Если у вас есть лучшее или более простое представление о том, как настроить ЕГЭ, я был бы рад услышать. - person PDPDPDPD; 07.08.2019
comment
Я не могу придумать, как сделать то, что вы хотите, в текущей настройке. - person gorjan; 07.08.2019
comment
Да, к такому выводу я и пришел. Знаете ли вы, что если я прикреплю оценщик к концу обычного hub.module(), то запущу оптимизатор, чтобы он обучил модель. Большинство руководств, с которыми я столкнулся, заключают концентратор в слой keras, чтобы его нельзя было обучить. - person PDPDPDPD; 07.08.2019