使用Tensorflow估算器和中心创建暹罗网络

时间:2019-08-07 16:33:17

标签: python tensorflow machine-learning tensorflow-estimator tensorflow-hub

我试图通过使用编码器创建一个暹罗网络来微调通用句子编码器。我想在训练过程中训练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)

1 个答案:

答案 0 :(得分: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中。