标签: tensorflow-estimator

在TensorFlow中使用实验的优势

许多TensorFlow的示例应用程序通过调用创建Experiments并运行其中一个Experiment方法tf.contrib.data.learn_runner.run.看起来它Experiment本质上是一个包装器Estimator.

创建和运行Experiment所需的代码比创建,训练和评估所需的代码更复杂Estimator.我确信使用Experiments 有一个优点,但我无法弄清楚它是什么.有人能填补我吗?

python machine-learning deep-learning tensorflow tensorflow-estimator

6
推荐指数
1
解决办法
1092
查看次数

使用比Ram更多数据的Tensorflow数据集和估算器

我最近改变了我的建模框架以使用自定义Tensorflow EstimatorsDatasets,并且对这个工作流程非常满意.

但是,我刚刚注意到我的dataset_input_fn如何从tfrecords加载数据的问题.我的输入函数是在Tensorflow文档中的示例之后建模的.当我有更多的例子而不是我可以适应RAM时,会出现问题.如果我有1e6个示例,并将我的shuffle buffer_size设置为1e5,则选择1e5示例的子集一次,随机,然后迭代.这意味着我的模型仅在我的整个数据集的10%上进行训练.设置此行为的代码完全来自Tensorflow文档示例代码:

dataset = dataset.map(parser)
dataset = dataset.shuffle(buffer_size=10000)
dataset = dataset.batch(32)
dataset = dataset.repeat(num_epochs)
iterator = dataset.make_one_shot_iterator()
Run Code Online (Sandbox Code Playgroud)

我的问题:当我训练时,是否有可能在最初的1e5之外用新的例子填充shuffle缓冲区?one_shot_iterator是否支持此类功能?我需要使用可初始化的迭代器吗?

谢谢!

tensorflow tensorflow-datasets tensorflow-estimator

6
推荐指数
1
解决办法
759
查看次数

使用预定义估算器的tf.train.exponential_decay?

我试图将tf.train.exponential_decay与预定义的估算器一起使用,由于某种原因,这被证明是超级难的.我在这里错过了什么吗?

这是我的旧代码,具有不断的learning_rate:

classifier = tf.estimator.DNNRegressor(
    feature_columns=f_columns,
    model_dir='./TF',
    hidden_units=[2, 2],
    optimizer=tf.train.ProximalAdagradOptimizer(
      learning_rate=0.50,
      l1_regularization_strength=0.001,
    ))
Run Code Online (Sandbox Code Playgroud)

现在我尝试添加这个:

starter_learning_rate = 0.50
global_step = tf.Variable(0, trainable=False)
learning_rate = tf.train.exponential_decay(starter_learning_rate, global_step,
                                           10000, 0.96, staircase=True)
Run Code Online (Sandbox Code Playgroud)

但现在呢?

  • estimator.predict()不接受global_step所以它会被卡在0?
  • 即使我将learning_rate传递给tf.train.ProximalAdagradOptimizer(),我也会收到错误消息

"ValueError:Tensor("ExponentialDecay:0",shape =(),dtype = float32)必须与Tensor相同的图形("dnn/hiddenlayer_0/kernel/part_0:0",shape =(62,2),dtype = float32_ref)".

非常感谢您的帮助.我正在使用TF1.6顺便说一句.

tensorflow tensorflow-estimator

6
推荐指数
1
解决办法
315
查看次数

Tensorflow MNIST Estimator:批量大小会影响图表的预期输入吗?

我已经按照TensorFlow MNIST Estimator教程进行了训练,并且训练了我的MNIST模型.
它似乎工作正常,但如果我在Tensorboard上可视化它我看到一些奇怪的东西:模型所需的输入形状是100 x 784.

这是一个屏幕截图:正如您在右侧框中看到的,预期输入大小为100x784.
我以为我会看到?x784那里.

看到? 输入的预期大小为100 x 784

现在,我确实在训练中使用100作为批量大小,但在Estimator模型函数中我还指定了输入样本量的大小是可变的.所以我期待?x 784将在Tensorboard中显示.

input_layer = tf.reshape(features["x"], [-1, 28, 28, 1], name="input_layer")
Run Code Online (Sandbox Code Playgroud)

我尝试在具有不同批量大小的同一模型上使用estimator.train和estimator.evaluate方法(例如50),并使用Estimator.predict方法一次传递一个样本.在这些情况下,一切似乎都很好.

相反,如果我尝试使用模型而不通过Estimator接口,我确实会遇到问题.例如,如果我冻结我的模型并尝试在GraphDef中加载它并在会话中运行它,如下所示:

with tf.gfile.GFile("/path/to/my/frozen/model.pb", "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())

with tf.Graph().as_default() as graph:
    tf.import_graph_def(graph_def, name="prefix")

    x = graph.get_tensor_by_name('prefix/input_layer:0')
    y = graph.get_tensor_by_name('prefix/softmax_tensor:0')

    with tf.Session(graph=graph) as sess:
        y_out = sess.run(y, feed_dict={x: 28_x_28_image})
Run Code Online (Sandbox Code Playgroud)

我将得到以下错误:
ValueError:无法为Tensor'前缀/ input_layer:0'提供形状值(1,28,28,1),其形状为'(100,28,28,1)'

这让我很担心,因为在生产中我需要冻结,优化和转换我的模型以在TensorFlow Lite上运行它们.所以我不会使用Estimator接口.

我错过了什么?

python numpy mnist tensorflow tensorflow-estimator

6
推荐指数
1
解决办法
465
查看次数

使用 tf.estimator.train_and_evaluate 时如何有效地洗牌大型 tf.data.Dataset?

tf.estimator.train_and_evaluate文件明确指出,输入数据集必须正确洗牌的训练,看看所有的例子:

过拟合:为了避免过拟合,建议设置训练 input_fn 对训练数据进行适当的 shuffle。还建议在执行评估之前对模型进行更长时间的训练,比如多个时期,因为每次训练的输入管道都从头开始。这对于本地培训和评估尤为重要。

在我的应用程序中,我想从tf.data.Dataset具有任意评估频率和shuffle()缓冲区大小的完整样本中统一采样示例。否则,训练最多只能看到第一个:

(steps_per_second * eval_delay * batch_size) + buffer_size
Run Code Online (Sandbox Code Playgroud)

元素,有效地丢弃其余元素。有没有一种有效的方法来解决这个问题,而无需在系统内存中加载完整的数据集?

我考虑过根据缓冲区大小对数据集进行分片,但如果评估不经常发生,它将在同一个分片上迭代多次(一个repeat()关闭管道)。理想情况下,我想在对数据集进行完整迭代后移动到另一个分片,这可能吗?

感谢您的任何指点!

tensorflow tensorflow-datasets tensorflow-estimator

5
推荐指数
1
解决办法
2256
查看次数

如何使用 tf.metrics 计算多标签分类的准确性?

我想用张量流(tf.estimator.Estimator)训练多标签分类模型。我需要在评估时输出准确性。但它似乎不适用于以下代码:

accuracy = tf.metrics.accuracy(labels=labels, predictions=preds)
metrics = {'accuracy': accuracy}

if mode == tf.estimator.ModeKeys.EVAL:
    return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics)
Run Code Online (Sandbox Code Playgroud)

tf.metrics.accuracy不适用于多重结果。那么什么是多标签指标呢?

evaluation tensorflow tensorflow-estimator

5
推荐指数
1
解决办法
1253
查看次数

TensorFlow ExportOutputs、PredictOuput 和指定 signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY

语境

我有一个带有非常简单演示的colabEstimator目的是学习/理解EstimatorAPI,目的是为即插即用模型制定一个约定,其中包含有用的交易技巧(例如,如果验证通过,则提前停止)设置停止改进,导出模型等)。

这三个的Estimator模式(TRAINEVAL,和PREDICT)返回EstimatorSpec

根据文档

__new__(
    cls,
    mode,
    predictions=None,          # required by PREDICT
    loss=None,                 # required by TRAIN and EVAL
    train_op=None,             # required by TRAIN
    eval_metric_ops=None,
    export_outputs=None,
    training_chief_hooks=None,
    training_hooks=None,
    scaffold=None,
    evaluation_hooks=None,
    prediction_hooks=None.     
)
Run Code Online (Sandbox Code Playgroud)

在这些命名参数中,我想提请注意predictionsexport_outputs,它们在文档中被描述为:

  • predictions:预测张量或张量的字典。
  • export_outputs:描述要导出到SavedModel并在服务期间使用的输出签名。一个字典{name: output},其中:
    • name:此输出的任意名称。
    • output: 一个ExportOutput对象,例如ClassificationOutput, RegressionOutput, 或PredictOutput。单头模型只需要在这个字典中指定一个条目。多头模型应该为每个头指定一个条目,其中之一必须使用 …

python tensorflow tensorflow-serving tensorflow-estimator

5
推荐指数
1
解决办法
1074
查看次数

我如何将 tensorflow 2.0 估算器模型转换为 tensorflow lite?

下面的代码生成了常规的 tensorflow 模型,但是当我尝试将其转换为 tensorflow lite 时它不起作用,我遵循了以下文档。

https://www.tensorflow.org/tutorials/estimator/linear 1 https://www.tensorflow.org/lite/guide/get_started

export_dir = "tmp"
serving_input_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(
  tf.feature_column.make_parse_example_spec(feat_cols))

estimator.export_saved_model(export_dir, serving_input_fn)

# Convert the model.
converter = tf.lite.TFLiteConverter.from_saved_model("tmp/1571728920/saved_model.pb")
tflite_model = converter.convert()
Run Code Online (Sandbox Code Playgroud)

错误信息

Traceback (most recent call last):
  File "C:/Users/Dacorie Smith/PycharmProjects/JamaicaClassOneNotifableModels/ClassOneModels.py", line 208, in <module>
    tflite_model = converter.convert()
  File "C:\Users\Dacorie Smith\PycharmProjects\JamaicaClassOneNotifableModels\venv\lib\site-packages\tensorflow_core\lite\python\lite.py", line 400, in convert
    raise ValueError("This converter can only convert a single "
ValueError: This converter can only convert a single ConcreteFunction. Converting multiple functions is under development.
Run Code Online (Sandbox Code Playgroud)

文档摘录

TensorFlow Lite 转换器 TensorFlow …

python android tensorflow tensorflow-lite tensorflow-estimator

5
推荐指数
1
解决办法
1694
查看次数

TensorFlow v2:替换 tf.contrib.predictor.from_saved_model

到目前为止,我正在使用tf.contrib.predictor.from_saved_model加载SavedModeltf.estimator模型类)。然而,不幸的是这个函数在 TensorFlow v2 中被删除了。到目前为止,在 TensorFlow v1 中,我的编码如下:

 predict_fn = predictor.from_saved_model(model_dir + '/' + model, signature_def_key='predict')

 prediction_feed_dict = dict()

 for key in predict_fn._feed_tensors.keys():

     #forec_data is a DataFrame holding the data to be fed in 
     for index in forec_data.index:
         prediction_feed_dict[key] = [ [ forec_data.loc[index][key] ] ]

 prediction_complete = predict_fn(prediction_feed_dict)
Run Code Online (Sandbox Code Playgroud)

使用tf.saved_model.load,我在 TensorFlow v2 中尝试了以下操作,但没有成功:

 model = tf.saved_model.load(model_dir + '/' + latest_model)
 model_fn = model.signatures['predict']

 prediction_feed_dict = dict()

 for key in model_fn._feed_tensors.keys(): #<-- no replacement for …
Run Code Online (Sandbox Code Playgroud)

python tensorflow tensorflow-serving tensorflow-estimator tensorflow2.0

5
推荐指数
1
解决办法
4816
查看次数

我可以通过带有 LinearRegressor 的钩子记录训练损失吗?

我是 TensorFlow 的新手。我使用 TF 1.8 进行“简单”线性回归。练习的输出是一组最适合数据的线性权重,而不是预测模型。所以我想跟踪和记录训练期间当前的最小损失,以及相应的权重值。

我正在尝试使用LinearRegressor

tf.logging.set_verbosity(tf.logging.INFO)

model = tf.estimator.LinearRegressor(
    feature_columns = make_feature_cols(),
    model_dir = TRAINING_OUTDIR
)

# --------------------------------------------v
logger = tf.train.LoggingTensorHook({"loss": ???}, every_n_iter=10)
trainHooks = [logger]

model.train(
    input_fn = make_train_input_fn(df, num_epochs = nEpochs),
    hooks = trainHooks
)
Run Code Online (Sandbox Code Playgroud)

该模型似乎不包含损失的变量。

我可以以LoggingTensorHook某种方式使用吗?在这种情况下,我如何定义损失张量?

我也尝试实现我自己的钩子。示例建议before_run通过调用在内部记录损失SessionRunArgs,但我在那里遇到了同样的问题。

谢谢!!

python tensorflow tensorflow-estimator

5
推荐指数
1
解决办法
306
查看次数