定制的估计

    tfestimators框架通过其高级Estimator API使构建和构建机器学习模型变得容易。估计量提供可实例化的类,以快速配置公共模型类型,如回归器和分类器。

    但是如果预定义的模型类型都不满足您的需求呢?也许您需要对模型配置进行更细粒度的控制,例如定制用于优化的损失函数的能力,或者为每个神经网络层指定不同的激活函数。或者,您正在实现一个排名或推荐系统,分类器和回归器都不适合生成预测。右边的图说明了估计器的基本组成部分。的内部实现自定义行为和或体系结构model_fn估计量的。

    本教程介绍如何创建您自己的估计量使用中提供的构建块tfestimators包,这将预测的年龄鲍鱼根据他们的物理测量。你将学习如何做以下事情:

    • 实例化一个估计量
    • 构造一个自定义模型函数
    • 配置一个神经网络使用tf feature_column美元而且tf美元层
    • 选择合适的损失函数tf美元损失
    • 为您的模型定义一个训练操作
    • 生成和返回预测

    可以找到本教程的完整代码在这里

    鲍鱼年龄预测器

    估计一个人的年龄是可能的鲍鱼(海螺)是由它壳上的环的数量决定的。然而,因为这项任务需要切割、染色和在显微镜下观察外壳,所以需要找到其他可以预测年龄的测量方法。

    鲍鱼数据集包含以下内容特性数据鲍鱼:

    功能 描述
    长度 鲍鱼长度(最长方向;在毫米)
    直径 鲍鱼直径(与长度垂直的测量;在毫米)
    高度 鲍鱼的高度(肉在壳内);在毫米)
    整体重量 整只鲍鱼重量(克)
    低低地重量 只含鲍鱼肉重量(克)
    脏器重量 鲍鱼出血后内脏重量(克)
    外壳重量 干鲍鱼壳重量(克)

    设置

    本教程使用三个数据集。abalone_train.csv包含包含3,320个示例的标记训练数据。abalone_test.csv包含850个示例的标记测试数据。abalone_predict包含7个例子,对其进行预测。

    下面的部分将介绍如何编写估计量循序渐进地编码;的完整的最终代码在这里

    下载和加载鲍鱼CSV数据

    我们首先编写一个函数,从TensorFlow网站下载训练、测试和评估数据(如果我们之前没有下载过这些数据)。

    图书馆(tfestimators)maybe_download_abalone < -函数(train_data_path, test_data_path, predict_data_path, column_names_to_assign) {如果file.exists(train_data_path)||file.exists(test_data_path)||file.exists(predict_data_path)) {“下载鲍鱼数据……”train_data < -read.csv“http://download.tensorflow.org/data/abalone_train.csv”头=test_data < -read.csv“http://download.tensorflow.org/data/abalone_test.csv”头=predict_data < -read.csv“http://download.tensorflow.org/data/abalone_predict.csv”头=colnames(train_data) < -column_names_to_assigncolnames(test_data) < -column_names_to_assigncolnames(predict_data) < -column_names_to_assignwrite.csv(train_data_path train_datarow.names =write.csv(test_data_path test_datarow.names =write.csv(predict_data_path predict_datarow.names =其他的train_data < -read.csv(train_data_path头=真正的test_data < -read.csv(test_data_path头=真正的predict_data < -read.csv(predict_data_path头=真正的返回列表train_data =train_data,test_data =test_data,predict_data =predict_data))COLNAMES < -c“长度”“直径”“高度”“whole_weight”“shucked_weight”“viscera_weight”“shell_weight”“num_rings”downloaded_data < -maybe_download_abalonefile.pathgetwd(),“train_abalone.csv”),file.pathgetwd(),“test_abalone.csv”),file.pathgetwd(),“predict_abalone.csv”),COLNAMEStrain_data < -downloaded_datatrain_datatest_data < -downloaded_datatest_datapredict_data < -downloaded_datapredict_data

    接下来,我们构造如下的输入函数:

    constructed_input_fn < -函数(数据集){input_fn(数据集,特点=-num_rings,响应=num_rings,num_epochs =train_input_fn < -constructed_input_fn(train_data)test_input_fn < -constructed_input_fn(test_data)predict_input_fn < -constructed_input_fn(predict_data)

    实例化一个估计器

    当使用tf.estimator提供的类之一定义模型时,例如linear_dnn_combined_classifier,你在构造函数中提供所有的配置参数,例如:

    直径< -column_numeric“直径”高度< -column_numeric“高度”模型< -dnn_linear_combined_classifierlinear_feature_columns =feature_columns(直径)dnn_feature_columns =feature_columns(高度)dnn_hidden_units =c(100 l, l)

    你不需要写任何进一步的代码来指导TensorFlow如何训练模型,计算损失,或回报预测;这个逻辑已经融入了linear_dnn_combined_classifier

    相比之下,当你从头开始创建自己的估计器时,构造函数只接受两个用于模型配置的高级参数,model_fn而且参数个数

    模型< -估计量(model_fnparams =model_params)
    • model_fn:包含所有上述逻辑的函数对象,以支持训练、评估和预测。卡塔尔世界杯欧洲预选赛赛程表您负责实现该功能。下一部分,构建model_fn详细介绍如何创建模型函数。

    • 参数个数:一个可选的超参数字典(例如,学习率,辍学),它将被传递到model_fn

    注:就像tfestimators的预定义回归器和分类器估计量Initializer还接受一般配置参数model_dir而且配置

    对于鲍鱼年龄预测器,模型将接受一个超参数:学习率。在这里,learning_rate设置为0.001,但您可以根据需要调优该值,以在模型训练期间获得最佳结果。

    下面的代码创建列表model_params的学习速率,并实例化估计量

    #设置模型参数model_params < -列表learning_rate =0.001#实例化估计器模型< -估计量(model_fnparams =model_params)

    构建model_fn

    的基本框架估计量API模型函数如下所示:

    model_fn < -函数(特性,标签,模式,参数,配置){做以下事情的逻辑:# 1。通过TensorFlow操作配置模型# 2。定义培训/评估的损失函数# 3。定义训练操作/优化器# 4。生成预测# 5。在estimator_spec对象中返回predications /loss/train_op/eval_metric_ops

    model_fn必须接受三个参数:

    • 特性包含通过传递给模型的特征的字典input_fn
    • 标签:一个张量包含通过传递给模型的标签input_fn.将会是空的预测()调用,因为这些是模型将推断的值。
    • 模式:以下之一mode_keys ()指示调用model_fn的上下文的字符串值:
      • “训练”model_fn在训练模式中调用,即通过培训()调用。
      • “eval”.的model_fn在求值模式中调用,即通过evaluate ()调用。
      • “推断”.的model_fn在预测模式中调用,即通过预测()调用。

    model_fn也可接受参数个数参数,其中包含用于训练的超参数字典(如上面的框架所示)和一个配置表示模型中使用的配置,包括GPU百分比、集群信息等。

    函数体执行以下任务(将在下面的小节中详细描述):

    • 配置模型,对于鲍鱼预测器,这将是一个神经网络。
    • 定义用于计算模型预测与目标值匹配程度的损失函数。
    • 类的训练操作优化器最小化损失函数计算的损失值的算法。

    model_fn必须返回estimator_spec对象,该对象包含以下值:

    • 模式(要求)。运行模型的模式。通常,您将返回模式的论证model_fn在这里。

    • 预测(需要推断出模式)。将您选择的键名映射到的字典张量S,包含来自模型的预测,例如:

    预测< -列表结果=tensor_of_predictions)

    推断出模式,你返回的字典estimator_spec然后会由预测(),所以您可以按照您想要使用它的格式构造它。

    • 损失(需要eval而且火车模式)。一个张量包含标量损失值:模型损失函数的输出(后面将更深入地讨论)为模型定义损失)对所有输入示例进行计算。这是在火车模式的错误处理和日志记录,并自动作为指标包含在eval模式。

    • train_op(只在火车模式)。执行一个训练步骤的任务。

    • eval_metric_ops(可选)。一个名称/值对字典,指定模型运行时要计算的指标eval模式。名称是为度量选择的标签,值是度量计算的结果。的tf美元指标模块为各种常用度量提供了预定义的函数。以下eval_metric_ops包含一个“准确性”使用tf指标准确性美元

    eval_metric_ops < -列表精度=特遣部队指标精度(标签、预测))

    如果不指定eval_metric_ops,只有损失将在评估时计算。

    配置一个具有feature_column和layers的神经网络

    构建一个神经网络需要创建和连接输入层、隐藏层和输出层。

    输入层是一系列节点(模型中的每个特征对应一个节点),这些节点将接受传递到的特征数据model_fn特性论点。如果特性包含n维张量有了所有的特征数据,它就可以作为输入层。如果特性包含通过输入函数传递给模型的特征列字典,您可以将其转换为输入层张量input_layer功能:

    input_layer < -input_layer特点=的特性,feature_columns =c(年龄、身高、体重)

    如上图所示,input_layer ()接受两个必需的参数:

    • 特性.从字符串键到张量包含相应的特征数据。这正是传递给model_fn特性论点。
    • feature_columns.所有的列表FeatureColumns在模型中——年龄高度,重量在上面的例子中。

    然后,神经网络的输入层必须通过接口连接到一个或多个隐藏层激活函数它对来自前一层的数据执行非线性转换。最后一个隐藏层连接到输出层,也就是模型中的最后一层。tf美元层提供了tf层密集的美元构造完全连接层的函数。控件控制激活激活论点。传递给的一些选项激活论点是:

    • tf nn relu美元.下面的代码创建一个层单位节点完全连接到上一层input_layer与一个ReLU激活功能
    hidden_layer < -特遣部队密集的输入=input_layer,单位=10 l,激活=特遣部队神经网络relu)
    • tf nn relu6美元.下面的代码创建一个层单位节点完全连接到上一层hidden_layer具有ReLU 6激活功能:
    second_hidden_layer < -特遣部队密集的输入=hidden_layer,单位=20 l,激活=特遣部队神经网络relu)
    • .下面的代码创建一个层单位节点完全连接到上一层second_hidden_layer没有激活函数,只是一个线性变换:
    output_layer < -特遣部队密集的输入=second_hidden_layer,单位=3 l,激活=

    其他激活函数是可能的,例如:

    output_layer < -特遣部队密集的输入=second_hidden_layer,单位=10 l,activation_fn =特遣部队乙状结肠)

    上面的代码创建了神经网络层output_layer,这是完全连接到second_hidden_layer用sigmoid激活函数tf乙状结肠美元

    该网络包含两个隐含层,每个隐含层有10个节点和一个ReLU激活函数。输出层不包含激活函数,为tf重塑美元一个一维张量来获取模型的预测,这些预测被存储在predictions_dict

    为模型定义损失

    estimator_specmodel_fn必须包含损失:一个张量表示损失值,它可以量化模型的预测在训练和评估过程中如何反映标签值。的tf美元损失模块提供了使用各种指标计算损失的方便函数,包括:

    • absolute_difference(标签、预测).计算损失绝对差公式(又称L1损失)。

    • log_loss(标签、预测).计算损失物流损失公式(通常用于逻辑回归)。

    • mean_squared_error(标签、预测).计算损失均方误差(MSE;也被称为L2损失)。

    下面的示例添加一个定义损失鲍鱼model_fn使用mean_squared_error ()

    损失< -特遣部队损失mean_squared_error(标签、预测)

    评价的补充度量可以添加到eval_metric_ops字典下面的代码定义了一个rmse度量,用于计算模型预测的均方根误差。请注意标签Tensor被强制转换为afloat64类的数据类型匹配预测张量,它将包含实值:

    eval_metric_ops < -列表rmse =特遣部队指标root_mean_squared_error特遣部队(标签,特遣部队float64),预测))

    为模型定义训练操作

    训练操作定义了TensorFlow在将模型与训练数据拟合时使用的优化算法。通常在训练时,目标是尽量减少损失。创建训练操作的一种简单方法是实例化特遣部队训练优化器美元子类,并调用最小化方法。

    下面的代码为鲍鱼定义了一个训练操作model_fn中计算的损失值为模型定义损失中传递给函数的学习率参数个数和梯度下降优化器。为global_step,方便函数特遣部队训练get_global_step美元负责生成一个整型变量:

    优化器< -特遣部队火车GradientDescentOptimizerlearning_rate =参数个数learning_rate)train_op < -优化器最小化损失=损失,global_step =特遣部队火车get_global_step())

    完整的鲍鱼model_fn

    这是最终的,完整的model_fn鲍鱼年龄预测器。下面的代码配置神经网络;定义损失和训练行动;并返回一个estimator_spec对象包含模式predictions_dict损失,train_op

    model_fn < -函数(特性,标签,模式,参数,配置){#连接第一个隐藏层到输入层first_hidden_layer < -特遣部队密集的(功能,10 l,激活=特遣部队神经网络relu)#使用relu连接第二个隐藏层到第一个隐藏层second_hidden_layer < -特遣部队密集的(first_hidden_layer 10 l,激活=特遣部队神经网络relu)#连接输出层到第二隐藏层(没有激活fn)output_layer < -特遣部队密集的(second_hidden_layer 1升)#重塑输出层为1-dim张量返回预测预测< -特遣部队重塑(output_layer列表-1 l))predictions_list < -列表年龄=预测)#使用均方误差计算损失损失< -特遣部队损失mean_squared_error(标签、预测)eval_metric_ops < -列表rmse =特遣部队指标root_mean_squared_error特遣部队(标签,特遣部队float64),预测))优化器< -特遣部队火车GradientDescentOptimizerlearning_rate =参数个数learning_rate)train_op < -优化器最小化损失=损失,global_step =特遣部队火车get_global_step())返回estimator_spec模式=模式,预测=predictions_list,损失=损失,train_op =train_op,eval_metric_ops =eval_metric_ops))model_params < -列表learning_rate =0.001模型< -估计量(model_fnparams =model_params)

    运行鲍鱼模型

    你已经实例化了一个估计量对鲍鱼的预测和定义其行为model_fn;剩下要做的就是训练、评估和预测。

    下面的代码将神经网络与训练数据拟合,并基于eval_metric_ops我们已经定义:

    火车(模型中,input_fn =train_input_fn,步骤=2评估(模型中,input_fn =test_input_fn,步骤=2