我正在尝试创建一个自定义张量流 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()- 运行时?
其他?