0

我正在尝试创建一个自定义张量流 tf.Estimator。在传递给 tf.Estimator 的 model_fn 中,我从 Tensorflow Hub 导入 Inception_V3 模块。

问题:微调模型后(使用 tf.Estimator.train),使用 tf.Estimator.predict 得到的结果不如基于 tf.Estimator.evaluate 的预期(这是针对回归问题。)

我是 Tensorflow 和 Tensorflow Hub 的新手,所以我可能会犯很多新手错误。

当我对我的验证数据运行 tf.Estimator.evaluate() 时,报告的损失与使用 tf.Estimator.train() 训练模型后的损失在同一个球场。当我尝试对相同的验证数据使用 tf.Estimator.predict() 时,问题就出现了。

tf.Estimator.predict() 返回预测,然后我用它来计算由 tf.Estimator.evaluate() 计算的相同损失度量 (mean_squared_error)。我使用相同的数据集作为评估函数提供给预测函数。但是对于 mean_squared_error 我没有得到相同的结果——不是很接近!(我从 predict 计算的 mse 更糟。)

这是我所做的(编辑了一些细节)...用 Tensorflow Hub 模块定义一个 model_fn。然后调用 tf.Estimator 函数来训练、评估和预测。

def my_model_fun(features, labels, mode, params):
    # Load InceptionV3 Module from Tensorflow Hub
    iv3_module =hub.Module("https://tfhub.dev/google/imagenet/inception_v3/feature_vector/1",trainable=True, tags={'train'})     

    # Gather the variables for fine-tuning
    var_list = tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,scope='CustomeLayer')
    var_list.extend(tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES,scope='module/InceptionV3/Mixed_5b'))

    predictions = {"the_prediction" : final_output}
    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

    # Define loss, optimizer, and evaluation metrics
    loss = tf.losses.mean_squared_error(labels=labels, predictions=final_output)
    optimizer =tf.train.AdadeltaOptimizer(learning_rate=learn_rate).minimize(loss, 
    var_list=var_list, global_step=tf.train.get_global_step())   
    rms_error = tf.metrics.root_mean_squared_error(labels=labels,predictions=predictions["the_prediction"])
    eval_metric_ops = {"rms_error": rms_error}

    if mode == tf.estimator.ModeKeys.TRAIN:
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss,train_op=optimizer)

    if mode == tf.estimator.ModeKeys.EVAL:
        tf.summary.scalar('rms_error', rms_error)
        return tf.estimator.EstimatorSpec(mode=mode, loss=loss,eval_metric_ops=eval_metric_ops)  


iv3_estimator = tf.estimator.Estimator(model_fn=iv3_model_fn)   
iv3_estimator.train(input_fn=train_input_fn, steps=TRAIN_STEPS) 
iv3_estimator.evaluate(input_fn=val_input_fn)  

ii =0 
for ans in iv3_estimator.predict(input_fn=test_input_fn):
    sqErr = np.square(label[ii] - ans['the_prediction'][0])
    totalSqErr += sqErr
    ii += 1                           
mse = totalSqErr/ii

我希望 tf.Estimator.evaluate() 报告的 mse 损失应该与我从已知标签和 tf.Estimator.predict() 的输出计算 mse 时相同

使用 predict 时是否需要以不同方式导入 Tensorflow Hub 模型?(在调用 hub.Module() 时使用 trainable=False?

tf.Estimator.evaluate() 运行时是否使用从训练中获得的权重,而不是 tf.Estimator.predict()- 运行时?

其他?

4

1 回答 1

0

代码片段中似乎缺少一些东西。是如何final_output计算的iv3_module?此外,对于分类问题,均方误差是一种不寻常的损失函数选择。常见的方法是将图像特征从模块传递到线性输出层,每个类都有分数(“logits”)和“softmax 交叉熵损失”。有关这些术语的解释,您可以查看在线教程,例如https://developers.google.com/machine-learning/crash-course/(一直到多类神经网络)。

关于 TF-Hub 技术细节:

  • 集线器模块的变量会自动添加到 GLOBAL_VARIABLES 和 TRAINABLE_VARIABLES 集合中(如果trainable=True,就像您已经做的那样)。不需要手动扩展这些集合。
  • hub.Module(..., tags=...)应设置为{"train"}formode==TRAIN并设置为None或空集,否则。

一般来说,在没有微调作为基线的情况下,为您的问题提供端到端的解决方案是很有用的,然后添加微调。

于 2019-02-18T09:57:05.510 回答