- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在根据TensorFlow的估算器API调整我的模型。
我最近问了一个关于early stopping based on validation data的问题,除了尽早停止之外,目前还应该导出最佳模型。
似乎我对模型导出是什么以及检查点是什么的理解还不完整。
检查点是自动进行的。根据我的理解,检查点足以使估算器开始“热身”-使用如此训练的权重或错误之前的权重(例如,如果您遇到断电)。
关于检查点的好处是,除了自定义估算器(即input_fn
和model_fn
)所需的代码外,我不必编写任何代码。
在给定初始化估计量的情况下,可以只调用其train
方法来训练模型,而在实践中,这种方法相当乏味。人们常常想做几件事:
定期将网络与验证数据集进行比较,以确保您不会过度拟合
如果发生过度拟合,请尽早停止训练
每当网络结束时(通过达到指定数量的训练步骤或根据早期停止标准),都可以保存最佳模型。
对于刚接触“高级”估算器API的人来说,似乎需要大量低级专业知识(例如input_fn
),因为如何才能使估算器做到这一点并非直截了当。
通过简单的代码重做#1可以通过将tf.estimator.TrainSpec
和tf.estimator.EvalSpec
与tf.estimator.train_and_evaluate
一起使用来实现。
在previous question用户中,@ GPhilo阐明了如何使用tf.contrib
中的半直观函数来实现#2:
tf.contrib.estimator.stop_if_no_decrease_hook(my_estimator,'my_metric_to_monitor', 10000)
input_serving_fn
是什么,为什么需要它或如何制作它。
model_fn
具有非常简单的自定义估算器,并使用使用TF Record文件的
input_fn
训练该模型。因此,对于某人来说,向我解释为输入服务接收器功能我需要做些什么占位符以及如何完成第三项就足够了。
build_fn
并继续使用(加上具有导出模型的生活质量,尽早停止,等等)。
load raw —> process —> feed to model
Load raw —> pre process —> store (perhaps as tf records)
# data processing has nothing to do with feeding data to the model?
Load processed —> feed to model
Example
/
SequenceExample
的目的是存储准备就绪的完整单个数据实体-除了读取
TFRecord
文件外,无需进行其他处理。
input_fn
与推论/可能有所不同(例如,从文件读取与内存中的急切/交互式评估),但是数据格式相同(推论除外,您可能只希望提供数据) 1个示例,而不是一批…)
tf.estimator.export.build_raw_serving_input_receiver_fn
。
tf.estimator.export.build_raw_serving_input_receiver_fn
来显示
serving_input_receiver_fn
的类似物
serving_input_receiver_fn
。您如何知道将特征称为“图像”,将接收器张量称为“ input_data”?那是(后者)标准吗?
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY
命名导出。
最佳答案
检查点和导出的最佳模型之间有什么区别?
检查点至少是一个文件,其中包含在特定时间点获取的特定图的所有变量的值。
通过特定的图,我的意思是,当加载回检查点时,TensorFlow的作用是循环遍历图中定义的所有变量(正在运行的session
中的一个)并在具有以下内容的检查点文件中搜索一个变量:与图中的名称相同。对于继续训练,这是理想的选择,因为您的图形在每次重新启动之间始终看起来相同。
导出的模型有不同的用途。导出模型的想法是,完成训练后,您希望获得一些可以用于推理的东西,其中不包含训练所特有的所有(繁重)部分(一些示例:梯度计算,全局步骤变量,输入管道...)。
而且,他的要点是关键,通常,您向推理模型提供输入的方式与您在训练中使用的方式不同。为了进行培训,您有一个输入管道,可将数据加载,预处理并将数据馈送到网络。此输入管道不是模型本身的一部分,可能需要更改以进行推断。这是使用Estimator
进行操作时的关键点。
为什么需要服务输入接收器功能?
为了回答这个问题,我将首先退后一步。为什么我们在所有广告中都需要输入函数,它们是什么? TF的Estimator
虽然可能不如其他建模网络的直观方式,但具有很大的优势:它们通过输入函数和模型函数将模型逻辑和输入处理逻辑明确分开。
模型处于三个不同的阶段:训练,评估和推理。对于最常见的用例(或者至少我目前能想到的所有用例),在TF中运行的图在所有这些阶段中都会有所不同。该图是输入预处理,模型以及在当前阶段运行模型所需的所有机械的组合。
希望有一些示例可以进一步阐明:训练时,您需要渐变以更新权重,运行训练步骤的优化器,监视事情进展的各种指标,从训练集中获取数据的输入管道等。 。评估时,您不需要渐变,而需要其他输入函数。当进行推理时,您只需要模型的前部,输入函数也将有所不同(没有tf.data.*
内容,但通常只是一个占位符)。Estimator
中的每个阶段都有其自己的输入功能。您熟悉培训和评估的知识,推论只是您的serving input receiver
函数。在TF术语中,“服务”是打包训练后的模型并将其用于推理的过程(有一个完整的TensorFlow服务系统可用于大规模操作,但这超出了这个问题,您很可能根本就不需要它)。
是时候引用TF guide on the topic了:
在训练期间,input_fn()会摄取数据并准备供以下人员使用
该模型。在投放时,serving_input_receiver_fn()
接受推理请求并为模型做好准备。这个
函数具有以下目的:
要将占位符添加到服务系统将要提供的图表中
与推理请求。
添加转换所需的任何其他操作
数据从输入格式转换为预期的特征张量
模型。
现在,服务输入功能规范取决于您计划如何将输入发送到图形。
如果要将数据打包在(序列化的)tf.Example
中(类似于TFRecord文件中的记录之一),则您的服务输入函数将具有字符串占位符(用于示例中的序列化字节) ),并且需要有关如何解释该示例的规范,以提取其数据。如果这是您想要的方式,我邀请您看一下上面链接的指南中的示例,它本质上显示了如何设置如何解释示例并对其进行解析以获取输入数据的规范。
相反,如果您打算将输入直接馈送到网络的第一层,则仍然需要定义服务输入功能,但是这次它将仅包含一个占位符,该占位符将直接插入网络。 TF提供了一个功能来实现:tf.estimator.export.build_raw_serving_input_receiver_fn
。
那么,您实际上是否需要编写自己的输入函数?如果您需要的是占位符,否。只需将build_raw_serving_input_receiver_fn
与适当的参数一起使用即可。如果需要更高级的预处理,那么可以,您可能需要编写自己的预处理程序。在这种情况下,它将看起来像这样:
def serving_input_receiver_fn():
"""For the sake of the example, let's assume your input to the network will be a 28x28 grayscale image that you'll then preprocess as needed"""
input_images = tf.placeholder(dtype=tf.uint8,
shape=[None, 28, 28, 1],
name='input_images')
# here you do all the operations you need on the images before they can be fed to the net (e.g., normalizing, reshaping, etc). Let's assume "images" is the resulting tensor.
features = {'input_data' : images} # this is the dict that is then passed as "features" parameter to your model_fn
receiver_tensors = {'input_data': input_images} # As far as I understand this is needed to map the input to a name you can retrieve later
return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)
model_fn
采用
mode
参数,以便您有条件地构建模型。例如,在您的合作实验室中,您总是有一个优化器。这是错误的,因为它只应存在于
mode == tf.estimator.ModeKeys.TRAIN
处。
build_fn
具有一个无意义的“输出”参数。此函数应表示您的推理图,仅将您将在推理中馈入的张量作为输入,并返回logit /预测。
outputs
参数不存在,因为
build_fn
签名应为
def build_fn(inputs, params)
。
model_fn
以将
features
作为张量。尽管可以做到这一点,但这不仅限制了您只能输入一个内容,而且使serving_fn变得复杂(您不能使用罐装的
build_raw_...
,而需要编写自己的并返回
TensorServingInputReceiver
)。我将选择更通用的解决方案,并假设您的
model_fn
如下(为简洁起见,我省略了变量范围,请根据需要添加):
def model_fn(features, labels, mode, params):
my_input = features["input_data"]
my_input.set_shape(I_SHAPE(params['batch_size']))
# output of the network
onet = build_fn(features, params)
predicted_labels = tf.nn.sigmoid(onet)
predictions = {'labels': predicted_labels, 'logits': onet}
export_outputs = { # see EstimatorSpec's docs to understand what this is and why it's necessary.
'labels': tf.estimator.export.PredictOutput(predicted_labels),
'logits': tf.estimator.export.PredictOutput(onet)
}
# NOTE: export_outputs can also be used to save models as "SavedModel"s during evaluation.
# HERE is where the common part of the graph between training, inference and evaluation stops.
if mode == tf.estimator.ModeKeys.PREDICT:
# return early and avoid adding the rest of the graph that has nothing to do with inference.
return tf.estimator.EstimatorSpec(mode=mode,
predictions=predictions,
export_outputs=export_outputs)
labels.set_shape(O_SHAPE(params['batch_size']))
# calculate loss
loss = loss_fn(onet, labels)
# add optimizer only if we're training
if mode == tf.estimator.ModeKeys.TRAIN:
optimizer = tf.train.AdagradOptimizer(learning_rate=params['learning_rate'])
# some metrics used both in training and eval
mae = tf.metrics.mean_absolute_error(labels=labels, predictions=predicted_labels, name='mea_op')
mse = tf.metrics.mean_squared_error(labels=labels, predictions=predicted_labels, name='mse_op')
metrics = {'mae': mae, 'mse': mse}
tf.summary.scalar('mae', mae[1])
tf.summary.scalar('mse', mse[1])
if mode == tf.estimator.ModeKeys.EVAL:
return tf.estimator.EstimatorSpec(mode, loss=loss, eval_metric_ops=metrics, predictions=predictions, export_outputs=export_outputs)
if mode == tf.estimator.ModeKeys.TRAIN:
train_op = optimizer.minimize(loss, global_step=tf.train.get_global_step())
return tf.estimator.EstimatorSpec(mode, loss=loss, train_op=train_op, eval_metric_ops=metrics, predictions=predictions, export_outputs=export_outputs)
train_and_evaluate
的调用完成之后:
serving_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(
{'input_data':tf.placeholder(tf.float32, [None,#YOUR_INPUT_SHAPE_HERE (without batch size)#])})
est.export_savedmodel('my_directory_for_saved_models', serving_fn)
export_savedmodel
之前加载它。
freeze_graph.py
)并对其进行优化以进行推理(查找
optimize_for_inference.py
和/或
transform_graph
),以获得冻结的
*.pb
文件,然后可以将其加载并用于推理你希望。
name:tensor
项的字典)作为输入,并使用该张量构建其计算图。输入的来源由输入函数决定,但是只要所有输入函数的输出具有相同的接口,就可以根据需要交换输入,并且模型将简单地获取并使用它。
build_raw_serving_input_receiver_fn
的参数传递,因此您选择其名称:
tf.estimator.export.build_raw_serving_input_receiver_fn(
{'images':tf.placeholder(tf.float32, [None,28,28,1], name='input_images')})
input_data
(我修改了上面的代码)。
features
中的
model_fn
检索张量的键。在
model_fn
中,第一行是:
my_input = features["input_data"]
'input_data'
。
receiver_tensor
中的键,我仍然不太确定该角色是什么,所以我的建议是尝试设置一个与
features
中的键不同的名称,并检查该名称在何处显示。
关于python - Tensorflow v1.10 +为什么在没有检查点的情况下需要输入服务接收器功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52874647/
我们正在创建一个 n 层 Silverlight LOB 应用程序,并且正在考虑使用 .NET RIA 服务。我们不清楚这与我们当前的 WCF 服务 API 的关系在哪里。我们当前的架构是: 银光
上下文:我在celery + rabbitmq堆栈上有一个主工作系统。 系统已docker化(此处未提供worker服务) version: '2' services: rabbit:
我是 Windows Azure 新手,我正在尝试将我的 Web 应用程序部署到 Windows Azure。在我的应用程序中,我使用了一些 Web 服务,现在我想知道如何在 Windows Azur
因此,根据我对服务的了解,自定义对象似乎是写入服务以返回数据的方式。如果我正在编写将用于 1) 填充数据库或 2) 为网站提供信息的服务,是否有返回数据集/数据表而不是包含所有这些的自定义对象列表的用
我在 google 和 stackoverflow 上都找过答案,但似乎找不到。我正在尝试将 azure 实验的输出获取到应用程序。我使用 ibuildapp 和谷歌表单制作了该应用程序。如何使用 g
我不小心删除了 kubernetes svc: service "kubernetes" deleted 使用: kubectl delete svc --all 我该怎么办?我只是想删除服务,以便
我正在努力确定解决网络服务问题的最有效方法。 我的情况:我正在开发一个 Android 应用程序,它通过 Web 服务从 mysql 数据库(在我自己的服务器 PC 上)存储和检索数据。用户按下提交按
我一直在翻阅 Android 文档,我很好奇。什么时候绑定(bind)服务而不是不绑定(bind)服务?它提供了哪些优点/限制? 最佳答案 When would you bind a service
我试图从架构的角度理解 hive,我指的是 Tom White 关于 Hadoop 的书。 我遇到了以下关于配置单元的术语:Hive Services、hiveserver2、metastore 等。
我的问题:安装服务后我无法导航到基地址,因为服务不会继续运行(立即停止)。我需要在服务器或我的机器上做些什么才能使 baseAddress 有效吗? 背景:我正在尝试学习如何使用 Windows 服务
我正在努力就 Web 服务的正确组织做出决定。我应该有多个 ASMX 来代表 Web 服务中的不同功能,还是应该有一个 ASMX? 如果我有多个 ASMX,这不构成多个 Web 服务吗? 如果我只有一
我正在从事一个在 azure 平台上提供休息服务的项目。该服务由 iPhone 客户端使用,这是选择其余方法的重要原因之一。 我们希望通过 AccessControlService(ACS) 并使用
我是 Ionic 新手,正在使用 Ionic 3.9.2 我有几个终端命令来为我的 ionic 应用程序提供服务,但是,我没有发现这两个命令之间有任何区别。 ionic serve 和 ionic s
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
作为项目的一部分,我期待着问这个问题。我过去有开发和使用 Web 服务的经验,并且非常熟悉这些服务。但是,有人告诉我,作为下一个项目的一部分,我将需要使用“安全”的 Web 服务。您能否提供一些见解,
我浏览了很多关于这个问题的信息,但找不到解决方案。这里的问题是,我想使用 Apache Cordova 和 Visual Studio 连接到 wcf。因此,如果有人找到合适的工作解决方案,请发布链接
我在 Windows 服务中托管了一个 WCF(从 MS 网站示例中选取),我可以使用 SOAP UI 访问和调用方法。但是,当我尝试使用 jquery 从 Web 应用程序调用相同的方法时,我不断收
我们构建了一个 Android 应用程序,它从 Android 向我的 PHP 服务器发送 HTTP 请求。作为响应,Web 服务将 JSON 对象发送到 Android 应用程序以显示结果。 就像其
我想在 android 应用程序中调用 soap web 服务,它需要一个枚举值作为参数,它是一个标志枚举。如何从 Android 应用程序将一些值作为标志枚举传递给此 Web 服务方法? 我使用 K
我尝试在模拟器上安装 Google Play。我已按照 Google Dev Site 中的说明进行操作. 使用 ADV 管理器似乎没问题,设备的目标是 Google API 版本 22,但是当我运行
我是一名优秀的程序员,十分优秀!