许多TensorFlow的示例应用程序通过调用创建Experiments并运行其中一个Experiment方法tf.contrib.data.learn_runner.run.看起来它Experiment本质上是一个包装器Estimator.
创建和运行Experiment所需的代码比创建,训练和评估所需的代码更复杂Estimator.我确信使用Experiments 有一个优点,但我无法弄清楚它是什么.有人能填补我吗?
python machine-learning deep-learning tensorflow tensorflow-estimator
我最近改变了我的建模框架以使用自定义Tensorflow Estimators和Datasets,并且对这个工作流程非常满意.
但是,我刚刚注意到我的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是否支持此类功能?我需要使用可初始化的迭代器吗?
谢谢!
我试图将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)
但现在呢?
"ValueError:Tensor("ExponentialDecay:0",shape =(),dtype = float32)必须与Tensor相同的图形("dnn/hiddenlayer_0/kernel/part_0:0",shape =(62,2),dtype = float32_ref)".
非常感谢您的帮助.我正在使用TF1.6顺便说一句.
我已经按照TensorFlow MNIST Estimator教程进行了训练,并且训练了我的MNIST模型.
它似乎工作正常,但如果我在Tensorboard上可视化它我看到一些奇怪的东西:模型所需的输入形状是100 x 784.
这是一个屏幕截图:正如您在右侧框中看到的,预期输入大小为100x784.
我以为我会看到?x784那里.
现在,我确实在训练中使用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接口.
我错过了什么?
该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()关闭管道)。理想情况下,我想在对数据集进行完整迭代后移动到另一个分片,这可能吗?
感谢您的任何指点!
我想用张量流(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不适用于多重结果。那么什么是多标签指标呢?
我有一个带有非常简单演示的colab,Estimator目的是学习/理解EstimatorAPI,目的是为即插即用模型制定一个约定,其中包含有用的交易技巧(例如,如果验证通过,则提前停止)设置停止改进,导出模型等)。
这三个的Estimator模式(TRAIN,EVAL,和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)
在这些命名参数中,我想提请注意predictions和export_outputs,它们在文档中被描述为:
predictions:预测张量或张量的字典。export_outputs:描述要导出到SavedModel并在服务期间使用的输出签名。一个字典{name: output},其中:
name:此输出的任意名称。output: 一个ExportOutput对象,例如ClassificationOutput,RegressionOutput, 或PredictOutput。单头模型只需要在这个字典中指定一个条目。多头模型应该为每个头指定一个条目,其中之一必须使用 …
下面的代码生成了常规的 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
到目前为止,我正在使用tf.contrib.predictor.from_saved_model加载SavedModel(tf.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
我是 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,但我在那里遇到了同样的问题。
谢谢!!